人工智能实验猴子摘香蕉_猴子拿香蕉实验感悟

人工智能实验猴子摘香蕉_猴子拿香蕉实验感悟题目意思:猴子定义了4个状态空手移动,推箱子,爬箱子,摘香蕉用(w,x,y,z)描述w定义了猴子位置x为1表示猴子在箱子上,0表示不在箱子上y表示箱子位置z为1表示猴子摘到香蕉(结束),为0表示没有摘到香蕉(继续搜索)目前仍有些bug随机生产猴子箱子香蕉的位置,通过BFS搜索并记录路径得出猴子的行走轨迹(因为是宽松搜,得到的就是最优解)#…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 

题目意思:

猴子定义了4个状态  空手移动,推箱子,爬箱子,摘香蕉 用 (w,x,y,z)描述

w定义了猴子位置

x为1表示猴子在箱子上,0表示不在箱子上

y表示箱子位置

z为1表示猴子摘到香蕉(结束),为0表示没有摘到香蕉(继续搜索)

 

目前仍有些bug

随机生产 猴子 箱子 香蕉的位置,通过BFS搜索并记录路径得出猴子的行走轨迹(因为是宽松搜,得到的就是最优解)

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<stdio.h>
#include<ctime>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
#define MAX 100000
using namespace std;
int a,b,c;//a 猴子 b箱子 c香蕉
int dir[2][2] = {
  
  {0,-1},{0,1}};
struct Node{
    int w,x,y,z;
	int close;
};
int pa[MAX];
int end;
Node nodes[MAX];
int getDis(int x1, int x2){
    return abs(x2-x1);
}

void go(int w,int x, int y, int z)
    {
		if(x == 1 && z== 0){
            printf("猴子在%d位置爬上箱子\n",w);
        }
        else if(x == 1 && z == 1){
            //printf("猴子在位置%d爬上箱子\n",w);
            printf("猴子在%d位置摘到香蕉\n",w);
        }
        else if(x == 0 && y != w){
            printf("猴子空手到达%d位置\n",w);
        }
        else if(x == 0 && y == w){
            printf("猴子推箱子到达位置%d\n",w);
        }
    }
int step = 1;
void print(int e)
    {
        int w,x,y,z,close;
        if(pa[e] != -1){
            print(pa[e]);
            Node node = nodes[e];
            w = node.w;//猴子位置
            x = node.x;//是否在箱子上
            y = node.y;//箱子位置
            z = node.z;//是否摘到香蕉
            //printf("\t");
            printf("第%d步 :",step++);
            go(w,x,y,z);
        }
    }
void getBana()
    {
        int w,x,y,z;
        int head, tail;
        memset(pa,-1,sizeof(pa));
        head = tail = 0;
        printf("猴子,箱子,香蕉的初始位置分别为%d %d %d\n\n",a,b,c);
        if(a == b && b == c){
            printf("猴子在位置%d爬上箱子\n",a);
            printf("猴子在%d位置摘到香蕉\n",a);
            return ;
        }
    	if(b == c){//箱子初始位置与香蕉位置相同 不能往下走了

    		if(b > a){
    			while(a < b){
    				++a;
    				printf("猴子空手到达%d\n",a);
				}
			}
			else{
				while(a > b){
					--a;
					printf("猴子空手到达%d\n",a);
				}
			}
    		printf("猴子在位置%d爬上箱子\n",a);
            printf("猴子在%d位置摘到香蕉\n",a);
		}

        nodes[tail].w = a;
        nodes[tail].x = 0;
        nodes[tail].y = b;
        nodes[tail].z = 0;
        tail++;
        while(head < tail){
            Node node = nodes[head];
            w = node.w;//猴子位置
            x = node.x;//是否在箱子上
            y = node.y;//箱子位置
            z = node.z;//是否摘到香蕉
            //go(w,x,y,z);
            if(x == 1 && z == 1){
                end = head;
                break;
            }
            if(x == 1 && w == c){
            	pa[tail] = head;
                nodes[tail].w = w;
                nodes[tail].x = 1;
                nodes[tail].y = y;
                nodes[tail].z = 1;
                tail++;
            }
            if(x != 1){
                if(w == y){//不在箱子上 并且在同一位置
                    for(int i = 0; i < 2; ++i) {
                        int nw = w + dir[i][1];
                        if(nw < 0) continue;
                        if(w == y && getDis(c,nw) > getDis(c,w)) continue;
                        pa[tail] = head;
                        nodes[tail].w = nw;//往前推
                        nodes[tail].x = 0;
                        nodes[tail].y = nw;
                        nodes[tail].z = 0;
                        nodes[tail].close = 1;
                        tail++;
                        pa[tail] = head;
                        nodes[tail].w = nw;//上箱子尝试摘
                        nodes[tail].x = 1;
                        nodes[tail].y = nw;
                        nodes[tail].z = 0;
                        tail++;

                    }
                }
                if(w != y){//不在箱子上  不在同一位置
                    for(int i = 0; i < 2; ++i) {
                        int nw = w + dir[i][1];
                        if(nw < 0) continue;
                        pa[tail] = head;
                        nodes[tail].w = nw;//上箱子尝试摘
                        nodes[tail].x = 0;
                        nodes[tail].y = b;
                        nodes[tail].z = 0;
                        tail++;
                    }
                }
            }
            head++;
        }
//        printf("%d\n",end);
//        for(int i = 0; i < 20; ++i){
//        	printf("%d ",pa[i]);
//		}
        print(end);
    }


int main()
    {
        ios::sync_with_stdio(false);
        srand((unsigned)time(NULL));
        a = rand()%(10-0)+1;
        b = rand()%(10-0)+1;
        c = rand()%(10-0)+1;
       //	cin >> a >> b >> c;
        getBana();

        return 0;
    }

 

人工智能实验猴子摘香蕉_猴子拿香蕉实验感悟

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189256.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号