• 背景简介/问题描述

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

  • 算法介绍

2.1 猴子摘香蕉问题PEAS

性能

环境

执行器

感知器

猴子站在箱子上

香蕉

Move

Site

猴子摘到香蕉

箱子

Climb

Hold

位置

Push

On

Grasp

Hang

Jump

2.2定义谓词

Site(x,w):物体x的位置是w

Hold(z):z手中拿着香蕉

On(z):z站在了箱子上

Hang(y,w):y悬挂在位置w

2.3定义变元定义域:

x∈{猴子,箱子}

y∈{香蕉}

z∈{猴子}

w∈{a,b,c}

2.4定义操作:

Move(u,v):猴子从u走到v

Climb():猴子爬上了箱子

Push(u,v):猴子推着箱子从u走到v

Grasp():猴子拿到了香蕉

Jump():猴子从箱子上跳下来

2.5定义初始状态与目标状态

S0=Site(Monkey,a)

^Hang(Banana,b)

^Site(Box,c)

^¬On(Monkey)

^¬Holds(Monkey)

Sg=Site(Monkey,b)

^¬Hang(Banana,b)

^Site(Box,b)

^¬On(Monkey)

^Holds(Monkey)

2.6各操作条件与动作

Move(u,v)

条件:¬On(Monkey),Site(Monkey,u)

动作:删除表:Site(Monkey,u) 添加表Site(Monkey,v)

Push(v,u)

条件:¬On(Monkey),Site(Monkey,v),Site(Box,v)

动作:删除表:Site(Monkey,v);Site(Box,v)

添加表:Site(Monkey,w);Site(Box,w)

Climb()

条件:¬On(Monkey),Site(Monkey,v),Site(Box,v)

动作:删除表:¬On(Monkey)

添加表:On(Monkey)

Grasp()

条件:On(Monkey),Site(Box,b),Hang(Banana,b)

动作:删除表: ¬Holds(Monkey),Hang(Banana,b)

添加表:Holds(Monkey),¬Hang(Banana,b)

Jump()

条件:Hold(Monkey),On(Monkey)

动作:删除表:On(monkey)

添加表:¬On(monkey)

2.7求解过程

S0=Site(Monkey,a)

^Hang(Banana,b)

^Site(Box,c)

^¬On(Monkey)

^¬Holds(Monkey)

——执行Move(u,v)

S1=Site(Monkey,c)

^Hang(Banana,b)

^Site(Box,c)

^¬On(Monkey)

^¬Holds(Monkey)

——执行Push(v,w)

S2=Site(Monkey,b)

^Hang(Banana,b)

^Site(Box,b)

^¬On(Monkey)

^¬Holds(Monkey)

——执行Climb()

S3=Site(Monkey,b)

^Hang(Banana,b)

^Site(Box,b)

^On(Monkey)

^¬Holds(Monkey)

——执行Grasp()

S4=Site(Monkey,b)

^¬Hang(Banana,b)

^Site(Box,b)

^On(Monkey)

^Holds(Monkey)

——执行Jump()

Sg=Site(Monkey,b)

^¬Hang(Banana,b)

^Site(Box,b)

^¬On(Monkey)

^Holds(Monkey)

  • 算法实现

3.1 实验代码

Banana类

package monkey;

public class Banana {

private final Position banana_position=new Position();

private boolean Hang=true;

public Position getBanana_position() {

return banana_position;

}

public void setBanana_position(int x,int y){

banana_position.setPosition(x,y);

}

public boolean isHang() {

return Hang;

}

public void Grasp(){

Hang=false;

}

}

Box类

package monkey;

