暨南大学本科实验报告专用纸课程名称人工智能与专家系统成绩评定0实验项目名称动物识别系统设计指导教师0实验项目编号实验项目类型综合型0实验地点南校区学生姓名学号0学院信息科学技术学院系计算机科学系专业0实验时间2017年12月日--年月日温度℃湿度(一)实验目的通过建立动物识别产生式系统,理解并体会知识库与控制系统相互独立的智能产生式系统与一般程序的区别。(二)实验要求1.系统的设计和完成可以使用各种编程语言和实用工具,不采用人工智能语言和工具,这样能够使你更加了解专家系统。2.推荐使用语言:C、java、php、javascript、delphi。也可以使用其他语言。3如果使用数据库做后台,要求使用最简单的Access。4.系统可以使用图形界面,简单的也可以使用字符界面,不要求。(三)设计并完成知识库本课程设计的主旨是设计并实现具有15条规则能自动识别7种动物的产生式系统。知识库与控制系统相互独立,系统完成后除了能识别已有的7种动物外,按产生式知识表示方法向知识库中添加、修改新的知识后,系统能在不修改控制系统程序的情况下仍然能正确识别。1.综合数据库中数据结构说明;产生式通过满足前件,得到后件的结论或者执行后件的相应动作,即后件由前件来触发。同时,一个产生式生成的结论可以作为另一个产生式的前提或语言变量使用,进一步可构成产生式系统。暨南大学本科实验报告专用纸(附页)2因此在通过有关特征识别动物的特征中规定:识别动物的前件(即动物的特征):0:有毛发1:有奶2:有羽毛3:会飞4:会生蛋5:吃肉6:有锋利牙齿7:有爪8:眼向前方9:有蹄10:反刍11:黄褐色皮毛12:有暗斑点13:有黑色条纹14:长脖子15:长腿16:不会飞17:会游泳18:黑白二色19:善飞产生的中间结果(即动物的类别):20:哺乳动物21.鸟22.食肉动物23.有蹄类动物最终结论:24.虎25.豹26.斑马27.长颈鹿28.企鹅29.鸵鸟30.信天翁于是在综合数据库中,将设定int型数组facts[30],数组的编号对应着以上事实的编号,数组的值为1时,意味着对应编号的事实为真,否则为假。2.规则的格式的数据结构说明;每条规则都拥有前件与后件,建立规则的数据结构时将前件与后件定义即可。前件往往有一个或多个,而后件只有一个。为了方便采用序号代替前后件,因此定义前件为数组intcondition[6];定义后件intoutcome;规则的数据结构也随之敲定。typedefstruct//存放规则的结构体,由条件和结果构成皆用序号int型表示{intcondition[6];//条件intoutcome;//结论}Rule;将15条规则转化为符号:{{0},20},//有毛发→哺乳动物{{1},20},//有奶→哺乳动物{{2},21},//有羽毛→鸟{{3,4},21},//会飞&会生蛋→鸟{{5},22},//吃肉→食肉动物暨南大学本科实验报告专用纸(附页)3{{6,7,8},22},//有锋利牙齿&有爪&眼向前方→食肉动物{{20,8},23},//哺乳动物&有蹄→有蹄类动物{{20,9},23},//哺乳动物&反刍→有蹄类动物{{20,22,11,12},25},//哺乳动物&食肉动物&有黄褐色皮毛&有暗斑点→豹{{20,22,11,13},24},//哺乳动物&食肉动物&有黄褐色皮毛&有黑色条纹→虎{{23,14,15,12},27},//有蹄类动物&长脖子&长腿&有暗斑点→长颈鹿{{23,13},26},//有蹄类动物&有黑色条纹→斑马{{21,16,14,15,18,},29},//鸟&不会飞&长脖子&长腿&黑白两色→鸵鸟{{21,16,17,18,},28},//鸟&不会飞&会游泳&黑白两色→企鹅{{21,19},24}};//鸟&善飞→信天翁3.推理机(包括正向和反向推理)过程。在上述规则的基础上,可以利用推理机对给出条件进行推理:(1)正向推理:从下向上进行推理。在建立规则库时需要使子规则在父规则前。在进行正向推理是只要将规则库从前到后遍历下来看是否能由给定规则推出相应结果即可。通过判断每次与规则匹配得到的结果,如果结果不是动物,则更新事实库,将此次结果作为前件匹配下一个规则。若有多条规则可用,则使用冲突消解策略,选取一条规则执行。直到最终结果是动物时,视为推理成功。具体步骤如下:a.输入得到当前事实facts[],针对15条rules轮流筛查可用规则。b.将rules所需的前件提取出来与facts中的事实进行比对。若有多条规则可用时,冲突消解的方法是:选取规则表rules中顺序最前的规则。找到可用规则。扩充facts,重复b步骤。c.在无可扩充时,检查facts,若其中没有结果是动物,则推理失败;若其中推理出超过两个动物时,仍记为推理失败。在只有一个结果是暨南大学本科实验报告专用纸(附页)4动物时,则推理成功。(2)反向推理:反向推理的思路是从事实库的动物开始从前向后进行匹配,如果所有动物都不能推出为识别失败,若能推出其中一个,则识别成功。若有多条规则可用,则从中选出一条规则,将规则的前件添加到综合数据库。具体步骤如下:a.假设有动物m,若其已经在facts中,则假设成立搜索终止。b.若该假设动物不在facts中,则从rules中所有后件中含有该动物m的规则组成表。若该表为空,则询问用户fact的真假,若为真,则将fact添加到facts,搜索中止。c.若该表不为空,则逐个判断表内规则是否有规则的全部前件都包含在facts中,如果有,则证明假设可以直接被推出。识别成功。d.如果不能直接推出,则重新进行步骤b,直至满足步骤c。这时,我们认为假设可以被间接推出,识别成功。否则若没有可用规则,则识别失败。(四)开发环境1.工具:C-free5.02.语言:C++3.OS平台说明:win10(五)综合数据库与推理机1.综合数据库char*animalBase[]={0.有毛发,1.有奶,2.有羽毛,3.会飞,4.会生蛋,5.吃肉,6.有锋利牙齿,7.有爪,8.眼向前方,9.有蹄,10.反刍,11.有黄褐色皮毛,12.有暗斑点,13.有黑色条纹,14.长脖子,15.长腿,16.不会飞,17.会游泳,18.黑白二色,19.善飞,20.哺乳动物,21.鸟,22.食肉动物,23.有蹄类动物,24.虎,25.豹,26.斑马,27.长颈鹿,28.企鹅,29.鸵鸟,30.信天翁};对应以上特征,设定整型数组存储求解过程中产生的各种信息,包括初始暨南大学本科实验报告专用纸(附页)5事实、推理得到的中间结论,以及最终结论。intfacts[30]={0};//记录被选择的事实,初始化都为0,被选择后赋值为1对三种不同的信息进行区分的方法是利用序号区间进行区分。0-19序号部分是存放原始信息,20-23存放的是中间结论,24-30存放了最后的结论。2.推理机推理部分主要使用了两个函数,分别是deduce函数和animal函数。Deduce函数是用于根据原始信息,进行规则的遍历,不断正向推理的函数;animal函数是利用deduce函数推理得出的facts数组,即综合数据库,进行结果的判断,如果推理得出的结果唯一,则返回推理成功的信息,输出最终的结果,否则判定为推理失败。for(i=0;i15;i++)//依次对15条规则进行检测{j=0;f=rule[i].condition[j];while(f!=-1)//推理是否满足第i条规则{if(facts[f]==0)//第i条规则有一个条件不满足,即为不满足该条规则break;//从此次i规则检验循环中跳出j++;f=rule[i].condition[j];//取出i规则中所需的条件序号}if(f==-1)//若经过上一个循环有f==-1,则代表满足第i条规则{out1=rule[i].outcome;facts[out1]=1;//将得出的结论加入已知事实printf(运用了规则(%d):,i);//并输出所用规则,以便查看j=0;while(rule[i].condition[j]!=-1){coutanimalBase[rule[i].condition[j]];//输出规则所用先决条件j++;}cout====animalBase[out1]endl;//输出规则所用结果}}上述就是Deduce函数的主要内容,取出每一条规则的全部前件与事实库暨南大学本科实验报告专用纸(附页)6facts中进行比对,若满足该规则,则该规则的后件将会被扩充到facts数组中,同时也文字输出,以便使用者确认运行过程中使用的规则。遍历完15条规则后,facts数组中就存放了推理得出的全部事实。接下来就将facts数组传入animal函数,从综合数据库中遴选最终结论:intanimal(intfacts[])//判断知识库中是否有符合描述的动物{inti=24,a=0,b=0;//判断有多少结果满足特定动物区间while(i=30){if(facts[i]==1){b=i;a++;}i++;}if(a==1)returnb;//恰巧有唯一动物满足给出条件时,返回该动物编号elsereturn0;//否则返回0,记为推理失败利用变量a累计最终结果的数目,如果a=0,说明知识库中没有满足描述的动物;如果a≥2,说明有多个动物满足描述条件,仍然不能确定最终结果。只有当a=1时,有唯一的动物符合描述,这时推理成功,返回该动物的编号并输出。(六)实验结果1.输入051112-1(这里末尾输入-1代表结束输入)即输入有毛发、吃肉、有黄褐色皮毛、有暗斑点这四个特点,让系统进行推理。可得到唯一的结果:豹暨南大学本科实验报告专用纸(附页)72.输入0231417-1即输入有毛发、有羽毛、会飞、长脖子、会游泳这五个特点交由程序进行推理。由于不存在这样的动物,因此结果是:3.输入2022111213-1即输入哺乳动物、食肉动物、有黄褐色皮毛、有暗斑点、有黑色条纹,根据这五个特点可以推导出两种动物:豹和虎。因此也无法推理出正确的结果。(七)实验体会通过本次实验我对于人工智能的产生式系统有了进一步的认识,对于正向推理、反向推理两种基本方式的原理和步骤都加深了理解。尤其是通过设计正向推理机,深切体会到了专家系统是根据知识和推理来求解问题的,这种模式与普通程序完全不同,就像我平日里处理问题时,是收集信息,而后根据常识与知识得出自己的结论这样的模式,在写这次实验的过程中带来了很新奇的编程体验,让我受益匪浅。暨南大学本科实验报告专用纸(附页)8(八)源代码#includestdio.h#includeiostreamusingnamespacestd;char*results[]={虎,豹,斑马,长颈鹿,企鹅,鸵鸟,信天翁};char*animalBase[]={0.有毛发,1.有奶,2.有羽毛,3.会飞,4.会生蛋,5.吃肉,6.有锋利牙齿,7.有爪,8.眼向前方,9.有蹄,10.反刍,11.有黄褐色皮毛,12.有暗斑点,13.有黑色条纹,14.长脖子,15.长腿,16.不会飞,17.会游泳,18.黑白二色,19.善飞,20.哺乳动物,21.鸟,22.食肉动物,23.有蹄类动物,24.虎,25.豹,26.斑马,27.长颈鹿,28.企鹅,29.鸵鸟,30.信天翁};typedefstruct//存放规则的结构体,由条件和结果构成皆用序号int型表示{intcondition[6];//条件,末尾用-1表示结束intoutcome;//结论}Rule;Rulerule[15]={//定义15个规则{{0,-1},20},//有毛发→哺乳动物{{1,-1},20},//有奶→哺乳动物{{2,-1},21},//有羽毛→鸟{{3,4,-1},21},//会飞&会生蛋→鸟{{5,-1},22},//吃肉→食肉动物{{6,7,8,-1},22},//有锋利牙齿&有爪&眼向前方→食肉动物{{20,8,-1},23},//哺乳动物&有蹄