人工智能与专家系统实验报告Word文档下载推荐.docx
- 文档编号:18827990
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:12
- 大小:92.02KB
人工智能与专家系统实验报告Word文档下载推荐.docx
《人工智能与专家系统实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《人工智能与专家系统实验报告Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
眼向前方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.规那么的格式的数据构造说明;
每条规那么都拥有前件与后件,建立规那么的数据构造时将前件与后件定义即可。
前件往往有一个或多个,而后件只有一个。
为了方便采用序号代替前后件,因此定义前件为数组intcondition[6];
定义后件intoute;
规那么的数据构造也随之敲定。
typedefstruct//存放规那么的构造体,由条件和结果构成皆用序号int型表示
{
intcondition[6];
//条件
intoute;
//结论
}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-free5.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.信天翁"
};
对应以上特征,设定整型数组存储求解过程中产生的各种信息,包括初始事实、推理得到的中间结论,以及最终结论。
intfacts[30]={0};
//记录被选择的事实,初始化都为0,被选择后赋值为1
对三种不同的信息进展区分的方法是利用序号区间进展区分。
0-19序号局部是存放原始信息,20-23存放的是中间结论,24-30存放了最后的结论。
2.推理机
推理局部主要使用了两个函数,分别是deduce函数和animal函数。
Deduce函数是用于根据原始信息,进展规那么的遍历,不断正向推理的函数;
animal函数是利用deduce函数推理得出的facts数组,即综合数据库,进展结果的判断,如果推理得出的结果唯一,那么返回推理成功的信息,输出最终的结果,否那么判定为推理失败。
for(i=0;
i<
15;
i++)//依次对15条规那么进展检测
{
j=0;
f=rule[i].condition[j];
while(f!
=-1)//推理是否满足第i条规那么
{
if(facts[f]==0)//第i条规那么有一个条件不满足,即为不满足该条规那么
break;
//从此次i规那么检验循环中跳出
j++;
f=rule[i].condition[j];
//取出i规那么中所需的条件序号
}
if(f==-1)//假设经过上一个循环有f==-1,那么代表满足第i条规那么
out1=rule[i].oute;
facts[out1]=1;
//将得出的结论参加事实
printf("
运用了规那么(%d):
"
i);
//并输出所用规那么,以便查看
j=0;
while(rule[i].condition[j]!
=-1)
{
cout<
<
animalBase[rule[i].condition[j]]<
;
//输出规那么所用先决条件
j++;
}
cout<
====>
animalBase[out1]<
endl;
//输出规那么所用结果
}
上述就是Deduce函数的主要容,取出每一条规那么的全部前件与事实库facts中进展比对,假设满足该规那么,那么该规那么的后件将会被扩大到facts数组中,同时也文字输出,以便使用者确认运行过程中使用的规那么。
遍历完15条规那么后,facts数组中就存放了推理得出的全部事实。
接下来就将facts数组传入animal函数,从综合数据库中遴选最终结论:
intanimal(intfacts[])//判断知识库中是否有符合描述的动物
inti=24,a=0,b=0;
//判断有多少结果满足特定动物区间
while(i<
=30)
if(facts[i]==1)
b=i;
a++;
i++;
if(a==1)returnb;
//恰巧有唯一动物满足给出条件时,返回该动物编号
elsereturn0;
//否那么返回0,记为推理失败
利用变量a累计最终结果的数目,如果a=0,说明知识库中没有满足描述的动物;
如果a≥2,说明有多个动物满足描述条件,仍然不能确定最终结果。
只有当a=1时,有唯一的动物符合描述,这时推理成功,返回该动物的编号并输出。
(六)实验结果
1.输入051112-1〔这里末尾输入-1代表完毕输入〕
即输入有毛发、吃肉、有黄褐色皮毛、有暗斑点这四个特点,让系统进展推理。
可得到唯一的结果:
豹
2.输入0231417-1即输入有毛发、有羽毛、会飞、长脖子、会游泳这五个特点交由程序进展推理。
由于不存在这样的动物,因此结果是:
3.输入2022111213-1即输入哺乳动物、食肉动物、有黄褐色皮毛、有暗斑点、有黑色条纹,根据这五个特点可以推导出两种动物:
豹和虎。
因此也无法推理出正确的结果。
(七)实验体会
通过本次实验我对于人工智能的产生式系统有了进一步的认识,对于正向推理、反向推理两种根本方式的原理和步骤都加深了理解。
尤其是通过设计正向推理机,深切体会到了专家系统是根据知识和推理来求解问题的,这种模式与普通程序完全不同,就像我平日里处理问题时,是收集信息,而后根据常识与知识得出自己的结论这样的模式,在写这次实验的过程中带来了很新奇的编程体验,让我受益匪浅。
(八)源代码
#include<
stdio.h>
iostream>
usingnamespacestd;
char*results[]={"
虎"
豹"
斑马"
长颈鹿"
企鹅"
鸵鸟"
信天翁"
//条件,末尾用-1表示完毕
Rulerule[15]={//定义15个规那么
{{0,-1},20},//有毛发→哺乳动物
{{1,-1},20},//有奶→哺乳动物
{{2,-1},21},//有羽毛→鸟
{{3,4,-1},21},//会飞&
{{5,-1},22},//吃肉→食肉动物
{{6,7,8,-1},22},//有锋利牙齿&
{{20,8,-1},23},//哺乳动物&
{{20,9,-1},23},//哺乳动物&
{{20,22,11,12,-1},25},//哺乳动物&
{{20,22,11,13,-1},24},//哺乳动物&
{{23,14,15,12,-1},27},//有蹄类动物&
{{23,13,-1},26},//有蹄类动物&
{{21,16,14,15,18,-1},29},//鸟&
{{21,16,17,18,-1},28},//鸟&
{{21,19,-1},24}};
voidlist();
//列出事实可供描述者选择
voidinput();
//描述者输入特征事实
intdeduce();
//推理机根据既得事实推理
intanimal(intfacts[]);
//判断知识库中是否有符合描述的动物
voidlist()//列出事实可供描述者选择
inti;
i<
=30;
i++)
facts[i]=0;
24;
if(i%4==0&
&
i!
=0)cout<
//每列出4个事实换行
printf("
%-15s"
animalBase[i]);
//列出前24个事实
}
voidinput()//描述者输入特征事实
intf=0;
//f用于接收描述者输入的特征编号
cout<
\n请输入动物特征编号〔-1完毕〕:
=-1)//当f==-1时意味着输入完毕
cin>
>
f;
if(f>
=0&
f<
=23)
facts[f]=1;
//接收描述者输入的事实,并在flag数组将其赋值为1
//其余未接收的事实仍为0
elseif(f!
error!
请输入0~23之间的数字!
//因为这里接收的事实仅限0-23区间
cin.clear();
cin.sync();
intdeduce()//推理机根据既得事实推理
intf;
inti,j;
intout1;
f=rule[i].condition[j];
RULE(%d):
——>
if(animal(facts)!
=0)//如果判断有唯一符合描述的动物,返回1
intb=animal(facts)-24;
cout<
最终推理出您所描述的动物为:
results[b];
else//否那么,输出“没有找到〞
推理失败!
没有完全符合条件的动物。
return-1;
intmain()
charq;
while(q!
='
n'
)
list();
input();
//描述者输入特征事实
deduce();
//推理机根据既得事实推理
\n是否重新推理:
(Y/N)"
q;
system("
cls"
);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 专家系统 实验 报告