您好,欢迎访问三七文档
人工智能实验报告--基于产生式规则的机器推理专业:计算机科学与技术班级:1320701学号:201320070115学生姓名:许志捷指导教师:钟国韵一实验目的:(1)熟练了解、掌握机器推理产生式规则的定义及使用;(2)熟练掌握基于产生式规则的推理模式;(3)了解并熟悉产生式系统的整个结构比如:动态数据库、产生式规则库、推理机等;(4)熟练掌握正向反向推理的步骤及思想。二实验基础知识:产生式系统:包括产生式规则库、推理机、动态数据库三部分;(1)动态数据库:它是产生式系统的数据结构中心,是一个动态数据结构,用来存放初始事实数据、中间结果和最后结果;(2)产生式规则库:由领域规则组成,在机器中以某种数据结构进行组织,每条规则都有一定条件,若动态数据库中内容满足这些条件可调用这条规则;(3)推理机:控制执行机构,负责产生式规则的前提条件测试或匹配、规则的调度和选取、规则体的解释和执行。三产生式推理的运行:1正向推理及其主要算法:从初始实时数据出发,正向使用规则进行推理,朝目标方向前进。(1)将初始事实/数据置入动态数据库。(2)用动态数据库中的事实匹配目标条件,若目标条件满足,推理成功,结束。(3)用规则库中各规则的前提匹配动态数据库中的事实,将匹配成功的规则前提移除数据动态库,并将匹配成功的规则组成待用规则集。(4)若待用规则集为空,则运行失败,退出。(5)将待用规则集中各规则移出,并将结论加入动态数据库,或者执行其动作,转步(2)。2反向推理及其主要算法:从目标出发,反向使用规则进行推理,朝初始事实或数据方向前进。(1)将初始事实/数据置入动态数据库,将目标条件置入目标链。(2)若目标链为空,则推理成功,结束。(3)取出目标链中第一个目标,用动态数据库中的事实同其匹配,若匹配成功,转步(2)。(4)用规则集中的各规则的结论同该目标匹配,若匹配成功,则将第一个匹配成功且从未使用过的规则的前提作为新的目标,并取代原来的父目标加入目标链,转步(3)。(5)若该目标是初始目标,则推理失败,退出。(6)将该目标的父目标移回目标链,取代该目标及其兄弟目标,转步(3)。四实验主要步骤及代码:1正向推理:(1)建立规则库:在对话框类定义内添加规则库的数据结构定义及存放规则个数的变量,主要代码如下:ClassCMyDlg:publicCDialog{public:structRULE{CStringreason;CStringresult;BOOLt;}Rule[100];(2)建立初值规则库:rule[0].reason=_T(有奶);rule[0].result=_T(哺乳动物);rule[0].t=false;rule[1].reason=_T(哺乳动物,吃肉);rule[1].result=_T(食肉动物);rule[1].t=false;rule[2].reason=_T(哺乳动物,有蹄);rule[2].result=_T(有蹄动物);rule[2].t=false;rule[3].reason=_T(食肉动物,黄褐色,有黑色条纹);//有毛,吃肉,黄褐色,有黑色条纹rule[3].result=_T(老虎);rule[3].t=true;rule[4].reason=_T(食肉动物,黄褐色,有黑色斑点);rule[4].result=_T(金钱豹);rule[4].t=true;rule[5].reason=_T(有蹄动物,长腿,长脖子,黄褐色,有暗斑点);rule[5].result=_T(长颈鹿);rule[5].t=false;rule[6].reason=_T(有蹄动物,白色,有黑色条纹);rule[6].result=_T(斑马);rule[6].t=true;rule[7].reason=_T(鸟,不会飞,长腿,长脖子,黑白色);rule[7].result=_T(鸵鸟);rule[7].t=true;rule[8].reason=_T(鸟,不会飞,会游泳,黑白色);rule[8].result=_T(企鹅);rule[8].t=true;rule[9].reason=_T(鸟,善飞,不怕风浪);rule[9].result=_T(海燕);rule[9].t=true;rule[10].reason=_T(有毛);rule[10].result=_T(哺乳动物);rule[10].t=false;rule[11].reason=_T(有羽毛);rule[11].result=_T(鸟);rule[11].t=false;rule[12].reason=_T(会飞,生蛋);rule[12].result=_T(鸟);rule[12].t=false;rule[13].reason=_T(哺乳动物,有爪,有犬齿,目盯前方,吃肉);rule[13].result=_T(食肉动物);rule[13].t=false;num=14;CDC*pDC=GetDlgItem(IDC_RULE)-GetDC();for(inti=0;inum;i++){pDC-TextOut(5,i*20+5,rule[i].reason);pDC-TextOut(410,i*20+5,rule[i].result);}}(3)添加规则:rule[num].reason=m_r;rule[num].result=m_s;rule[num].t=m_t;CDC*pDC=GetDlgItem(IDC_RULE)-GetDC();pDC-TextOut(5,num*20+5,rule[num].reason);pDC-TextOut(410,num*20+5,rule[num].result);num++;MessageBox(成功添加!);}我自己建立的规则库的界面示意图如下:(4)字符串匹配函数设计:BOOLcom(CStringstr1[],intn,CStringstr2){chars1[50],*s2;CStringstr[100];strcpy(s1,str2);s2=strtok(s1,,);intm=0;while(s2!=NULL){str[m++].Format(%s,s2);s2=strtok(NULL,,);}intt=0;for(intj=0;jm;j++){for(inti=0;in;i++)if(str1[i]==str[j]){t=1;break;}if(t==0)return(false);t=0;}return(true);}(5)正向推理程序设计:CDC*pDC=GetDlgItem(IDC_RESULT)-GetDC();if(rule[0].reason==){MessageBox(没有规则库!);return;}CStringdb[50];RULEwait[50];CStringstr;chars1[50],*s2;intn=0;strcpy(s1,m_f);s2=strtok(s1,,);while(s2!=NULL){db[n++].Format(%s,s2);s2=strtok(NULL,,);}intk=0,t=1;BOOLbz[100]={100*0};while(t){for(inti=0;inum;i++)if(com(db,n,rule[i].reason)&&rule[i].t){pDC-TextOut(10,15,推理结果:);pDC-TextOut(100,15,rule[i].result);t=0;}for(i=0;inum;i++)if(com(db,n,rule[i].reason)&&!bz[i]){wait[k].reason=rule[i].reason;wait[k++].result=rule[i].result;bz[i]=1;}if(k==0){pDC-TextOut(10,10,推理失败!);t=0;}for(i=0;ik;i++)db[i+n]=wait[i].result;n+=k;k=0;}}运行程序后的正向推理结果图如下:2反向推理:(1)动态数据库与目标链的定义:CStringdb[50];RULEgoal[50];CStringg[50];(2)事实(条件)与目标的输入;(3)反向推理程序设计:CDC*pDC=GetDlgItem(IDC_RESULT)-GetDC();if(rule[0].reason==){MessageBox(没有规则库!);return;}CStringdb[50];RULEgoal[50];CStringstr,g[50];chars1[50],*s2;intn=0,t=1;strcpy(s1,m_f);s2=strtok(s1,,);while(s2!=NULL){db[n++].Format(%s,s2);s2=strtok(NULL,,);}intk=-1,k1=-1;goal[++k].reason=m_g;goal[k].result=m_g;g[++k1]=m_g;while(t){if(k==-1){pDC-TextOut(10,15,推理结果:);pDC-TextOut(100,15,m_g);t=0;}for(inti=0;in;i++)if(goal[k].reason==db[i])break;if(in){k--;continue;}for(i=0;inum;i++)if(rule[i].result==goal[k].reason){for(intj=0;jk1;j++)if(g[j]==rule[i].reason&&g[j]!=m_g)break;if(j==k1){g[++k1]=rule[i].reason;strcpy(s1,rule[i].reason);s2=strtok(s1,,);k--;while(s2!=NULL){str.Format(%s,s2);goal[++k].reason=str;goal[k].result=rule[i].result;s2=strtok(NULL,,);}}elsecontinue;break;}if(i==num)if(goal[k].reason==m_g){pDC-TextOut(10,10,推理失败!);t=0;}else{str=goal[k].result;for(i=k;i=0;i--)if(goal[k].result!=str)break;k=i+1;goal[k].reason=str;}}}运行程序后的正向推理结果图如下:五实验总结:本次实验基本实现了书中要求的功能,在实际上机操作过程中我遇到了一些小麻烦,比如运行不顺畅,没有注意中英文切换造成无法获取结果等情况出现,希望自己以后更加细致小心,总结经验。
本文标题:产生式推理
链接地址:https://www.777doc.com/doc-4346981 .html