人工智能大作业实验Word文档格式.docx
《人工智能大作业实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能大作业实验Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
实验一:
谓词表示
【实验内容】
设农夫、狼、山羊、白菜都在河的左岸,现在要把它们运送到河的右岸去,农夫有条船,过河时,除农夫外船上至多能载狼、山羊、白菜中的一种。
狼要吃山羊,山羊要吃白菜,除非农夫在那里。
试设计出一个确保全部都能过河的方案。
【实验目的】
让学生加深对谓词逻辑和谓词知识表示的理解。
【实验要求】
写出所用谓词的定义,并给出每个谓词的功能及变量的个体域,然后编程来实现。
【参考学时】
1.定义状态的谓词
2.定义变元的个体域
3.描述问题的初始和目标状态
4.定义动作
5.解释过程
解:
(1)先定义描述状态的谓词
AL(x):
x在左岸
¬
AL(x)表示x在右岸。
(2)定义个体域
x的个体域:
{农夫,船,狼,羊,白菜}。
(3)定义初始状态和目标状态
问题的初始状态:
AL(农夫),AL(船),AL(狼),AL(羊),AL(白菜),
问题的目标状态:
AL(农夫),¬
AL(船),¬
AL(狼),¬
AL(羊),¬
AL(白菜)
(4)定义动作
4个动作:
农夫不带来回
农夫带来回
L-R:
农夫自己划船从左岸到右岸
L-R(x):
农夫带着x划船从左岸到右岸
R-L:
农夫自己划船从右岸到左岸
R-L(x):
农夫带着x划船从右岸到左岸
x的个体域是{狼,羊,白菜}。
农夫划船从左岸到右岸
条件:
AL(船),AL(农夫),¬
AL(狼)∨¬
AL(羊)∨¬
动作:
删除表:
AL(船),AL(农夫)
添加表:
AL(农夫)
L-R(狼):
农夫带着狼划船从左岸到右岸
AL(船),AL(农夫),AL(狼),¬
AL(羊)
AL(船),AL(农夫),AL(狼)
AL(狼)
L-R(羊):
农夫带着羊划船从左岸到右岸
AL(船),AL(农夫),AL(羊),AL(狼),AL(白菜)
或:
AL(船),AL(农夫),AL(羊),¬
AL(船),AL(农夫),AL(羊)
L-R(白菜):
农夫带着白菜划船从左岸到右岸
AL(船),AL(农夫),AL(白菜),¬
AL(狼)
AL(船),AL(农夫),AL(白菜)
农夫划船从右岸到左岸
AL(农夫),AL(狼)∨AL(羊),AL(羊)∨AL(白菜)
AL(农夫),¬
AL(白菜),AL(羊)
R-L(羊):
农夫带着羊划船从右岸到左岸
AL(羊),¬
AL(羊),AL(白菜)
(3)问题求解过程
代码如下
#include<
stdio.h>
malloc.h>
typedefintdatatype;
//datatype定义
structseqque//队列结构体
{
intmaxnum;
intf,r;
//存放头尾下标
datatype*q;
};
typedefstructseqque*pseqque;
/*创建一个新的队列*/
pseqquecreatemptyqueue(intm)
pseqquepaqu=(pseqque)malloc(sizeof(structseqque));
//申请结构体动态空间
if(paqu!
=NULL)
{
paqu->
q=(datatype*)malloc(sizeof(datatype)*m);
//申请datatype动态空间
if(paqu->
q)
{
paqu->
maxnum=m;
f=0;
//置头下标为0
r=0;
//置尾下标为0
returnpaqu;
}
elsefree(paqu);
}
printf("
超出存储空间!
"
);
returnNULL;
}
/*入队运算函数*/
voidenque(pseqquepaqu,datatypex)
if((paqu->
r+1)%(paqu->
maxnum)==paqu->
f)
printf("
队列已满!
else
q[paqu->
r]=x;
r=(paqu->
maxnum);
/*出队运算函数*/
voiddeque(pseqquepaqu)
if(paqu->
f==paqu->
r)
空队列!
else
f=(paqu->
f+1)%(paqu->
/*取队列头元素*/
datatypefrontque(pseqquepaqu)
队列为空!
return(paqu->
f]);
/*判断是否为空队列函数*/
intisemptyque(pseqquepaqu)
return1;
return0;
/*判断农夫位置*/
intfarmer(intlocation)
return(0!
=(location&
0x08));
/*判断狼位置*/
intwolf(intlocation)
0x04));
/*判断白菜位置*/
intcabbage(intlocation)
0x02));
/*判断羊位置*/
intgoat(intlocation)
0x01));
/*安全状态的判断函数*/
intsafe(intlocation)
if((goat(location)==cabbage(location))&
&
(goat(location)!
=farmer(location)))
//羊吃白菜
if((goat(location)==wolf(location))&
(wolf(location)!
//狼吃羊
return1;
/*解决农夫问题函数*/
voidfarmerproblem(void)
inti,movers,location,newlocation;
introute[16];
//记录已走过的步骤
pseqquemoveto;
//存放安全的步骤
moveto=createmptyqueue(16);
//创建新队列
enque(moveto,0x00);
//置状态初值
for(i=0;
i<
16;
i++)//置已走过步骤初值
route[i]=-1;
route[0]=0;
while(!
isemptyque(moveto)&
(route[15]==-1))
location=frontque(moveto);
//取头状态为当前状态
deque(moveto);
//删除队列头状态
for(movers=1;
movers<
=8;
<
=1)//依次考虑羊、白菜、狼、农夫的移动
if((0!
0x08))==(0!
movers)))//判断是否和农夫同边
{
newlocation=location^(0x08|movers);
//移动后的状态
if(safe(newlocation)&
(route[newlocation]==-1))//判断是否为安全状态
{
route[newlocation]=location;
//将新的安全状态赋给location
enque(moveto,newlocation);
//新的状态入队列
}
}
if(route[15]!
=-1)//到达最终状态
过程是:
\n"
//输出过程和位置
for(location=15;
location>
=0;
location=route[location])
printf("
位置是:
%d\n"
location);
if(location==0)
exit(0);
elseprintf("
此问题无解!
/*主函数*/
voidmain()
farmerproblem();
实验二:
一个用于动物识别的产生式系统
【实验内容】
设计该系统,让其实现可以识别老虎、金钱豹、斑马、长颈鹿、企鹅、信天翁这6种动物。
让学生进一步加深对产生式系统的认识和理解。
其规则库中应包含至少15条规则,假设推理开始时综合数据库中存放有以下事实:
动物有暗斑,有长脖子,有长腿,有奶,有蹄。
6课时:
上机实验6课时。
设计如下:
(1)IDENTIFIER产生式规则
规则I1:
如果该动物有毛发
那