人工智能实验报告 产生式系统推理 动物识别
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i++; } rulenum=i; fclose(fp); } 3. 规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现 的? 程序中的正向与逆向搜索分别是在 void main() 中调用 forwardFinger() 和 backFinger() 来 实现的。 正向搜索 从下向上的推理。由于建立规则库时的内在要求,即子规则必在父规则前,故进行正向 推理的时候只要将规则库从前到后扫一遍看是否能由规则推出相应结果即可。 如果能匹配推 出结果则看该结果是否为动物,如果已经推出动物则推理成功。否则更新事实库,匹配下一 个规则。代码如下: void forwardFinger() { int flag;//1:工作已完成 0:还未完成 int flagFit; int flagCNew;//记录本次循环有没有推出新事实
int fitPart;//1:有部分符合条件 int i,j,k; flag=0; flagCNew=1; while(!flag&&flagCNew==1) { flagCNew=0; for(j=0;j<rulenum&&rule[j].used!=1&&flag==0;j++)//一条规则 { if(rule[j].codNum<=inpCod.curnum)//事实数不小于当前规则所要求的 条件数 { flagFit=1; for(i=0;i<rule[j].codNum&&flagFit==1;i++) { fitPart=0; for(k=0;k<inpCod.curnum;k++) { if(rule[j].cod[i]==inpCod.cod[k].xuh) { fitPart=1; } } flagFit=fitPart; } if(flagFit==1) { flagCNew=1; fitOneRule(j,&flag);//有事实匹配时, 就处理把结论加入事实 库等事情 flagFit=0; } } }// }//while if(flagCNew==0) { printf("条件不足,不能推出它是什么动物"); } } 逆向搜索 反向推理比正向推理要复杂一些。采用的算法是从事实库的动物开始从前往后进行匹 配,看是否能成功推出,如果都推不出能识别失败,若能推出其中一个则中止搜索,识别成
else { bDisplayResult(fitDegree,i,&flagFitAll); } } else { printf("它不是%s。\n",goal[i].valu); } if(flagFitAll==1) { flagExistAns=1; } }//for if(flagExistAns==0) { printf("综上所述:没有完全符合这些特征的动物。\n"); } }//backFinger()
人工智能第二次实验报告
产生式系统推理
班级: 一、实验目的
1. 理解并掌握产生式系统的基本原理; 2. 掌握产生式系统的组成部分,以及正向推理和逆向推理过程。
姓名:
学号:
二、实验要求
1. 结合课本内容, 以动物识别系统为例,实现小型产生式系统; 2. 要求: 正向推理中能根据输入的初始事实, 正确地识别所能识别的动物; 逆向推理中 能根据所给的动物给出动物的特征。
规则库 typedef struct { int rslt; int codNum;//记载前提的个数 int cod[10];//记载前提的序号 int used;//记载是否已匹配成功 }Nrule; Nrule rule[50]; void readRule() { FILE *fp; int i; int tempxuh,tempcodn; char ch; if((fp=fopen("rules.txt","r"))==NULL) { printf("cannot open data\n"); exit(0); } i=0; rule[i].codNum=0; while((ch=fgetc(fp))!=EOF) { if(i==14) i=i; tempcodn=0; while(ch!='\n'&&ch!=EOF) //每一条规则 { tempxuh=0; while(ch<='9'&&ch>='0') { tempxuh=tempxuh*10+ch-'0';
功。推某一个事实时,仍然是从该事实的前提出发,逐个匹配,若所有的前提满足,则该事 实满足。代码如下: void backFinger() { int i; bQueueNode markdCod[MAXNUM];//stat 字段用来存它的结论的序号 int flagFitAll; int markdCodNum; double fitDegree; int flagExistAns; flagFitAll=0; flagExistAns=0; for(i=0;i<goalnum&&flagFitAll==0;i++)//一种动物 { initBack(&fitDegree,&markdCodNum,i); while(bqueue.head!=bqueue.tail) { if(bqueue.head==9&&bqueue.tail==11) { bqueue.head=bqueue.head; } findCod(); recMarkdCod(markdCod,&markdCodNum); if(bqueue.bNode[bqueue.head].stat==0) { addNodeToQueue(); takeToClose(bqueue.bNode[bqueue.head].codXuh,bqueue.tail-1); } bqueue.head++; if(bqueue.head==bqueue.tail) { if(close.head!=close.tail) { takeTobqueue(close.head); } } } fitDegree=workFitDegree(markdCod,markdCodNum); if(fitDegree>1e-5) { if(StillCodNoUseAndContradict(i+codnum)) { printf("它不是%s。\n",goal[i].valu); }
ch=fgetc(fp); } rule[i].cod[tempcodn++]=tempxuh; tempxuh=0; if(ch=='-')//下一个是结论 { ch=fgetc(fp); ch=fgetc(fp); while(ch<='9'&&ch>='0') { tempxuh=tempxuh*10+ch-'0'; ch=fgetc(fp); } rule[i].rslt=tempxuh; }//if else if(ch=='*') { ch=fgetc(fp); } rule[i].codNum++; }
三、实验算法
1. 如何表示事实和特征的知识; 在本程序中,我将动物的特征写入 data.txt,将规则记入 rules.txt,将动物 种类记为 goal.txt。
通过函数 void readFiles() { readGoal(); readCod(); readRule(); }读入所有数据分别存放于 goal[],rule[],cod[]自定义数组中。 2. 指出综合数据库和规则库分别使用哪些函数实现的? 综合数据库(包括特征和目标) typedef struct { int xuh;//存放编号 char valu[50];//存放具体内容 }Node; Node goal[20]; Node cod[50];
四、实验结果
1. 要求有实验运行结果截图,以及必要的说明; (1)有若干选择动物特征的选择列表;
(2)输入特征后,询问使用者采用何种搜索方式(0:正向
1:逆向)
wk.baidu.com
(3)正向搜索成功找到目标后,程序显示该动物名称,否则“显示条件不足无法判 断” 。
(4)逆向搜索结果:
2. 对所实现的产生式系统进行性能分析。 在数据量小的情况下识别速度较快。但是我觉得这种识别用处不够广泛。所有的规 则必须人工输入不够灵活,不能适应突发状况(如白虎) 。
五、实验总结及体会
虽然还没有具体学习过产生式算法, 但是通过本次实践, 对正向推理反向推理的过程可 以说已经有了大概的了解喝一些自己的看法, 对代码的控制能力也有了一定的提高, 递归函 数的设计,流程的控制都得到了一定的强化。我觉得本次实验的算法还是比较简单的,关键 是数据结构的设计, 我运用了很多自定义的结构体想使程序显得简单一些, 但是效果并不好, 别人很难分清那些结构体,太多了。 。 。 。 。