动物专家系统.docx
- 文档编号:12769359
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:16
- 大小:104.81KB
动物专家系统.docx
《动物专家系统.docx》由会员分享,可在线阅读,更多相关《动物专家系统.docx(16页珍藏版)》请在冰豆网上搜索。
动物专家系统
动物分类专家系统设计与实现
班级:
计算机0352
姓名:
刘一飞
学号:
200320010220
一、专家系统简介:
专家系统是一个智能计算机程序系统,其内部含有大量的某个领域专家水平的知识与经验,能够利用人类专家的知识和解决问题的方法来处理该领域问题。
也就是说,专家系统是一个具有大量的专门知识与经验的程序系统,它应用人工智能技术和计算机技术,根据某领域一个或多个专家提供的知识和经验,进行推理和判断,模拟人类专家的决策过程,以便解决那些需要人类专家处理的复杂问题,简而言之,专家系统是一种模拟人类专家解决领域问题的计算机程序系统。
1.专家系统的特点
专家系统具有下列3个特点:
(1)启发性
专家系统能运用专家的知识与经验进行推理、判断和决策。
世界上的大部分工作和知识都是非数学性的,只有一小部分人类活动是以数学公式为核心的(约占8%)。
即使是化学和物理学科,大部分也是靠推理进行思考的;对于生物学、大部分医学和全部法律,情况也是这样。
企业管理的思考几乎全靠符号推理,而不是数值计算。
(2)透明性
专家系统能够解释本身的推理过程和回答用户提出的问题,以便让用户能够了解推理过程,提高对专家系统的信赖感。
例如,一个医疗诊断专家系统诊断某病人患有肺炎,而且必需用某种抗生素治疗,那么,这一专家系统将会向病人解释为什么他患有肺炎,而且必须用某种抗生素治疗,就像一位医疗专家对病人详细解释病情一样。
(3)灵活性
专家系统能不断地增长知识,修改原有知识,不断更新。
由于这一特点,使得专家系统具有十分广泛的应用领域。
2.专家系统的优点
近十多年来,专家系统获得迅速发展,应用领域越来越广,解决实际问题的能力越来越大,这是专家系统的优良性能以及对国民经济的重大作用决定的。
具体地说,包括下列几个方面:
(1)专家系统能够高效率、准确、周到、迅速和不知疲倦地进行工作。
(2)专家系统解决实际问题时不受周围环境的影响,也不可能遗漏忘记。
(3)可以使专家的专长不受时间和空间的限制,以便推广珍贵和稀缺的专家知识与经验。
(4)专家系统能促进各领域的发展,它使各领域专家的专业知识和经验得到总结和精炼,能够广泛有力地传播专家的知识、经验和能力。
(5)专家系统能汇集多领域专家的知识和经验以及他们协作解决重大问题的能力,它拥有更渊博的知识、更丰富的经验和更强的工作能力。
(6)军事专家系统的水平是一个国家国防现代化的重要标志之一。
(7)专家系统的研制和应用,具有巨大的经济效益和社会效益。
(8)研究专家系统能够促进整个科学技术的发展。
专家系统对人工智能的各个领域的发展起了很大的促进作用,并将对科技、经济、国防、教育、社会和人民生活产生极其深远的影响。
二、算法设计
本程序采用正向推理作为算法主体。
正向推理就是从初始事实数据出发,正向使用规则进行推理(即用规则前提与动态数据库中的事实匹配,或用动态数据库中的数据测试规则的前提条件,然后产生结论或执行动作),朝目标前进,其算法思想为:
1、将初始事实/数据置入动态数据库。
2、将动态数据库中的事实/数据,匹配/测试目标条件,若目标条件满足,则推理成功,结束。
3、用规则库中各规则的前提匹配动态数据库中的事实/数据,将匹配成功的规则组成待用规则集。
4、若待用规则集为空,则运行失败,退出。
5、将待用规则集中各规则的结论加入动态数据库,或者执行其动作,转2.
三、源程序:
#defineANIMAL_H
#defineTrue1
#defineFalse0
#defineDontKnow-1
#include
#include
#include
//事实集(概念集)
char*str[]={"",
"chew_cud"/*1*/,"hooves"/*2*/,"mammal"/*3*/,
"forward_eyes"/*4*/,"claws"/*5*/,"pointed_teeth"/*6*/,
"eat_meat"/*7*/,"lay_eggs"/*8*/,"fly"/*9*/,
"feathers"/*10*/,"ungulate"/*11*/,"carnivore"/*12*/,
"bird"/*13*/,"give_milk"/*14*/,"has_hair"/*15*/,
"fly_well"/*16*/,"black&while_color"/*17*/,"can_swim"/*18*/,
"long_legs"/*19*/,"long_neck"/*20*/,"black_stripes"/*21*/,
"dark_spots"/*22*/,"tawny_color"/*23*/,"albatross"/*24*/,
"penguin"/*25*/,"ostrich"/*26*/,"zebra"/*27*/,
"giraffe"/*28*/,"tiger"/*29*/,"cheetah"/*30*/,
"\0"};
//规则之前件(条件)集,注意与下面对应
intrulep[][6]={{22,23,12,3,0,0},{21,23,12,3,0,0},{22,19,20,11,0,0},
{21,11,0,0,0,0},{17,19,20,13,-9,0},{17,18,13,-9,0,0},
{16,13,0,0,0,0},{15,0,0,0,0,0},{14,0,0,0,0,0},
{10,0,0,0,0,0},{8,7,0,0,0,0},{7,0,0,0,0,0},
{4,5,6,0,0,0},{2,3,0,0,0,0},{1,3,0,0,0,0}};
//规则之后件(结论)集,注意与上面对应
intrulec[]={30,29,28,
27,26,25,
24,3,3,
13,13,12,
12,11,11};//前个是要识别的动物
//事实类
classfact{
private:
intNumber;//事实ID
charName[21];//事实名
intActive;//激活标志
intSucc;//事实断言:
真、假、不知道三种情况值
public:
fact*Next;//事实链表后继指针
/*
事实ID
事实名
*/
fact(intNum,char*L)
{
strcpy(Name,L);
Number=Num;
Active=False;//初始不激活
Succ=DontKnow;//初始断言不确定
Next=NULL;//初始后继为空
}
char*GetName()//获取事实名
{
char*L;
L=newchar[21];
strcpy(L,Name);
returnL;
}
intGetNumber(){returnNumber;}//获取事实ID
intGetAct(){returnActive;}//获取事实激活标志
intGetSucc(){returnSucc;}//获取事实断言值
//设置事实激活标志和断言值
voidPutAct(constintAct0,intSuc0)
{
Active=Act0;
Succ=Suc0;
}
};//endfact
fact*Fact;//事实链表
classlist{//前提(前提来源与事实集)链表类
private:
intNumber;//前提ID,即事实ID
public:
list*Next;//前提链表后继指针
/*
事实ID
*/
list(intNum)
{
Number=Num;
Next=NULL;
}
intGetNumber(){returnNumber;}//获取前提ID(也就是事实ID)
};//endlist
classrule{//规则类
char*Name;//规则名
list*Pre;//规则前件(前提、条件)链表头指针
intConc;//规则后件(结论)ID(也是事实ID)
public:
rule*Next;//规则链表后继指针
rule(char*N,intP[],intC);//规则类构造函数
~rule();//析构函数
intQuery();//推理机函数
voidGetName(){printf("%s%",Name);}//输出规则名
};
/*
规则名
规则前件数组
规则后件ID
*/
rule:
:
rule(char*N,intP[],intC)
{
inti;list*L;
Pre=NULL;//前提链头指针初始化
Next=NULL;//规则链后继指针初始化
Name=newchar[strlen(N)+1];
strcpy(Name,N);
i=0;
while(P[i]!
=0){//有前提情况下
L=newlist(P[i++]);//加入前提链
L->Next=Pre;//注意:
前插入
Pre=L;
}
Conc=C;//填入规则后件(结论)
}
/*
*/
rule:
:
~rule()
{
list*L;
while(Pre)
{
L=Pre->Next;
deletePre;
Pre=L;
}
deleteName;
}
/*
*/
intrule:
:
Query()
{
//inti;
charc;//保存用户输入按键符号
list*L;//临时前提链
fact*F;//临时事实链
L=Pre;//L指向前提链
F=Fact;
if(L==NULL)printf("\nError!
");//如果推理时,本规则前提链为空,出错,后面while循环也退出!
while(L!
=NULL)//前提链未处理完
{
F=Fact;//F指向事实链表
for(;;)//以当前前提,在事实链表中查询(根据ID)
{//因为前提为“-事实ID”,表示该事实不成立,所以取绝对值
if(abs(L->GetNumber())==F->GetNumber())break;
//一旦查询到,有这样的前提(不管其是否成立)则中止查询。
我们的知识库必须保证一定能查许到,否则deadloop
F=F->Next;//查询下一事实
}//退出循环时,F指向查询到的事实节点
if(L->GetNumber()>0)//如果前提为真
{
if((F->GetSucc())==True){//而且事实链表中的这个事实断言也为真
L=L->Next;//则本规则的当前前提在推理中满足
continue;//继续下一前提的判断
}
if((F->GetSucc())==False)//Sorry,该前提在事实链表中断言不成立
returnFalse;//该规则推理使用结束,直接返回
}
else//如果前提为假,表现为-ID
{
if((F->GetSucc())==True)//Sorry,该前提在事实链表中断言却为真
returnFalse;//该规则推理使用结束,直接返回
if((F->GetSucc())==False){//同上类似
L=L->Next;
continue;
}
}//endif-else
printf("%s(Y/N)",F->GetName());//向用户提问,这里简单以事实名为问题
c=getchar();//接受用户输入
flushall();
/*注意:
事实链表中节点的Succ域指:
该事实的用户断言或中间推出的断言*/
if((c=='Y')||(c=='y'))//回答“是”
{
if(L->GetNumber()>0)F->PutAct(1,True);//且当前规则中的当前前提要求为“真”,置激活和“真”断言
if(L->GetNumber()<0){//且若当前规则中的当前前提要求为“假”
F->PutAct(1,True);//置激活和用户的断言
returnFalse;//本规则推理结束,不成功;后面的前提不判断了!
}
}
else
{//分析同上
if(L->GetNumber()<0)F->PutAct(-1,False);
if(L->GetNumber()>0){
F->PutAct(-1,False);
returnFalse;
}
}
L=L->Next;//用户断言和当前规则的当前前提符合,则取当前规则的下一前提进行判断!
}//endwhile
//只要上述while循环正常退出,表明当前规则的所有前件都满足,下面要得出当前规则的推理结论了
F=Fact;
for(;;)
{
if(Conc==F->GetNumber())break;//在事实表中查找与当前规则得后件相同得事实(结论性)
F=F->Next;
}
if(Conc<24)//如果规则后件(结论)不是最终最终性得(即不是种要识别得动物)
{
F->PutAct(1,True);//那就是中间事实性结论,设置其激活和中间推理确证了的断言
returnFalse;//然后返回,本规则并不能结束整个推理
}
//当前规则之后件是最终结论,得出要识别的动物,返回真!
printf("\nThisannimalis%s",F->GetName());
returnTrue;
}
#endif
#include"animal.h"
intmain(intargc,char*argv[])
{
//list*List;
fact*F,*T;
rule*Rule,*R;
charch[8];
inti=1;
Fact=NULL;//事实链表初始为空
while(str[i][0]!
='\0'){//在事实链表中填入事实,注意:
前插入
F=newfact(i,str[i++]);
F->Next=Fact;
Fact=F;
}
F=Fact;
Fact=NULL;
while(F){//倒转上面前插入的事实链表。
invertedtheupperlink
T=F;
F=F->Next;
T->Next=Fact;
Fact=T;
}
i=0;
ch[0]='R';ch[1]='U';ch[2]='L';ch[3]='E';
ch[4]='_';ch[5]='a';ch[6]='\0';
Rule=NULL;//规则链表初始为空
for(i=0;i<15;i++)//填入规则
{
R=newrule(ch,rulep[i],rulec[i]);
R->Next=Rule;
Rule=R;
ch[5]++;
}
R=Rule;
for(;;)//开始询问用户。
Query
{
i=R->Query();
if(i==1)break;//如果返回“真”,则推理成功,并可以给出最后专家答案!
R=R->Next;
if(!
R)break;//所有规则都扫描完,R为空,则退出!
}
if(!
R)printf("\nIdon'tknow.");//所有规则都扫描完的退出,表明无法得到答案,
printf("\nPressandbartoexit.");
getchar();
return0;
}
四、实验结果:
五、心得体会
通过本次设计与实验,对专家系统有了深刻的理解与掌握。
摆脱了书面上单一的介绍,结合自己的实践过程,对推理机的实现、算法的选择、知识库的构建以及动态数据库的实现都有了比较好的掌握。
利用人工智能语言,编写的程序,具有专家系统所具有的各种有点。
并对语言的学习和理解提供了良好的契机。
巩固和提高了自己的编程能力,强化了编程思想,对数据结构、数据库等知识做到了很好的复习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动物 专家系统