public class Box {

private final Position box_position=new Position();

private boolean OnBox=false;

public void setBox_position(int x,int y){

box_position.setPosition(x,y);

}

public void Push(Monkey monkey,int x,int y){

monkey.Move(x,y);

System.out.println("the box is being pushed from("+box_position.getX()+','

+box_position.getY()+")to("+x+','+y+")");

box_position.setPosition(x,y);

}

public void Jump(){

if(OnBox){

OnBox=false;

System.out.println("the monkey has jumped off the box");

}

else{

System.out.println("the monkey is standing under the box");

}

}

public void Climb(){

if(!OnBox){

OnBox=true;

System.out.println("the monkey has climbed on the box");

}

else{

System.out.println("the monkey is standing on the box");

}

}

public Position getBox_position() {

return box_position;

}

public boolean isOnBox() {

return OnBox;

}

}

Monkey类

package monkey;

public class Monkey {

private final Position monkey_position=new Position();

public void setMonkey_position(int x,int y) {

monkey_position.setPosition(x,y);

}

public void Move (int x,int y){

System.out.println("the monkey is going from("+monkey_position.getX()+','

+monkey_position.getY()+")to("+x+','+y+")");

monkey_position.setPosition(x,y);

}

public Position getMonkey_position(){

return monkey_position;

}

}

Position类

package monkey;

import java.util.Objects;

public class Position {

private int x;

private int y;

public int getX() {

return x;

}

public int getY() {

return y;

}

public void setPosition(int x,int y){

this.x=x;

this.y=y;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Position position = (Position) o;

return x == position.x && y == position.y;

}

@Override

public int hashCode() {

return Objects.hash(x, y);

}

}

Main类

package monkey;

import java.util.Scanner;

import static java.lang.System.exit;

public class main {

public static void main(String[] args) {

int x,y;

Monkey monkey = new Monkey();

Banana banana = new Banana();

Box box = new Box();

Scanner sc =new Scanner(System.in);

System.out.println("Please Enter the position of the banana(x,y):");

x=sc.nextInt();

y=sc.nextInt();

banana.setBanana_position(x,y);

System.out.println("the banana is hanging at ("+banana.getBanana_position().getX()+','

+banana.getBanana_position().getY()+')');

System.out.println("Please Enter the position of the box(x,y):");

x=sc.nextInt();

y=sc.nextInt();

box.setBox_position(x,y);

System.out.println("the box is at ("+box.getBox_position().getX()+','

+box.getBox_position().getY()+')');

System.out.println("Please Enter the position of the monkey(x,y):");

x=sc.nextInt();

y=sc.nextInt();

monkey.setMonkey_position(x,y);

System.out.println("the monkey is at ("+monkey.getMonkey_position().getX()+','

+monkey.getMonkey_position().getY()+')');

if(!monkey.getMonkey_position().equals(box.getBox_position())){

monkey.Move(box.getBox_position().getX(),box.getBox_position().getY());

}

if(!monkey.getMonkey_position().equals(banana.getBanana_position())){

box.Push(monkey,banana.getBanana_position().getX(),banana.getBanana_position().getY());

}

box.Climb();

banana.Grasp();

if(!banana.isHang())

System.out.println("the monkey has grasped the banana.");

exit(0);

}

}

  • 讨论及结论

环境可理解为java的对象类,动作器可理解为方法,感受器可理解为参数,我们要尽可能防止表示泄露,因此设置参数用private、setter、getter的组合来传递以及更改参数,而且要时刻记得checkRep,此外猴子摘香蕉问题,猴子会主动搬箱子,抓取香蕉,以及爬上或跳下箱子。那我们在构造方法时应该在哪一个类中构建呢?我们主观印象会觉得猴子是主语,他做出了这些动作,应该将方法都添加到猴子类中,但事实上,我们会发现将方法添加到宾语,也就是箱子、香蕉这些类会更加方便,这是因为虽然猴子爬上或搬箱子,别的动物甚至某种类也可以完成这些动作,可以被搬,可以被攀爬或跳下是箱子的属性,因此我们在构造方法时要先判断好对谁创建一个方法,入参、返回值,规约,检查入口。这些对编写java程序至关重要。

参考文献

注:报告中图的下方要有图题(如图1. XXXX),表格需要用三线表,表头需列在表的上方(如表1. XXXX)。图表居中排列。

