1、河南城建学院 《 人工智能 》实验报告 实验名称:__实验四 名称实现一个基于产生式系统的小型专家系统(动物识别) 成绩: 专业班级: 0814112 学号: 081411202 姓名: xxxxxxxxxxxx 实 验 日 期 : 2014 年 5 月 20 日 实验器材:VC6.0软件,多媒体计算机。 一、实验目的 掌握产生式系统的运行机制和基于规则推理的基本方法。通过一个实例
2、了解小型专家系统的结构、设计和实现过程,初步掌握专家系统的设计和实现方法。 二、实验要求 设计并实现一个某领域的小型专家系统(动物识别),该系统能对输入的询问回答分类或预测的结果,并根据推理过程回答“为什么”或“怎样得出该结论”的问题。 三、实验步骤 (1)定义变量,包括变量名和变量的值。 (2)建立规则库,其方法是: (a) 输入规则的条件:每条规则至少有一个条件和一个结论,选择变量名,输入条件(符号);选择变量值,按确定按钮就完成了一条条件的输入。重复操作,可输入多条条件; (b) 输入规则的结论:输入完规则的条件后,就可以输入规则的结论了,每条规则必须也只能有一个结论。选择
3、变量名,输入条件(符号),选择变量值,按确定按钮就完成了一个结论的输入。重复以上两步,完成整个规则库的建立。 (3)建立事实库(总数据库):建立过程同步骤2。重复操作,可输入多条事实。 该动物识别专家系统由15条规则组成,可以识别七种动物,在15条规则中,共出现 30个概念(也称作事实),共30个事实,每个事实给一个编号,从编号从1到30,在规则对象中我们不存储事实概念,只有该事实的编号,同样规则的结论也是事实概念的编号,事实与规则的数据以常量表示,其结构如下: char *feature[]={"有毛","产奶","有羽毛","会飞","会下蛋","吃肉","有犬齿","有爪","眼睛
4、盯前方","有蹄","反刍","黄褐色","有斑点","有黑色条纹","长脖","长腿","不会飞","会游泳","黑白两色","善飞","哺乳类","鸟类","肉食类","蹄类","企鹅","海燕","鸵鸟","斑马","长颈鹿","虎","金钱豹"}; 存放规则的结构体: typedef struct { int relation[5]; int name; }Rule; 存放产生式规则推理过程的数组: Rule rule[15]={ {{0,-1},20}, {{1,-1},20}, {{2,-1},21}, {{3,4,-1},21},
5、{{20,5,-1},22}, {{6,7,8,-1},22}, {{20,8,-1},23}, {{20,9,-1},23}, {{22,11,12,-1},30}, {{22,11,13,-1},29}, {{23,14,15,12,-1},28}, {{23,13,-1},27},//如果动物是蹄类(23),且有黑色条纹(13),则该动物对应事实数组的第27个“斑马” {{21,14,15,16,-1},26}, {{21,19,-1},25},//如果动物是鸟类(21),且是肉食类(19),则该动物对应事实数组的第25个“海燕”。 {{21,17
6、18,16,-1},24}
};
程序用编号序列的方式表达了产生式规则,如资料中规则14,如果动物是鸟,且是肉食类,则该动物对应事实数组的第二十五个“海燕”。如资料中规则12,如果动物是蹄类,且有黑色条纹,则该动物对应事实数组的第二十七个“斑马”。
(4)按“开始”或“单步”按钮即可。
此外,利用实例演示,可以运行系统默认的产生式系统,并且可以进行正反向推理。其他的可参见其帮助文件。
三、 源代码
#include
7、","斑马","长颈鹿","虎","金钱豹"}; char *feature[]={"有毛","产奶","有羽毛","会飞","会下蛋","吃肉","有犬齿","有爪","眼睛盯前方","有蹄","反刍","黄褐色","有斑点", //0 1 2 3 4 5 6 7 8 9 10 11 12 "有黑色条纹","长脖","长腿","不会飞","会游泳","黑白两色","善飞","哺乳类"
8、"鸟类","肉食类","蹄类", //13 14 15 16 17 18 19 20 21 22 23 "企鹅","海燕","鸵鸟","斑马","长颈鹿","虎","金钱豹"}; //24 25 26 27 28 29 30 typedef struct //存放规则的结构体 { int relation[5]; in
9、t name; }Rule; Rule rule[15]={ {{0,-1},20}, {{1,-1},20}, {{2,-1},21}, {{3,4,-1},21}, {{20,5,-1},22}, {{6,7,8,-1},22}, {{20,8,-1},23}, {{20,9,-1},23}, {{22,11,12,-1},30}, {{22,11,13,-1},29}, {{23,14,15,12,-1},28}, {{23,13,-1},27}, {{21,14,15,16,-1},26}, {{21,19,-1},25},
10、
{{21,17,18,16,-1},24}};
int flag[23]={0};//标记各个特征是否选择
int IsAnimal(int a);
int inference();
void input();
void menu();
void menu()
{
int i=0;
for(i=0;i<24;i++)
{
if(i%4==0&&i!=0)
{
cout< 11、
for(int i=0;i<24;i++)
{
flag[i]=0;
}
while(ti!=-1)
{
cout<<"\n输入选择(-1结束):";
cin>> ti;
if(ti>=0&&ti<=23)
flag[ti]=1;
else if(ti!=-1)
{
cout<<"输入错误!请输入0~23之间的数字!"<< endl; //notanimal=25
cin.clear();//清除流错误错误标
cin.sync(); ////////////清空输入缓冲区
}
} 12、
}
int IsAnimal(int a)
{
if(a>=24&&a<=30)
return 1;
else
return 0;
}
int inference()//正向推理
{
int ti;
int i,j;
int tres;
cout< 13、ti!=-1) //-1作为结束
{
if(flag[ti]==0)
break;
j++;
ti=rule[i].relation[j];
}
if(ti==-1)//ti==-1代表规则满足
{
tres=rule[i].name;
flag[tres]=1;
printf("运用了规则%d : 14、 ",i);
j=0;
while(rule[i].relation[j]!=-1)
{
cout< 15、i==15)
{
cout<<"没有这种动物";
}
return -1;
}
void main()
{
char q;
while(q!='n')
{
menu();
input();
inference();
cout<<"\n继续?(Y/N)"< 16、13),则结果:该动物对应事实数组的第27个“斑马”。使用了推理规则12,即:{{23,13,-1},27},使用规则运行结果如图1所示:
图1
2、若已知:动物是鸟类(21),且是肉食类(19),则结果该动物对应事实数组的第25个“海燕”。使用了推理规则14,即:{{21,19,-1},25},使用规则运行结果如图2所示:
图2
五、 心得体会
本实验环境主要提供一个能够实现模拟产生式专家系统的验证、设计和开发的可视化操作平台。使用户既能用本系统提供的范例进行演示或验证性实验,也能够用它来设计并调试自己的实验模型 。
通过这次实验,我对产生式系统有了更深刻的认识。产生式系统是由一组规则组成的、能够协同作用的推理系统。其模型是设计各种智能专家系统的基础 .产生式系统主要由规则库、综合数据库和推理机三大部分组成。产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。专家系统的规则是由专家定的,在该实验中,是由本人制定的。
教师评语:
教师签名:
7






