资源描述
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. 源代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
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.猴子在箱子的左边(W<Y)
2.猴子在箱子的右边(W>Y)
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);
}
}
else{
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.箱子在香蕉的左边(Y<c)
2.箱子在香蕉的右边(Y>c)
*/
int i;
if(Y==c){
printf("\n香蕉就在箱子的正上方......\n");
}
else{
printf("\n猴子把箱子(箱子的水平位置Y(%d))推到香蕉正下方的地板位置c(%d)\n",Y,c);
}
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);
}
}
else{
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");
}
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",&select);
if(select == 3){
system("cls");
return 0;
}
printf("\n");
system("Pause");
system("cls");
if(select==1){
printf("\n--------------------用户初始化参数--------------------\n");
printf("\n请输入猴子的水平位置 W: ");
scanf("%d",&W);
printf("\n请输入箱子的水平位置 Y: ");
scanf("%d",&Y);
printf("\n请输入香蕉正下方的地板位置 c: ");
scanf("%d",&c);
}
else if(select == 2){
flag=1;
srand(time(NULL));
printf("\n--------------------系统随机初始化参数--------------------\n");
W=rand()%10;
printf("\n猴子的水平位置 W: %d\n",W);
Y=rand()%10;
printf("\n箱子的水平位置 Y: %d\n",Y);
c=rand()%10;
printf("\n香蕉正下方的地板位置 c: %d\n",c);
}
if(W==Y){
if(flag==0){
printf("\n猴子是否在箱子顶上?(x-当猴子在箱子顶上时取x=1;否则取x=0) x= ");
scanf("%d",&x);
if(x!=0){
x=1;
}
}else{
x=rand()%2;
printf("\n猴子是否在箱子顶上?(x-当猴子在箱子顶上时取x=1;否则取x=0) x= %d\n",x);
}
}
if(x==1&&W==c){
/*猴子在箱子上(x=1),而且香蕉就在头顶(W=c)*/
printf("\n猴子在箱子上(x=1),而且香蕉就在头顶(W=c)......\n");
}
else if(x==1){
/*猴子在箱子上(x=1),但香蕉不在头顶(W=c)*/
printf("\n猴子从箱子上跳下......\n");
x=0;
/*猴子与箱子必须在同一位置上,并且,猴子不是在箱子顶上*/
PushBox();
/*猴子和箱子应当在同一位置上,而且猴子不在箱顶上*/
ClimbBox();
}
else {
/*猴子从水平位置W走到箱子的水平位置Y*/
Goto();
/*猴子与箱子必须在同一位置上,并且,猴子不是在箱子顶上*/
PushBox();
/*猴子和箱子应当在同一位置上,而且猴子不在箱顶上*/
ClimbBox();
}
Grasp();
printf("\n猴子正在吃香蕉......\n\n");
}
return 0;
}
3.程序分析结果
4.个人总结
通过这次课程设计,让我对C这门语言又有了一个新的了解,尽管在各个方面还有很多的不足,但我会再接再厉,在做这个猴子摘香蕉问题的时候,不懂的地方问了好几个同学,也知道了该怎么去实现它。遇到了问题逃避不是办法,要想办法去解决它才是我们该做的,只要给自己信心,相信自己可以做的到,那自己就一定能做的到。
8
展开阅读全文