人工智能猴子香蕉问题
1 1.问题描述 在一个房间内有一只猴子(可把这只猴子看做一个机器人) 、一个箱子和一束香蕉。 香蕉挂在天花板下方,但猴子的高度不足以碰到它。那么这只猴子怎样才能摘到香蕉呢 图 1 表示出猴子、香蕉和箱子在房间内的相对位置。用四元表列(W,x,Y,z)来表示这个问 题的状态。 其中, W-猴子的水平位置 x-当猴子在箱子顶上时取 x1;否则取 x0 Y-箱子的水平位置 z-当猴子摘到香蕉时取 z1;否则取 z0 这个问题中的操作(算符)如下 1、gotoU猴子走到水平位置 U,表示为 Goto U W,0,Y,z ------------U ,0 ,Y ,z 即把状态W,0,Y,z变换为状态U,0,Y,z。 2、pushboxV猴子把箱子推到水平位置 V,即有 Pushbox V W,0,W,z--------------V ,0 ,V ,z 条件猴子与箱子必须在同一位置上,并且,猴子不是在箱子顶上。 应当注意的是,要应用算符 pushbox(V) ,就要求 产生式规则的左边,猴子与箱子必 须在同一位置上,并且,猴子不是在箱子顶上。这种强加于操作的适用性条件,叫做产生式 规则的先决条件 3、climbbox 猴子爬上箱顶,即有 Climbbox W,0,W,z----------------W,1,W,z 条件猴子和箱子应当在同一位置上,而且猴子不在箱顶上。 4、grasp 猴子摘到香蕉,即有 Grasp c,1,c,0 -----------------c,1,c,1 条件猴子和箱子都在位置 c 上,并且猴子已在箱子顶上。 求解过程 令初始状态为a,0,b,0。这时,gotoU是唯一适用的操作,并导致下一状 态U,0,b,0。现在有 3 个适用的操作,即 gotoU,pushboxV和 climbbox若 Ub。 其中,c 是香蕉正下方的地板位置,该初始状态变换为目标状态的操作序列为 {gotob,pushboxc,climbbox,grasp} 应当说明的是,在这种情况下,算符(操作)的适用性及作用均由产生式规则表示。例 如,对于规则(2) ,只有当算符 pushboxV的先决条件,即猴子与箱子在同一位置上而且 猴子不在箱顶上这些条件得到满足时,算符 pushboxV才是适用的。这一操作算符的 作用 是猴子把箱子推到位置v。 在这一表示中, 目标状态的集合可由任何最后元素为 1 的表列来 描述。 2. 源代码 2 include include include int W; /*W-猴子的水平位置*/ int x; /*x-当猴子在箱子顶上时取 x1;否则取 x0*/ int c; /*c-是香蕉正下方的地板位置*/ int Y; /*Y-箱子的水平位置*/ int z; /*z-当猴子摘到香蕉时取 z1;否则取 z0*/ int ascll25; void Goto{ /*W,0,Y,z------------U,0,Y,z*/ /*猴子从水平位置 W 走到箱子的水平位置 Y 1.猴子在箱子的左边WY 3.猴子在箱子上x1 时 */ int i; printf“\n 猴子从水平位置 Wd走到箱子 Yd处\n“,W,Y; printf“\n W x Y z\n“; ifWY{ foriW;iY;i--{ ifiWprintf“ c\n“,ascll; printf“Stated,d,d,d\n“,i,x,Y,z; } } } void PushBox{ /*猴子把箱子箱子的水平位置 Y推到水平位置 c 处香蕉正下方的地板位置 1.箱子在香蕉的左边Yc */ int i; ifYc{ printf“\n 香蕉就在箱子的正上方\n“; } else{ printf“\n 猴子把箱子箱子的水平位置 Yd推到香蕉正下方的地板位置 cd\n“,Y,c; 3 } printf“\n W x Y z\n“; ifYc{ foriY;ic;i--{ ifiYprintf“ c\n“,ascll; printf“Stated,d,d,d\n“,i,x,Y,z; } } Wc; } void ClimbBox{ /*猴子爬上箱顶*/ printf“\n 猴子爬上箱顶\n“; printf“\n W x Y z\n“; printf“Stated,d,d,d\n“,W,x,Y,z; x1; printf“ c\n“,ascll; printf“Stated,d,d,d\n“,W,x,Y,z; } void Grasp{ /*猴子摘到香蕉*/ printf“\n 猴子摘到香蕉\n“; printf“\n W x Y z\n“; printf“Stated,d,d,d\n“,W,x,Y,z; z1; printf“ c\n“,ascll; printf“Stated,d,d,d\n“,W,x,Y,z; } int main{ int i0,select,flag0; whiletrue{ x0; z0; ifi0{ printf“\n“; system“Pause“; system“cls“; } 4 printf“**********信电学院 计本二班 郁春菊 20060502103********\n\n“; fori1;i10;i{ ifi1||i10{ printf“----------------------------------------------------------\n“; } else ifi3{ printf“| 人工智能之猴子与香 蕉 |\n“; } else ifi6{ printf“| 1.用户初始化参 数 |\n“; printf“| 2.系统随机初始化参 数 |\n“; printf“| 3.退出系 统 |\n“; } else ifi9{ printf“|***************** 人工智能算法 ****************|\n“; } else printf“| |\n“; } /* printf“State初始状态 stateW,x,Y,z“;*/ printf“请选择操作1/2/3 “; scanf“d“, ifselect 3{ sys