首页 > 其他分享 >猴子摘香蕉问题

猴子摘香蕉问题

时间:2023-05-23 09:45:13浏览次数:39  
标签:香蕉 Box Monkey 箱子 猴子 问题 Banana

简介

一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为A香蕉位置在B箱子位置为C),如何行动可摘取到香蕉?

猴子摘香蕉问题PEAS

性能 环境 执行器 感受器
猴子站在箱子上摘得香蕉 香蕉、箱子位置 (四肢)Move,Climb,Push,Grasp (眼睛) Site,Hold,On,Hang

基本的定义

定义状态谓词

  • \(SITE(x , y)\): \(x\) 在 \(y\) 处
  • \(HANG)(w,y)\): \(w\) 悬挂在 \(y\)处
  • \(ON(z)\): \(z\) 站在箱子上
  • \(HOLDS(z)\): \(z\) 手里拿着香蕉

变元的个体域

  • \(x\) 的个体域是\(\{Monkey, Box\}\)

  • \(y\)的个体域是\(\{a,b,c\}\) (地点为 a,b,c)

  • \(z\)的个体域是\(\{Monkey\}\)

  • \(w\)的个体域是\(\{Banana\}\)

初始状态

\[S_0 = SITE(Monkey, a) \wedge HANG(Banana, b) \wedge SITE(Box, c) \wedge \neg ON(Monkey) \wedge \neg HOLDS(Monkey) \]

猴子在A处,香蕉悬挂在B处,箱子放在C处

目标状态

\[S_g = SITE(Monkey,b) \wedge \neg HANG(Banana,b) \wedge SITE(Box,b) \wedge ON(Monkey) \wedge HOLDS(Monkey) \]

猴子拿到香蕉,站在箱子上,箱子位于B处

定义四个操作

\[Goto(u,v): 猴子从u走到v处。\\ Pushbox(v,w): 猴子推着箱子从v走到w处。\\ Climbbox: 猴子爬上箱子\\ Grasp: 猴子摘到香蕉 \]

各操作的条件和动作

  • \(Goto(u,v)\)
    • \(条件:\neg ON(Monkey), SITE(Monkey,u)\)
    • 动作:
      • $删除表:SITE(Monkey,u) $
      • \(添加表:SITE(Monkey,v)\)
  • \(Pushbox(v,w)\)
    • \(条件:\neg ON(Monkey), SITE(Monkey,v), SITE(Box,v)\)
    • 动作:
      • \(删除表:SITE(Monkey,v),SITE(Box,v)\)
      • \(添加表:SITE(Monkey, w), SITE(Box, w)\)
  • \(Climbbox\)
    • \(条件:\neg ON(Monkey), SITE(Monkey,w),SITE(Box, w)\)
    • 动作:
      • \(删除表:\neg ON(Monkey)\)
      • \(添加表:ON(Monkey)\)
  • \(Grasp\)
    • \(条件:ON(Monkey), SITE(Box, b), HANG(Banana,b)\)
    • 动作:
      • $删除表:\neg HOLDS(Monkey),HANG(Banana,b) $
      • \(添加表:HOLDS(Monkey), \neg HANG(Banana,b)\)

求解

  1. 综合数据库:(M, B, Box, On, H)

    • M: 猴子的位置
    • B:香蕉的位置
    • Box:箱子的位置
    • \(On = 0\):猴子在地板上
    • \(On = 1\):猴子在箱子上
    • \(H = 0\):猴子没有抓到香蕉
    • \(H=1\):猴子抓到了香蕉
  2. 初始状态:(a, b, c, 0, 0)

  3. 结束状态:(b, b, b, 1, 1)

  4. 规则集:

    • \(r_1: IF (x,y,z,0,0) \; THEN (w,y,z,0,0)\) 猴子到处乱走
    • $r_2: IF(z,y,z,0,0) ; THEN(z',y,z',0,0) $ 猴子推箱子走
    • \(r_3: IF(x,y,x,0,0) \; THEN(x,y,x,1,0)\) 猴子爬上箱子
    • \(r_4: IF(x,y,x,1,0) \; THEN(x,y,x,0,0)\) 猴子爬下箱子
    • \(r_5: IF(x,x,x,1,0) \; THEN(x,x,x,1,1)\) 猴子摘香蕉
    • 其中,\(x,y,z,w\)为变量。
  5. 具体过程:

    根据具体问题可将规则具体为:

    • \(r_1: IF(a,b,c,0,0) \; THEN(c,b,c,0,0)\) 猴子走到箱子处
    • \(r_2: IF(c,b,c,0,0) \; THEN(b,b,b,0,0)\) 猴子将箱子推到香蕉处
    • \(r_3: IF(b,b,b,0,0) \; THEN(b,b,b,1,0)\) 猴子爬上箱子
    • \(r_5: IF(b,b,b,1,0) \; THEN(b,b,b,1,1)\) 猴子摘到香蕉

    在已知事实下,\(r_1 \rightarrow r_2 \rightarrow r_3 \rightarrow r_5\),即可得到香蕉。

代码

# 猴子走向箱子
def Goto(Monkey, Box):
    global i  # 步数
    i += 1
    print("step " + str(i) + ": " + "Monkey从" + Monkey + "走向" + Box)


# 猴子推箱子到香蕉处
def Pushbox(Box, Banana):
    global i
    i += 1
    print("step " + str(i) + ": " + "Monkey将Box从" + Box + "推向" + Banana)


# 猴子爬上箱子
def Climbbox():
    global i
    i += 1
    print("step " + str(i) + ": " + "Monkey爬上Box")


