猴子摘香蕉实验报告(含代码)x
时间:2020-10-19 12:38:26 来源:勤学考试网 本文已影响 人
PAGE
PAGE #
华中科技大学
《人工智能与模式识别》
实验报告
院 系: 电子与信息工程系
班 级:
姓 名:
同组人:
指导老师:
电 话:
邮 箱:
日 期:2013年12月24日
、实验内容
(即利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图所示, 猴子为了拿到香蕉, 它必须把箱子搬到香蕉下面, 然后再爬到箱子上。
请定义必要的谓词, 列出问题的初始化状态
(即
下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置 b )。(附加:从初始状态到目标状态的谓词
演算过程。)
a b c
二、 实验平台
VC6.0
三、 实验分析
定义描述环境状态的谓词。
AT(x,w) : x 在 t 处,个体域:x?{monkey} ,w?{a,b,c,box};
HOLD(x,t) : x 手中拿着 t,个体域:t?{box,ba nan a};
EMPTY(x) : x手中是空的;
ON(t,y) : t 在 y 处,个体域:y?{b,c,ceiling};
CLEAR(y) : y上是空的;
BOX(u) : u是箱子,个体域: u?{box};
BANANA(v) : v 是香蕉,个体域: v?{banana};
使用谓词、连结词、量词来表示环境状态。
问题的初始状态可表示为:
S。: AT(monkey,a)?EMPTY(monkey)?ON(box,c)?ON(banana,ceiling)?CLEAR(b)?BOX(box)?
BANANA(ba nan a)
要达到的目标状态为:
Sg: AT(monkey,box)?HOLD(monkey,banana)?ON(box,b)?CLEAR(ceiling)?CLEAR(c)?
BOX(box)?BANANA(ba nana)
从初始状态到目标状态的转化 ,猴子需要完成一系列操作,定义操作类谓词表示其动作。
WALK(m,n):猴子从 m走到n处,个体域: m,n?{a,b,c};
CARRY(s,r):猴子在 r 处拿到 s,个体域:r?{c,ceili ng} , s?{box,ba nan a};
CLIMB(u,b):猴子在b处爬上u;
这3个操作也可分别用条件和动作来表示。条件直接用谓词公式表示,是为完成相应操作所必须具备的条件;当 条件中的事实使其均为真时,则可激活操作规则,于是可执行该规则中的动作部分。动作通过前后状态的变化表示, 即通过从动作前删除或增加谓词公式来描述动作后的状态。
WALK(m,n):猴子从 m走到n处
条件:AT(mo nkey,m)
.删除:AT (monkeym)
动作:丿
J曾加:AT (monkey n)
CARRY(s,r):猴子在r处拿到s
条件:AT(mo nkey,r)?EMPTY(mo nkey)?ON(s,r)?BOX(box)?BANANA(ba nana)
动作:<
删除:EMPTY(monke?/\ON(s,r) 增加:HOLD(monkeys”CLEAR(r)
CLIMB(u,b):猴子在b处爬上u
条件:AT(mo nkey,b)?HOLD(mo nkey,u)?CLEAR(b)?BOX(box)?BANANA(ba nana)
动作:*
r删除:AT(monkeyb) a HOLD(monkeyu) aCLEAR(c) 增加:AT(monkey u)EMPTY(monke》入ON(u,c)
4.按照行动计划,一步步进行状态替换,直至目标状态。
AT(mo nkey,a)?EMPTY(mo nkey)?ON(box,c)?ON(ba nan a,ceili ng)?CLEAR(b)?BOX(box)?
BANANA(ba nan a)
WALK(a,c)用a代换m,用c代换n
AT(m on key,c)?EMPTY(mo nkey)?ON(box,c)?ON(ba nan a,ceili ng)?CLEAR(b)?BOX(box)?
BANANA(ba nan a)
CARRY(c,box)用 c代换 s,用 box代换 r
AT(mo nkey,c)?HOLD(mo nkey,box)?ON(ba nan a,ceili ng)?CLEAR(b)?CLEAR(c)?BOX(box)?
BANANA(ba nan a)
WALK (c,b) 用c代换m,用b代换n
AT(m on key,b)?HOLD(mo nkey,box)?ON(ba nan a,ceili ng)?CLEAR(b)?CLEAR(c)?BOX(box)?
BANANA(ba nan a)
■ CLIMB (box,b)用 box代换 u
AT(mo nkey,box)?EMPTY(mo nkey)?ON(box,b)?ON(ba nan a,ceili ng)?CLEAR(c)?BOX(box)?
BANANA(ba nan a)
CARRY (ba nan a, ceili ng )用 banana 代换 s,用 ceili ng 代换 r
AT(mo nkey,box)?HOLD(mo nkey,ba nan a)?ON(box,b)?CLEAR(ceili ng)?CLEAR(c)?BOX(box)?
BANANA(ba nana)(目标得解)
猴子行动的规则序列是: WALK(a,c)~CARRY(c,box尸WALK(c,b)~CLIMB(box,b)宀
CARRY(ba nan a,ceili ng)
在上述过程中,我们应该注意,当猴子执行某一个操作之前,需要检查当前状态是否可使所要求的条件得到满足, 即证明当前状态是否蕴涵操作所要求的状态的过程。在行动过程中, 检查条件的满足性后才进行变量的代换。代入新
条件后的新状态如果是目标状态,则问题解决;否则看是否满足下面的操作,如果不满足或即使满足却又回到了原来 的状态,那么代入无效。
四、源代码
#i nclude <stdio.h>
struct State
{
in t mon key; /*-1:Mo nkey at A;0: Mo nkey at B;1:Mo nkey at C;*/
int box; /*-1:box at A;0:box at B;1:box at C;*/
int banana; /*Banana at B,Ba nan a=0*/
int mon box; /*-1: mon key on the box;1: mon key the box;*/
};
struct State States [150];
char* routesave[150];
/*fu nctio n mon keygoto,it makes the mon key goto the other place*/ void mon keygoto(i nt b,i nt i)
{
int a;
a=b;
if (a==-1)
{
routesave[i]=" Mon key go to A";
States[i+1]=States[i];
States[i+1].mo nkey=-1;
}
else if(a==O)
{
routesave[i]=" Mon key go to B";
States[i+1]=States[i];
States[i+1].mo nkey=0;
}
else if(a==1)
{
routesave[i]=" Mon key go to C";
States[i+1]=States[i];
States[i+1].mo nkey=1;
}
else
{
prin tf("parameter is wron g");
}
}
/*e nd fun cti on mon keyygoto*/ /*fu nction movebox,the mon key move the box to the other place*/ void movebox(i nt a,i nt i) {
int B;
B=a;
if(B==-1)
{
routesave[i]=" mon key move box to A";
States[i+1]=States[i];
States[i+1].mo nkey=-1;
States[i+1].box=-1;
}
else if(B==0)
{
routesave[i] = "mon key move box to B"; States[i+1]=States[i];
States[i+1].mo nkey=0;
States[i+1].box=0;
}
else if(B==1)
{
routesave[i] = "mon key move box to C";
States[i+1]=States[i];
States[i+1].mo nkey=1;
States[i+1].box=1;
}
else
{
prin tf("parameter is wron g");
}
}
/*e nd fun cti on movebox*/
/*fu nctio n climb on to,the mon key climb on to the box*/
void climb on to(i nt i)
{
routesave[i]=" Mon key climb onto the box";
States[i+1]=States[i];
States[i+1].m on box=1;
}
/*fu nctio n climbdow n,m on key climb dow n from the box*/
void climbdow n(i nt i)
{
routesave[i]=" Mon key climb dow n from the box";
States[i+1]=States[i];
States[i+1].m on box=-1;
}
/*fu nction reach,if the mon key,box,a nd banana are at the same place,the mon key reach banana*/ void reach(i nt i)
{
routesave[i]=" Mon key reach the banan a";
}
/*output the soluti on to the problem*/
void showSoluti on (i nt i)
{
int c;
printf ("%s \n", "Result to problem:");
for(c=0; c<i+1; c++)
{
printf ("Step %d : %s \n ”,c+1,routesave[c]);
}
prin tf("\n");
} /*perform n ext step*/
}else
}
else
PAGE #
void n extStep(i nt i)
{
int c;
int j;
if(i>=150)
{
prin tf("%s \n", "steple ngth reached 150,have problem ");
return;
}
for (c=0; c<i; C++) /*if the curre nt state is same to previous,retrospect*/
{
if(States[c]. mon key==States[i].m onkey&&States[c].box==States[i].box&&States[c].ba nan a==States[i].ba nana&& States[c]. mon box==States[i].m on box)
{
return;
}
}
if(States[i].mo nbox==1 &&States[i].mo nkey==0&&States[i].ba nan a==0&&States[i].box==0)
{
showSoluti on (i);
prin tf("Press any key to continue \n");
getchar();/*to save scree n for user,press any key to con ti nu e*/ return;
}
j=i+1;
if(States[i].m on key==0)
{
if(States[i].box==0)
{
if(States[i].m on box==-1)
{
climb on to(i);
reach(i+1);
n extStep(j);
/*mon keygoto(-1,i);
n extStep(j);
mon keygoto(0,i);
n extStep(j);
movebox(-1,i);
n extStep(j);
movebox(0,i);
n extStep(j);*/
reach(i+1); nextStep(j); /*climbdow n(i); n extStep(j);*/
}
}
else if(States[i].box==1) {
/*m on keygoto(-1,i); nextStep(j);*/ mon keygoto(1,i);
n extStep(j); movebox(0,i);
n extStep(j); climb on to(i); reach(i+1);
n extStep(j);
}
else /*box==-1*/ {
mon keygoto(-1,i); n extStep(j);
movebox(0,i); n extStep(j); climb on to(i);
reach(i+1); n extStep(j);
}
}
/*end if*/
if(States[i].m on key==-1)
{
if(States[i].box==-1)
{
if(States[i].m on box==-1) {
movebox(0,i);
n extStep(j); climb on to(i);
reach(i+1);
n extStep(j);
PAGE
PAGE #
}else
}
else
PAGE #
climbdow n(i); n extStep(j); movebox(0,i); n extStep(j); climb on to(i); reach(i+1); n extStep(j);
}
}
else if(States[i].box==0)
{
mon keygoto(0,i); n extStep(j);
climb on to(i); reach(i+1);
n extStep(j);
}
else
{
mon keygoto(1,i); n extStep(j); movebox(0,i);
n extStep(j); climb on to(i); reach(i+1);
n extStep(j);
}
}
/*end if*/
if(States[i].m on key==1)
{
if (States[i].box==1)
{
if(States[i].m on box==-1) {
movebox(0,i); n extStep(j);
climb on to(i); reach(i+1);
n extStep(j);
{
climbdow n(i); n extStep(j); movebox(0,i); n extStep(j); climb on to(i); reach(i+1);
n extStep(j);
}
}
else if(States[i].box==-1) {
mon keygoto(-1,i); n extStep(j); movebox(0,i);
n extStep(j); movebox(0,i);
n extStep(j); climb on to(i); reach(i+1);
n extStep(j);
}
else {
mon keygoto(0,i); n extStep(j);
movebox(0,i); n extStep(j); climb on to(i);
reach(i+1); n extStep(j);
}
}
/*end if*/
}/*end nextStep*/
int mai n()
{
States[0].mo nkey=-1;
States[0].box=1;
States[0].ba nan a=0;
States[0].mo nbox=-1;
n extStep(0);
}
Hsu ,w
Hsu ,w