人工智能——猴子摘香蕉问题

一、 实验目的

求解猴子摘香蕉问题,根据猴子不同的位置,求解猴子的移动范围,求解对应的过程,针对不同的目标状态进行求解。

二、 实验内容

根据场景有猴子、箱子、香蕉,香蕉挂天花板上。定义多种谓词描述位置、状态等。

有从一处走到另一处、推箱子、爬到箱子、拿到香蕉 4 种操作。需输出猴子摘香蕉的四步步骤及对应谓词,从初始状态(猴子位置、箱子位置、香蕉位置,香蕉挂天花板、猴手空、猴不在箱上)达到目标状态(猴拿香蕉且在箱上)。

python 复制代码
# -*- coding: utf-8 -*-
'''
人工智能:知识表示:谓词公式表示
实验1:猴子摘香蕉问题  Python代码
'''

'''定义类保存猴子位置、箱子位置、香蕉位置等信息'''
'''
拔高1:输出猴子进行某step之前的状态
拔高2:加入猴子伸手的高度、箱子的高度、香蕉被挂在墙上的高度
拔高3:加入前端代码,增加动画演示
'''
class predicate():
    
    monky = 0
    box = 0
    banana = 0
    monbox = 0
    # 全局变量, 表示步骤Step数量
    iStep = 0  
    
    def __init__(self, monky=0, box=0, banana=0, monbox=0):
        ''' Initialize '''
        self.monky = monky      # 猴子的位置
        self.box = box          # 箱子的位置
        self.banana = banana    # 香蕉的位置
        self.monbox = monbox    # -1(或<0), 猴子不在箱子上
                                # 1(或>=0), 猴子在箱子上
        self.monkyName = 'monky'
        self.boxName = 'box'
        self.bananaName = 'banana'
        self.iStep = 0
        
    def displayInit(self):
        ''' 输出初始位置信息 '''
        self.AT(self.monkyName, self.monky)
        self.BOX(self.box)
        self.BAN(self.banana)
        self.OVER(self.bananaName)
        self.EMPTY(self.monkyName)
        if self.monbox < 0:
            self.NOT_ON(self.monkyName, self.boxName)
        elif self.monbox >= 0:
            self.ON(self.monkyName, self.boxName)
    
    def displayFinal(self):
        ''' 输出最终位置信息 '''
        self.AT(self.monkyName, self.banana)
        self.BOX(self.banana)
        self.BAN(self.banana)
        self.HOLD(self.monkyName, self.bananaName)
        if self.monbox < 0:
            self.NOT_ON(self.monkyName, self.boxName)
        elif self.monbox >= 0:
            self.ON(self.monkyName, self.boxName)

    def AT(self, x, y):
        '''猴子在y位置上'''
        print('--------' + str(x) + '在' + str(y) + '位置上--------')
    
    def BOX(self, y):
        '''箱子在y的位置'''
        print('--------箱子在' + str(y) + '位置上--------')
        
    def BAN(self, y):
        '''香蕉在y的位置'''
        print('--------香蕉在' + str(y) + '位置上--------')
    
    def OVER(self, x):
        '''x被挂在天花版上'''
        print('--------' + str(x) + '被挂在天花版上--------')
    
    def EMPTY(self, x):
        '''x手中是空的'''
        print('--------' + str(x) + '手中是空的--------')
    
    def HOLD(self, x, z):
        '''x拿着z'''
        print('--------' + str(x) + '拿着' + str(z) + '--------')
    
    def ON(self, x, w):
        '''x在w上面'''
        print('--------' + str(x) + '在' + str(w) + '的上面--------')
    
    def NOT_ON(self, x, w):
        '''x不在w的上面'''
        print('--------' + str(x) + '不在' + str(w) + '的上面--------')
    
    
    def monkeyGoBox(self):
        ''' GOTO(x,y):从x处走到y处 '''
        self.iStep = self.iStep + 1
        if self.monky != self.box:
            ''' 猴子与箱子不在同一位置 '''
            print('step' + str(self.iStep) + ': monkey从位置' + str(self.monky) + '走到位置' + str(self.box))
            if self.monbox < 0:
                self.AT(self.monkyName, self.box)
        else:
            ''' 猴子与箱子在同一位置 '''
            print('step' + str(self.iStep) + ': monkey在位置' + str(self.monky) + ', box在位置' + str(self.box) + \
                  ',猴子已经在箱子处')
    
    def monkeyMoveBox(self):
        ''' PUSH(x,y):把箱子从x处推到y处 '''
        self.iStep = self.iStep + 1
        if self.box != self.banana:
            ''' 箱子与香蕉不在同一位置 '''
            print('step' + str(self.iStep) + ': monkey把箱子从位置' + str(self.box) + '运到位置' + str(self.banana))
            self.AT(self.monkyName, self.banana)
            self.AT(self.boxName, self.banana)
        else:
            ''' 箱子与香蕉在同一位置 '''
            print('step' + str(self.iStep) + ': box在位置' + str(self.box) + ', banana在位置' + str(self.banana), \
                  ', 箱子已在香蕉处')

    def monkeyOnBox(self):
        ''' CLIMB(x):从x处爬上箱子 '''
        self.iStep = self.iStep + 1
        print('step' + str(self.iStep) + ': monkey从位置' + str(self.banana) + '处爬上箱子')
        self.ON(self.monkyName, self.boxName)
        self.monbox = 1

    def monkeyGetBanana(self):
        ''' GET(x):从x处得到香蕉 '''
        self.iStep = self.iStep + 1
        print('step' + str(self.iStep) + ': monkey从位置' + str(self.banana) + '处摘到香蕉')
        self.HOLD(self.monkyName, self.bananaName)
        
    def doWork(self):
        ''' main '''
        self.monkeyGoBox()
        self.monkeyMoveBox()
        self.monkeyOnBox()
        self.monkeyGetBanana()

# 只在当前文件作为脚本直接执行时运行,被其他脚本调用时不执行
if __name__ == '__main__':
    monkey = input("请输入猴子位置:")
    banana = input("请输入香蕉位置:")
    box = input("请输入箱子位置:")
    # 创建对象
    p = predicate(monkey, banana, box, -1)
    print('初始位置信息:')
    p.displayInit()
    
    print('操作步骤如下:')
    #请用最少步骤完成猴子摘香蕉任务
    ###########开始#############
    p.doWork()
    
    print('最终位置信息:')
    p.displayFinal()

结果:

相关推荐
985小水博一枚呀12 分钟前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
AltmanChan13 分钟前
大语言模型安全威胁
人工智能·安全·语言模型
985小水博一枚呀17 分钟前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习
数据与后端架构提升之路26 分钟前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
爱技术的小伙子32 分钟前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt
深度学习实战训练营2 小时前
基于CNN-RNN的影像报告生成
人工智能·深度学习
昨日之日20064 小时前
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
人工智能·whisper·语音识别
浮生如梦_4 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
深度学习lover4 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
热爱跑步的恒川5 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程