暨南大学本科实验报告专用纸
课程名称    人工智能与专家系统       成绩评定          0 
实验项目名称    动物识别系统设计    指导教师            0 
实验项目编号                     实验项目类型 综合型 0 
实验地点  南校区  学生姓名        学号                 0   
学院  信息科学技术学院    计算机科学系 专业           0
实验时间2017 12   日--       温度  ℃湿度 
(一)实验目的
通过建立动物识别产生式系统,解并体会知识库与控制系统相互独立的智能产生式系统与一般程序的区别。
(二)实验要求
1.系统的设计和完成可以使用各种编程语言和实用工具,不采用人工智能语言和工具,这样能够使你更加了解专家系统。
2.推荐使用语言:C、java、php、javascript、delphi。也可以使用其他语言。
3如果使用数据库做后台,要求使用最简单的Access。
4.系统可以使用图形界面,简单的也可以使用字符界面,不要求。
(三)设计并完成知识库
    本课程设计的主旨是设计并实现具有15条规则能自动识别7种动物的产生式系统。知识库与控制系统相互独立,系统完成后除了能识别已有的7种动物外,按产生式知识表示方法向知识库中添加、修改新的知识后,系统能在不修改控制系统程序的情况下仍然能正确识别。
1.综合数据库中数据结构说明;
产生式通过满足前件,得到后件的结论或者执行后件的相应动作,即后件由前件来触发。同时,一个产生式生成的结论可以作为另一个产生式的前提或语言变量使用,进一步可构成产
生式系统。
因此在通过有关特征识别动物的特征中规定:
printf函数的作用是向终端识别动物的前件(即动物的特征):
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.规则的格式的数据结构说明;
每条规则都拥有前件与后件,建立规则的数据结构时将前件与后件定义即可。前件往往有一个或多个,而后件只有一个。为了方便采用序号代替前后件,因此定义前件为数组int condition[6];定义后件int outcome;规则的数据结构也随之敲定。
typedef struct //存放规则的结构体,由条件和结果构成 皆用序号int型表示
{
    int condition[6];//条件
    int outcome;//结论
}Rule;
将15条规则转化为符号:
{{0},20},//有毛发→哺乳动物
      {{1},20},//有奶→哺乳动物
      {{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,16,17,18,},28},//鸟&不会飞&会游泳&黑白两→企鹅
      {{21,19},24}};//鸟&善飞→信天翁
3.推理机(包括正向和反向推理)过程。
在上述规则的基础上,可以利用推理机对给出条件进行推理:
(1)正向推理:
从下向上进行推理。在建立规则库时需要使子规则在父规则前。在进行正向推理是只要将规则库从前到后遍历下来看是否能由给定规则推出相应结果即可。通过判断每次与规则匹配得到的结果,如果结果不是动物,则更新事实库,将此次结果作为前件匹配下一个规则。若有
多条规则可用,则使用冲突消解策略,选取一条规则执行。直到最终结果是动物时,视为推理成功。
具体步骤如下:
a.输入得到当前事实facts[],针对15条rules轮流筛查可用规则。
b.将rules所需的前件提取出来与facts中的事实进行比对。若有多条规则可用时,冲突消解的方法是:选取规则表rules中顺序最前的规则。到可用规则。扩充facts,重复b步骤。
c.在无可扩充时,检查facts,若其中没有结果是动物,则推理失败;若其中推理出超过两个动物时,仍记为推理失败。在只有一个结果是动物时,则推理成功。
(2)反向推理:
反向推理的思路是从事实库的动物开始从前向后进行匹配,如果所有动物都不能推出为识别失败,若能推出其中一个,则识别成功。若有多条规则可用,则从中选出一条规则,将规则的前件添加到综合数据库。
具体步骤如下:
a.假设有动物m,若其已经在facts中,则假设成立搜索终止。
b.若该假设动物不在facts中,则从rules中所有后件中含有该动物m的规则组成表。若该表为空,则询问用户fact的真假,若为真,则将fact添加到facts,搜索中止。
c.若该表不为空,则逐个判断表内规则是否有规则的全部前件都包含在facts中,如果有,则证明假设可以直接被推出。识别成功。
d.如果不能直接推出,则重新进行步骤b,直至满足步骤c。这时,我们认为假设可以被间接推出,识别成功。否则若没有可用规则,则识别失败。
(四)开发环境
1.工具:C-free 5.0
2.语言: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.信天翁" };
对应以上特征,设定整型数组存储求解过程中产生的各种信息,包括初始事实、推理得到的中间结论,以及最终结论。
int facts[30] = { 0 };//记录被选择的事实,初始化都为0,被选择后赋值为1
对三种不同的信息进行区分的方法是利用序号区间进行区分。0-19序号部分是存放原始信息,20-23存放的是中间结论,24-30存放了最后的结论。
2.推理机
  推理部分主要使用了两个函数,分别是deduce函数和animal函数。
  Deduce函数是用于根据原始信息,进行规则的遍历,不断正向推理的函数;animal函数是利用deduce函数推理得出的facts数组,即综合数据库,进行结果的判断,如果推理得出的结果唯一,则返回推理成功的信息,输出最终的结果,否则判定为推理失败。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。