人工智能——猴子摘香蕉问题
一、实验目的
求解猴子摘香蕉问题,根据猴子不同的位置,求解猴子的移动范围,求解对应的过程,针对不同的目标状态进行求解。
二、实验内容
根据场景有猴子、箱子、香蕉,香蕉挂天花板上。定义多种谓词描述位置、状态等。
有从一处走到另一处、推箱子、爬到箱子、拿到香蕉 4 种操作。需输出猴子摘香蕉的四步步骤及对应谓词,从初始状态(猴子位置、箱子位置、香蕉位置,香蕉挂天花板、猴手空、猴不在箱上)达到目标状态(猴拿香蕉且在箱上)。
# -*- 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()
结果: