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