人工智能 课程设计报告 课设报告.docx
《人工智能 课程设计报告 课设报告.docx》由会员分享,可在线阅读,更多相关《人工智能 课程设计报告 课设报告.docx(29页珍藏版)》请在冰豆网上搜索。
人工智能课程设计报告课设报告
学生实验报告
实验课名称:
人工智能
实验项目名称:
基于回溯推理的小型专家系统
题目:
一个关于植物分类的小型专家系统
专业名称:
计算机科学与技术
班级:
24020704
学号:
2402070427
学生姓名:
杨孟拓
教师姓名:
慕晨
2010年10月27日
一、实验名称:
一个关于植物分类的小型专家系统
二、实验目的与要求:
1、确定推理方法(正向还是反向),并根据问题设计实现一个简单的不通用推理机(匹配、冲突消解)
2、规则库要求至少包含15条规则
3、初始事实可以任意给定,输入初始事实后能够得到推理结果
4、设计人机界面,解释模块提供查询规则的功能
5、可以不考虑知识库管理模块
6、提交实验报告
7、报告中要有推理树
三、实验内容:
本次实验将做一个关于植物分类的小型专家系统,在植物分类系统中,要区分各种植物,可以对每种植物构造一条识别规则,其中规则右部为识别出的植物名,左部为该植物的特征。
本次实验设计了一个简单的不通用推理机。
推理机给出的推理结果是“苹果”。
系统结构:
知识库,推理机,动态数据库,人机界面,解释模块,知识库管理模块。
专家系统结构图
四、程序设计思想
本次实验采用的推理方法为正向推理,正向推理是从已知事实出发,通过规则库求的结论。
这种推理方式是正向使用规则,即问题的初始状态作为初始数据库,仅当数据库中的事实满足某条规则的前提时,该规则才能被使用。
正向推理的推理基础是逻辑演绎的推理链。
从一组事实出发,使用一组规则,来证明目标的成立。
正向推理的步骤
步1将初始事实置入动态数据库;
步2用动态数据库中的事实,匹配目标条件,若目标条件满足,则推理成功,结束。
步3用规则库中各规则的前件匹配动态数据库中的事实,将匹配成功的规则组成冲突集;
步4若冲突集为空,则运行失败,退出。
步5对冲突集做冲突消解,对选择执行的各规则,将其结论加入动态数据库,或执行其动作,转步2。
正向推理的流程图
五、程序实现过程
初始事实:
它的果肉为乳黄色
它的果实里无石细胞
它的果实为梨果
它的果实无毛
它的花托呈杯形
它种子的胚有两个子叶
规则:
R1:
if它种子的胚有两个子叶∨它的叶脉为网状then它是双子叶植物R2:
if它种子的胚只有一个子叶then它是单子叶植物
R3:
if它的果肉为白色then它是梨
R4:
if它的叶脉平行then它是单子叶植物
R5:
if它是双子叶植物∧它的花托呈杯形then它是蔷薇科植物
R6:
if它的花托呈圆柱形∧它的花瓣有5枚then它是蔷薇科植物
R7:
if它是双子叶植物∧它的花托呈圆柱形then它是蔷薇科植物
R8:
if它是蔷薇科植物∧它的果实为核果then它是李亚科植物
R9:
if它是蔷薇科植物∧它的果实为梨果then它是苹果亚科植物
R10:
if它是李亚科植物∧它的果实有毛then它是桃
R11:
if它是李亚科植物∧它的果实无毛then它是李
R12:
if它的果实为扁圆形∧它的果实外有纵沟then它是桃
R13:
if它是苹果亚科植物∧它的果实里无石细胞then它是苹果
R14:
if它是苹果亚科植物∧它的果实里有石细胞then它是梨
R15:
if它的果肉为乳黄色∧它的果肉质脆then它是苹果
推理过程:
初始事实写入动态数据库
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶}
第一次循环
用动态数据库的事实匹配目标条件,目标条件不成立
用规则库中的规则逐一与数据库匹配
R1:
if它种子的胚有两个子叶∨它的叶脉为网the它是双子叶植物
“双子叶胚”匹配成功,加入冲突集
R2:
if它种子的胚只有一个子叶then它是单子叶植物
匹配失败,该条规则放弃
R3:
if它的果肉为白色then它是梨
匹配失败,该条规则放弃
R4:
if它的叶脉平行then它是单子叶植物
匹配无结果,该条规则加入待测试规则集
R5:
if它是双子叶植物∧它的花托呈杯形then它是蔷薇科植物
“双子叶植物”目前的动态数据库无法匹配,匹配无结果,该条规则加入待测试规则集
R6:
if它的花托呈圆柱形∧它的花瓣有5枚then它是蔷薇科植物
匹配失败,该条规则放弃
R7:
if它是双子叶植物∧它的花托呈圆柱形then它是蔷薇科植物
匹配失败,该条规则放弃
R8:
if它是蔷薇科植物∧它的果实为核果then它是李亚科植物
“果实为核果”匹配失败,该条规则放弃
R9:
if它是蔷薇科植物∧它的果实为梨果then它是苹果亚科植物
“蔷薇科植物”目前的动态数据库无法匹配,匹配无结果,该条规则加入待测试规则集
R10:
if它是李亚科植物∧它的果实有毛then它是桃
“果实有毛”匹配失败,该条规则放弃
R11:
if它是李亚科植物∧它的果实无毛then它是李
“李亚科植物”目前的动态数据库无法匹配,匹配无结果,该条规则加入待测试规则集
R12:
if它的果实为扁圆形∧它的果实外有纵沟then它是桃
“果实为扁圆形”和“果实外有从纵沟”目前的动态数据库无法匹配,匹配无结果,该条规则加入待测试规则集
R13:
if它是苹果亚科植物∧它的果实里无石细胞then它是苹果
“苹果亚科植物”目前的动态数据库无法匹配,匹配无结果,该条规则加入待测试规则集
R14:
if它是苹果亚科植物∧它的果实里有石细胞then它是梨
“果实有石细胞”匹配失败,该条规则放弃
R15:
if它的果肉为乳黄色∧它的果肉质脆then它是苹果
“果肉质脆”目前的动态数据库无法匹配,匹配无结果,该条规则加入待测试规则集
冲突消解
冲突集{R1}无冲突,则将后件加入动态数据库
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶}
第二次循环
用动态数据库的事实匹配目标条件,目标条件不成立
用待测试规则库中的规则与数据库匹配
{R4,R5,R9,R11,R12,R13,R15}
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶}
R5:
if它是双子叶植物∧它的花托呈杯形then它是蔷薇科植物
匹配成功,加入冲突集
R4、R9、R11、R12、R13、R15:
匹配无结果,新待测试规则集{R4、R9、R11、R12、R13、R15}
冲突消解
冲突集{R5}无冲突,则将后件加入动态数据库
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶,蔷薇科}
第三次循环
用动态数据库的事实匹配目标条件,目标条件不成立
用待测试规则库中的规则与数据库匹配
{R4,R9,R11,R12,R13,R15}
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶,蔷薇科}
R9:
if它是蔷薇科植物∧它的果实为梨果then它是苹果亚科植物
匹配成功,加入冲突集
R4、R11、R12、R13、R15:
匹配无结果,新待测试规则集{R4、R11、R12、R13、R15}
冲突消解
冲突集{R9}无冲突,则将后件加入动态数据库
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶,蔷薇科,苹果亚科}
第四次循环
用动态数据库的事实匹配目标条件,目标条件不成立
用待测试规则库中的规则与数据库匹配
{R4、R11、R12、R13、R15}
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶,蔷薇科,苹果亚科}
R13:
if它是苹果亚科植物∧它的果实里无石细胞then它是苹果
匹配成功,加入冲突集
R4、R11、R12、R15:
匹配无结果,新待测试规则集{R4、R11、R12、R15}
冲突消解
冲突集{R13}无冲突,则将后件加入动态数据库
{果肉为乳黄色,果实里无石细胞,果实为梨果,果实无毛,花托呈杯形,种子的胚有两个子叶,双子叶,蔷薇科,苹果亚科,苹果}
第五次循环
动态数据库的事实没有变化,推理结束,即结束循环
结果为苹果
推理树图
六、程序显示结果
七、体会与总结
通过这次实验,使我更加深了对产生式系统的推理方式(正向推理)的理解。
正向推理是从已知事实出发,通过规则库求的结论。
这种推理方式是正向使用规则,即问题的初始状态作为初始数据库,仅当数据库中的事实满足某条规则的前提时,该规则才能被使用。
正向推理的推理基础是逻辑演绎的推理链。
从一组事实出发,使用一组规则,来证明目标的成立。
这次实验需要编程,我使用的语言是VC++,编写的程序有些麻烦,人机界面也不算太友好,但是这是自己慢慢敲出来的,以后会慢慢改进,争取使自己的编程能力更进一步。
通过这次实验,我相信,只要自己在每一次实践中都能仔细思考,其实都不会很难,关键在于自己能不能认真思考,能不能亲自动手去做;其次还要多操作,只有多操作才能从中发现问题,才能及时向老师和同学请教,解决问题,从而更好的掌握书本中知识。
我会更加努力。
附录(部分代码):
/*比较两个字符串*/
boolequals(chara[255],charb[255])
{
inti;
if(strlen(a)==strlen(b))
{
for(i=0;i<(int)strlen(a);i++)
{
if(a[i]!
=b[i])
returnfalse;
}
returntrue;
}
return0;
}
/*显示事实*/
voidshowfact()
{
intn;
n=sizeof(fact)/4;
cout<<"事实:
{";
for(inti=0;i{
cout<}
cout<<"}"<}
/*显示规则*/
voidshowrule()
{
intm;
m=sizeof(rule)/4;
cout<<"规则库中的规则:
"<for(intk=0;k{
cout<<"{"<}
}
/*第一次单条件匹配*/
voidone_match()
{
charm[255];
charn[255];
charb[255];
cout<<"输入模糊条件m(前四个字符):
";
cin>>m;
cout<<"输入条件n:
";
cin>>n;
intk;
k=sizeof(fact)/4;
intsuccessCount=0;
charc1[255],c2[255],c3[255],c4[255];
memcpy(c1,fact2[0],strlen(fact2[0])+1);
memcpy(c2,fact2[1],strlen(fact2[1])+1);
memcpy(c3,fact2[2],strlen(fact2[2])+1);
memcpy(c4,fact2[3],strlen(fact2[3])+1);
if((equals(m,c1)==1)||(equals(m,c2)==1)||(equals(m,c3)==1)||(equals(m,c4)==1))
{
for(intj=0;j{
memcpy(b,fact[j],strlen(fact[j])+1);
if(equals(n,b)==1)
{
++successCount;
}
}
if(successCount==1)
{
cout<<"匹配成功"<}
else
cout<<"匹配失败,该条规则放弃"<}
else
cout<<"匹配无结果,该条规则加入待测试规则集"<}
/*第一次双条件(关系为或)匹配*/
voidtwo_or_match()
{
charm[255];
charn[255];
charb[255];
cout<<"输入第一条件m:
";
cin>>m;
cout<<"OR";
cout<<"输入第二条件n:
";
cin>>n;
intk;
k=sizeof(fact)/4;
intsuccessCount=0;
for(intj=0;j{
memcpy(b,fact[j],strlen(fact[j])+1);
if(equals(m,b)==1)
{
++successCount;
}
if(equals(n,b)==1)
{
++successCount;
}
}
if((successCount==1)||(successCount==2))
{
cout<<"匹配成功,加入冲突集"<}
else
cout<<"匹配无结果,该条规则加入待测试规则集"<}
/*第一次双条件(关系为与)匹配1(模糊条件不同)*/
voidtwo_and_match1()
{
charm[255];
charn[255];
chara[255];
charb[255];
charc[255];
cout<<"输入模糊条件m:
";
cin>>m;
cout<<"输入模糊条件n:
";
cin>>n;
cout<<"输入第一条件a:
";
cin>>a;
cout<<"AND";
cout<<"输入第二条件b:
";
cin>>b;
intk;
k=sizeof(fact)/4;
intsuccessCount=0;
charc1[255],c2[255],c3[255],c4[255];
memcpy(c1,fact2[0],strlen(fact2[0])+1);
memcpy(c2,fact2[1],strlen(fact2[1])+1);
memcpy(c3,fact2[2],strlen(fact2[2])+1);
memcpy(c4,fact2[3],strlen(fact2[3])+1);
if(((equals(m,c1)==1)||(equals(m,c2)==1)||(equals(m,c3)==1)||(equals(m,c4)==1))||((equals(n,c1)==1)||(equals(n,c2)==1)||(equals(n,c3)==1)||(equals(n,c4)==1)))
{
for(intj=0;j{
memcpy(c,fact[j],strlen(fact[j])+1);
if(equals(a,c)==1)
{
++successCount;
}
if(equals(b,c)==1)
{
++successCount;
}
}
if(successCount==1)
cout<<"匹配无结果,该条规则加入待测试规则集"<else
cout<<"匹配失败,该条规则放弃"<}
else
cout<<"匹配无结果,该条规则加入待测试规则集"<}
/*第一次双条件(关系为与)匹配2(模糊条件相同)*/
voidtwo_and_match2()
{
charm[255];
charn[255];
chara[255];
charb[255];
charc[255];
cout<<"输入模糊条件m:
";
cin>>m;
cout<<"输入模糊条件n:
";
cin>>n;
cout<<"输入第一条件a:
";
cin>>a;
cout<<"AND";
cout<<"输入第二条件b:
";
cin>>b;
intk;
k=sizeof(fact)/4;
intsuccessCount=0;
charc1[255],c2[255],c3[255],c4[255];
memcpy(c1,fact2[0],strlen(fact2[0])+1);
memcpy(c2,fact2[1],strlen(fact2[1])+1);
memcpy(c3,fact2[2],strlen(fact2[2])+1);
memcpy(c4,fact2[3],strlen(fact2[3])+1);
if(((equals(m,c1)==1)||(equals(m,c2)==1)||(equals(m,c3)==1)||(equals(m,c4)==1))&&((equals(n,c1)==1)||(equals(n,c2)==1)||(equals(n,c3)==1)||(equals(n,c4)==1)))
{
for(intj=0;j{
memcpy(c,fact[j],strlen(fact[j])+1);
if(equals(a,c)==1)
{
++successCount;
}
if(equals(b,c)==1)
{
++successCount;
}
}
if((successCount==0)||(successCount==1))
cout<<"匹配无结果,该条规则加入待测试规则集"<else
cout<<"匹配失败,该条规则放弃"<}
}
/*添加新的规则集*/
voidaddrule()
{
intn=0;
cout<<"规则库中的规则:
"<cin>>n;
while(n<15)
{
cout<<"{"<cin>>n;
}
cout<<"*********新的规则集添加完成*********"<}
/*添加新的事实*/
voidaddfact()
{
intm,n,k,j;
chara[255];
charb[255];
k=sizeof(fact)/4;
cout<cout<<"冲突集无冲突,则将后件加入动态数据库"<cout<<"请输入下标n:
";
cin>>n;
cout<<"输入待添加的事实:
";
cin>>a;
fact1[n]=newchar[strlen(a)+1];
memcpy(fact1[n],a,strlen(a)+1);
cout<<"事实:
{";
for(inti=0;i{
cout<}
cout<<"}"<j=sizeof(fact2)/4;
cout<cout<<"请输入下标m:
";
cin>>m;
cout<<"模糊条件:
";
cin>>b;
fact3[m]=newchar[strlen(b)+1];
memcpy(fact3[m],b,strlen(b)+1);
}
/*添加冲突集*/
voidaddconf()
{
intn;
cout<<"请输入下标n:
";
cin>>n;
chara[255];
cout<<"输入待添加的事实:
";
cin>>a;
conf[n]=newchar[strlen(a)+1];
memcpy(conf[n],a,strlen(a)+1);
cout<<"冲突集:
{";
for(inti=0;i{
cout<}
cout<<"}"<}
评语
评阅人:
日期: