对猴子摘香蕉问题给出产生式系统描述_猴子接香蕉的编程

对猴子摘香蕉问题给出产生式系统描述_猴子接香蕉的编程一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为A,香蕉位置在B,箱子位置为C),如何行动可摘取到香蕉2.1猴子摘香蕉问题PEAS性能环境执行器感知器猴子站在箱香蕉MoveSite子上摘到香箱子ClimbHold蕉房间(a,b,c)PushOnGraspHangJump2.2定义谓词Site(x,w):物体x的位置是wHold(z):z手中拿着香蕉On(z):z

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

  • 背景简介/问题描述

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

  • 算法介绍

2.1猴子摘香蕉问题PEAS

性能

环境

执行器

感知器

猴子站在箱

香蕉

Move

Site

子上摘到香

箱子

Climb

Hold

房间(a,b,c)

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定义初始状态:

设置综合数据库(五元组):{Monkey,Banana,Box,On,Hang}

其中Monkey表示猴子现在位置(a,b,c)

Banana表示香蕉现在位置(a,b,c)

Box表示箱子现在位置(a,b,c)

On表示猴子是否站在箱子上(0:未站在1:已站在)

Hang表示香蕉是否悬挂(0:未悬挂1:悬挂)

则初始状态表示为{m,b,box,0/1,1}(若On=1,则m==box)

接受状态表示为{b,b,b,1,0}

2.6定义规则集(根据操作集):

R1:Move(x,w):{x,y,z,0,1}->{w,y,z,0,1}

R2:Climb():{x,y,x,0,1}->{x,y,x,1,1}

R3:Push(x,w):{x,y,x,0,1}->{w,y,w,0,1}

R4:Grasp():{x,x,x,1,1}->{x,x,x,1,0}

R5:Jump():{x,y,x,1,1}->{x,y,x,0,1}

2.7执行步骤:

根据初始状态和接受状态,有如下操作判断

对猴子摘香蕉问题给出产生式系统描述_猴子接香蕉的编程

  • 算法实现

使用java,设计box类、monkey类、banana类、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);
    }
}

其中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;
    }
}

其中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;
    }
}

其中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;
    }
}

其中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程序至关重要。

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

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

(0)
上一篇 2026年4月13日 下午9:07
下一篇 2026年4月13日 下午9:13


相关推荐

  • Linux系统下 lsof命令详解

    Linux系统下 lsof命令详解写在前面 你好 欢迎关注 我热爱技术 热爱分享 热爱生活 我始终相信 技术是开源的 知识是共享的 博客里面的内容大部分均为原创 是自己日常的学习记录和总结 便于自己在后面的时间里回顾 当然也是希望可以分享自己的知识 目前的内容几乎是基础知识和技术入门 如果你觉得还可以的话不妨关注一下 我们共同进步 个人除了分享博客之外 也喜欢看书 写一点日常杂文和心情分享 如果你感兴趣 也可以

    2026年3月17日
    2
  • Python连接MySQL数据库方法介绍(超详细!手把手项目案例操作)

    Python连接MySQL数据库方法介绍(超详细!手把手项目案例操作)作者 CDA 数据分析师来源 CDA 数据分析研究院本文涉及到的开发环境 操作系统 Windows10 数据库 MySQL8 0Python3 7 2pip19 0 3 两种方法进行数据库的连接分别是 PyMySQL 和 mysql connector 步骤 连接数据库生成游标对象执行 SQL 语句关闭游标关闭连接 PyMySQLPyMyS 是封装了 M

    2026年3月19日
    1
  • USB协议基础篇

    USB协议基础篇初次接触USB的同学,可能会被里面各种名词给搞晕,下面就来梳理一下这些知识,希望能帮助大家理解USB。文章目录 一,从最常见的名词说起 1.1什么是USB 1.2USB协议版本 1.3USB接口分类 1.4PIPE 1.5endpoint 1.6管道通信方式 1.7传输方式 1.7逻辑设备 1.8interface 1.9class协议 1.10host/device 二,USB框架/拓扑结构

    2022年6月18日
    45
  • java中高级面试题总结(全面)_java高级面试题大汇总

    java中高级面试题总结(全面)_java高级面试题大汇总参考了网上的面试题,整理了一份面试题的资料。String,StringBuffer,StringBuilder的区别是什么?String为什么是不可变的?String是字符串常量,后两者是字符串变量。其中,StringBuffer是线程安全的,而StringBuilder是非线程安全的,线程安全会带来额外的开销,所以StringBuilde

    2022年8月21日
    9
  • 国产FPGA芯片替代选型需要注意的几点

    国产FPGA芯片替代选型需要注意的几点最近公司在进行 FPGA 国产化方案的准备工作 正在做市场的调研 也约了国内几家 FPGA 厂商的市场工程师来交流 关于 FPGA 我算是半路出家 毕业后做了一年左右的 MCU 开发 后来由于项目需要接触到 FPGA 开发 然后学习了 FPGA 之后就一直做 FPGA 相关的工作 其实我真正使用 FPGA 的时间也不过短短 4 年 电子电路开发学习精通 STM32 FPGA 实现流水灯 程序下载与擦除 IDE 安装与卸载 分享开源项目 板卡评测 学习笔记相关文章 可能不会经常更新 但每一篇都是精心编写 170 篇原创内容公众号本文来聊聊目前国

    2026年3月26日
    2
  • tabnine 激活码【2021免费激活】

    (tabnine 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~DB847YMYYZ-eyJsaWNlb…

    2022年3月26日
    46

发表回复

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

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