用软件构造的思想解决猴子摘香蕉问题相关推荐

  1. 用软件构造的思维理解猴子摘香蕉问题

    背景简介/问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态 ...

  2. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次.docx...

    人工智能课内实验报告(8次)学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号: 目 录课内实验1:猴子摘香蕉问题的VC编程实现--------1课内实验2:编程实现简单动 ...

  3. 【C++】人工智能实验一 猴子摘香蕉/传教士与野人(含完整代码与状态迁移图)

    文章目录 一.猴子摘香蕉问题 1.问题描述 2.解题思路 3.实验结果及分析 实验结果一 实验结果二 实验结果三 4.实验结果 5.实验代码 二.传教士(牧师)与野人问题 1.问题描述 2.实验步骤 ...

  4. 猴子摘香蕉问题python_硬币找零爬楼梯猴子摘香蕉

    硬币找零&&爬楼梯&&猴子摘香蕉 假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. #include"CoinPr ...

  5. Python猴子摘香蕉问题

    Python猴子摘香蕉问题 房子里有一只猴子(即机器人,可在房间里任意活动:到处走动,推移箱子,攀登箱子等),初始位于a处.在b处上方的天花板上有一串香蕉,猴子想吃,但摘不到.房间的c处还有一个箱子, ...

  6. 人工智能猴子摘香蕉问题

    猴子摘香蕉问题: 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下 ...

  7. JAVA语言写的人工智能小实验——猴子摘香蕉

    背景简介/问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态 ...

  8. 猴子摘香蕉问题-人工智能模拟

    题目: 利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图1所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上.请定义必要的谓词,列出问题的 ...

  9. 【SC应用】【人工智能】Java实现猴子摘香蕉,动画显示

    人工智能课程实验一的任务,写出猴子摘香蕉问题的知识表示,并用代码实现推理过程 问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一 ...

最新文章

  1. MySql错误处理(三)- 错误处理的例子
  2. php引用地址,关于php的引用
  3. 《PHP和MySQL Web开发》学习之二--数据的存储与检索
  4. pandas 或者字段值_pandas用法总结
  5. 语法分析实验ll算法c语言,实验5LL语法分析程序的设计与实现(C语言).doc
  6. [initandlisten] connection refused because too many open connections: 819 of 819
  7. chrome 不记录填写值_【转载】禁用自动填表'autocomplete=off'在Chrome 中不起作用...
  8. 【题解报告】Leecode367. 有效的完全平方数——Leecode每日一题系列
  9. iOS 如果刷新TableViewCell上得数据是空的 添加尾部暂无数据提示
  10. 智能门禁(6)---调用face++实现人脸检测
  11. h5 在线语音识别接口
  12. oracle 回滚空间查询,Oracle回滚段空间回收步骤
  13. XStream实现缓存
  14. 自动驾驶 9-2: 卡尔曼滤波器和偏置BLUEs Kalman Filter and The Bias BLUEs
  15. DiskFileUpload上传文件并获取前端表单数据
  16. 【高速PCB电路设计】8.DDR模块设计实战
  17. 用友U8去除凭证外部凭证标记
  18. Matlab中的plotyy细讲(双坐标图)
  19. 邮箱登录名身份证号码等验证
  20. LeetCode-1276. 不浪费原料的汉堡制作方案

热门文章

  1. 鸿钧老祖 数据结构笔记01:编程面试过程中常见的10大算法(java)
  2. 认购定增股份是什么意思?
  3. C++ strcat 函数实现字符串拼接报错
  4. reactos 编译,安装篇
  5. Java 优雅判空的方法
  6. PLC模糊控制模糊PID(梯形图实现+算法分析)
  7. C++ Opencv imfill 孔洞填充函数的实现(更新后)
  8. WebSecurity
  9. 不要在大城市中迷失了自己
  10. 车云链总经理赵大宝接待房车露营专委会秘书长吴宝忠