人工智能猴子香蕉问题
1 1.问题描述 在一个房间内有一只猴子(可把这只猴子看做一个机器人) 、一个箱子和一束香蕉。 香蕉挂在天花板下方,但猴子的高度不足以碰到它。那么这只猴子怎样才能摘到香蕉呢? 图 1 表示出猴子、香蕉和箱子在房间内的相对位置。用四元表列(W,x,Y,z)来表示这个问 题的状态。 其中, W-猴子的水平位置 x-当猴子在箱子顶上时取 x=1;否则取 x=0 Y-箱子的水平位置 z-当猴子摘到香蕉时取 z=1;否则取 z=0 这个问题中的操作(算符)如下: 1、goto(U)猴子走到水平位置 U,表示为 Goto (U) (W,0,Y,z) ------------(U ,0 ,Y ,z) 即把状态(W,0,Y,z)变换为状态(U,0,Y,z)。 2、pushbox(V)猴子把箱子推到水平位置 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)。这时,goto(U)是唯一适用的操作,并导致下一状 态(U,0,b,0)。现在有 3 个适用的操作,即 goto(U),pushbox(V)和 climbbox(若 U=b)。 其中,c 是香蕉正下方的地板位置,该初始状态变换为目标状态的操作序列为: {goto(b),pushbox(c),climbbox,grasp} 应当说明的是,在这种情况下,算符(操作)的适用性及作用均由产生式规则表示。例 如,对于规则(2) ,只有当算符 pushbox(V)的先决条件,即猴子与箱子在同一位置上而且 猴子不在箱顶上这些条件得到满足时,算符 pushbox(V)才是适用的。这一操作算符的 作用 是猴子把箱子推到位置v。 在这一表示中, 目标状态的集合可由任何最后元素为 1 的表列来 描述。 2. 源代码 2 #include #include #include int W; /*W-猴子的水平位置*/ int x; /*x-当猴子在箱子顶上时取 x=1;否则取 x=0*/ int c; /*c-是香蕉正下方的地板位置*/ int Y; /*Y-箱子的水平位置*/ int z; /*z-当猴子摘到香蕉时取 z=1;否则取 z=0*/ int ascll=25; void Goto(){ /*(W,0,Y,z)------------(U,0,Y,z)*/ /*猴子从水平位置 W 走到箱子的水平位置 Y 1.猴子在箱子的左边(WY) 3.猴子在箱子上(x=1 时) */ int i; printf(“\n 猴子从水平位置 W(%d)走到箱子 Y(%d)处\n“,W,Y); printf(“\n W x Y z\n“); if(W=Y){ for(i=W;i=Y;i--){ if(i!=W)printf(“ %c\n“,ascll); printf(“State(%d,%d,%d,%d)\n“,i,x,Y,z); } } } void PushBox(){ /*猴子把箱子(箱子的水平位置 Y)推到水平位置 c 处(香蕉正下方的地板位置) 1.箱子在香蕉的左边(Yc) */ int i; if(Y==c){ printf(“\n 香蕉就在箱子的正上方\n“); } else{ printf(“\n 猴子把箱子(箱子的水平位置 Y(%d))推到香蕉正下方的地板位置 c(%d)\n“,Y,c); 3 } printf(“\n W x Y z\n“); if(Y=c){ for(i=Y;i=c;i--){ if(i!=Y)printf(“ %c\n“,ascll); printf(“State(%d,%d,%d,%d)\n“,i,x,Y,z); } } W=c; } void ClimbBox(){ /*猴子爬上箱顶*/ printf(“\n 猴子爬上箱顶\n“); printf(“\n W x Y z\n“); printf(“State(%d,%d,%d,%d)\n“,W,x,Y,z); x=1; printf(“ %c\n“,ascll); printf(“State(%d,%d,%d,%d)\n“,W,x,Y,z); } void Grasp(){ /*猴子摘到香蕉*/ printf(“\n 猴子摘到香蕉\n“); printf(“\n W x Y z\n“); printf(“State(%d,%d,%d,%d)\n“,W,x,Y,z); z=1; printf(“ %c\n“,ascll); printf(“State(%d,%d,%d,%d)\n“,W,x,Y,z); } int main(){ int i=0,select,flag=0; while(true){ x=0; z=0; if(i!=0){ printf(“\n“); system(“Pause“); system(“cls“); } 4 printf(“**********信电学院 计本二班 郁春菊 20060502103********\n\n“); for(i=1;i=10;i++){ if(i==1||i==10){ printf(“----------------------------------------------------------\n“); } else if(i==3){ printf(“| 人工智能之猴子与香 蕉 |\n“); } else if(i==6){ printf(“| 1.用户初始化参 数 |\n“); printf(“| 2.系统随机初始化参 数 |\n“); printf(“| 3.退出系 统 |\n“); } else if(i==9){ printf(“|***************** 人工智能算法 ****************|\n“); } else printf(“| |\n“); } /* printf(“State:初始状态 state(W,x,Y,z)“);*/ printf(“请选择(操作:1/2/3) :“); scanf(“%d“, if(select == 3){ sys