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