# 猴子摘取香蕉
def Grasp():
    global i
    i += 1
    print("step " + str(i) + ": " + "Monkey摘到Banana")


# 猴子爬下箱子
def Dropbox():
    global i
    i += 1
    print("step " + str(i) + ": " + "Monkey爬下box")

# 检查输入
def Check(Monkey, Banana, Box, On, H):
    if Monkey != Box and On == "1":
        print("不合法的输入!")
        return False
    if H == "1":
        print("Monkey已摘到banana")
        return False
    return True
if __name__ == "__main__":
    i = 0
    print("请输入Monkey位置,Banana的位置,Box的位置,猴子是否在箱子上(1:在,0:不在)上以及猴子是否摘取香蕉(1:是,0:否):")
    Monkey, Banana, Box, On, H = input().split(",")
    Flag = Check(Monkey, Banana, Box, On, H)
    while Flag:
        # r1规则:箱子和猴子不在一起才能走向箱子
        if Monkey != Box:
            Goto(Monkey, Box)
            Monkey = Box
            continue

        # r2规则:猴子跟箱子在一起,且不跟香蕉在一起,以及猴子不在箱子上,才能推箱子到香蕉处
        if Box != Banana and Monkey == Box and On == "0":
            Pushbox(Box, Banana)
            Monkey = Box = Banana
            continue

        # r3规则:猴子不在箱子上,并且猴子跟箱子在一起才能爬
        if On == "0" and Monkey == Box:
            Climbbox()
            On = "1"
            continue

        # r5规则:猴子在箱子上,并且处在香蕉位置,且猴子没有摘取香蕉,才能摘取香蕉
        if On == "1" and Box == Banana and H == "0":
            Grasp()
            H = "1"
            continue

        # r4规则:猴子在箱子上,但不在香蕉的位置,爬下箱子
        if On == "1" and Box != Banana:
            Dropbox()
            On = "0"
            continue

        # 猴子取到香蕉,则结束循环
        if H == "1":
            break

标签:香蕉,Box,Monkey,箱子,猴子,问题,Banana
From: https://www.cnblogs.com/Az1r/p/17422374.html

相关文章

  • 关闭Chrome浏览器 弹窗无法更新问题
    部分老电脑还用的是win7,但是win7的谷歌浏览器已经不支持更新了但是低版本的谷歌浏览器还不断的提示更新,然后弹框无法更新又无法更新,还一直提醒,就很烦。关闭方法只需要右键点击谷歌浏览器的快捷方式,选择属性找到快捷方式页面,找到目标栏在chrome的路径后面添加--dis......
  • 解决xfreerdp在Ubuntu22.10无法退出全屏问题
    最近升级了一下Ubuntu到22.10,然后发现xfreerdp链接上远程计算机后,无法通过快捷键退出全屏,我们可以在terminal命令中添加dynamic-resolution参数即可;xfreerdp/multimon/u:common\\mango/p:*****/v:192.168.1.168/dynamic-resolution......
  • 进行图片识别后传入接口问题提出与解决
    首先,对于Android内的代码进行带入,可以实现,后来,进行数据格式输出的筛选,目前人工智能给出的答案格式不同,利用正则表达式提取不全,但可以提取,另外,在查找可以语法格式来针chatgpt,以实现结果的规范输出。还有一个很悲伤的事,接口被停了,看看博主进行维护的怎么样,可以的化这个项目还是可......
  • IDA keypatch IDApatcher 安装问题
    将“idapatcher.py”置于plugins目录下在IDA/python38目录下cmdpython-mpipinstall--upgradepippython-mpipinstallkeystone-engine启动IDApro容易踩坑nomodulenamedkeystonepython-mpipinstallkeystone-engineIDA_Pro_v7.5_Portable\plugins\keypatch......
  • 实现堆,堆排序,解决堆的TOPK问题
    这篇博客我会尽我自己的所能讲解堆,同时详细的解释堆中重要的向下和向上调整算法,以及推排序的两种实现方法,和堆的TOPK问题。堆是什么我们之前已经介绍过了树,而堆就是一种完全二叉树。这里我放一张二叉树的图下面我来解释一下满二叉树,和完全二叉树的区别:满二叉树是指除了叶子节点外,每......
  • QSharedPointer创建导致内存泄漏,以及析构异常的问题
    1,下面的代码导致了内存泄漏autoitem=QSharedPointer(newMyClass(),&QObject::deleteLater)2,去掉了自定义析构后,内存泄漏问题解除,但是导致了新的问题,autoitem=QSharedPointer<MyClass>(newMyClass())在item析构时出现了析构错误:QCoreApplication::sendEvent:“cann......
  • Rancher和K8s安全问题
    原生K8S      Rancher修改K8s服务参数            kube-api:always_pull_images:falsepod_security_policy:falsesecrets_encryption_config:enabled:falseservice_node_port_range:0-65535......
  • python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+
    目录python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+升级openssl版本降低urllib版本python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+这个问题时python版本安装的urllib3版本过高,而openssl版本太低导致的解决无非两种方法,降低......
  • vue3遇到的问题集合
    1.vue3打包设置 2.vue3路由配置history 3.vue3屏蔽eslint ......
  • 关于MySQL数据库的加密解密问题
    SELECTMD5(‘123456’);结果显示的密文即为:e10adc3949ba59abbe56e057f20f883e解密MySQL中的MD5加密密码,需要使用MySQL中的UNHEX()函数。UNHEX()函数可以接收一个十六进制格式的参数,将其转换为原始字符串格式。例如我们可以这样使用UNHEX()函数解密前面我们生成的初始密文:SELEC......