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

人工智能实验猴子摘香蕉_猴子拿香蕉实验感悟题目意思:猴子定义了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;
    }

 

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python的变量名命名规则_python的变量命名规范

    python的变量名命名规则_python的变量命名规范一.python变量名命名规则:1.变量名通常由字母,数字,下划线组成;2.数字不能作为变量名开头;3.不能以python中的关键字命名;4.变量名要有意义;5.不要用汉字和拼音去命名;6.变量名要区分大小写;7.推荐使用驼峰型(GuessAge或guessAge)和下划线(guess_age)来命名;8.常量通常使用大写来定义.二.注释代码的方法1.单行(当行)注释:用#2.多行注释通过三引号完…

    2022年5月1日
    180
  • Mac 升级10.10 Yosemite系统 brew 报错无法使用解决办法

    Mac 升级10.10 Yosemite系统 brew 报错无法使用解决办法

    2021年9月7日
    103
  • 作为一个死忠粉,我的 IntelliJ IDEA 一直都是这样来设置的,效果很棒!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:judasn https://github.com/judasn/IntelliJ-IDEA-Tutorial…

    2021年6月25日
    82
  • 聚类分析R语言_k均值聚类算法计算题

    聚类分析R语言_k均值聚类算法计算题今天给大家展示基于R语言的聚类,在此之前呢,首先谈谈聚类分析,以及常见的聚类模型,说起聚类我们都知道,就是按照一定的相似性度量方式,把接近的一些个体聚在一起。这里主要是相似性度量,不同的数据类型,我们需要用不同的度量方式。除此之外,聚类的思想也很重要,要是按照聚类思想来说,主要有这么几大类,第一大类是基于分割的聚类,比如k-means,以及按照这个思路进行了简单扩展的几个聚类,如k-median等。

    2025年7月24日
    2
  • oracle11g 最终版本11.2.0.4安装详细过程

    oracle11g 最终版本11.2.0.4安装详细过程–安装背景上次碰到问题,cursor:mutexS导致的load过高,参考原来剖析额过程记录地址:https://blog.csdn.net/demonson/article/details/79753702,有说可以升级到11.2.0.4就能避免这种问题,所以准备重新搭建新版本11.2.0.4。 安装环境是:azure云linuxcentos6.5。…

    2022年5月7日
    288
  • Python的lambda表达式

    Python的lambda表达式1、lambda只是一个表达式,函数体比def简单很多2、lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去3、lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数4、简单单行代码或者一次性的函数可以用lambda函数来书写,可以让代码更简洁。5、对于复杂函数或者函数体体量大的函数,最好不要用lambda函数,会增加代码的阅读难度,使代码晦涩难懂。6、在非多次调用的函数的情况下,lambda表达式即用既得,提高性能

    2022年10月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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