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

对猴子摘香蕉问题给出产生式系统描述_猴子接香蕉的编程一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 机器学习及深度学习基础—7.20课堂笔记

    机器学习及深度学习基础—7.20课堂笔记本文主要回忆上课所讲的一些关于机器学习与深度学习的基本概念,以此来达到强化记忆与深度理解的目的。

    2022年6月16日
    25
  • QAS传输

    QAS传输 *StartSTMS   *Usethemenu”Extras-otherrequests-Add”   *enterthetransportnumberandclickthe”Importagain”buttonNowyoucanre-importtherequest. 

    2022年6月28日
    37
  • 分治算法详解_算法的优劣通常用什么来衡量

    分治算法详解_算法的优劣通常用什么来衡量分治算法详解 一、基本概念  在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……   任何一个可以用计算机求解的问

    2025年8月14日
    2
  • java定时任务接口ScheduledExecutorService

    java定时任务接口ScheduledExecutorService一、ScheduledExecutorService设计思想ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说

    2022年7月1日
    28
  • 2021年十大开源web应用防火墙

    2021年十大开源web应用防火墙开源web应用防火墙是网络安全的重要部分,Cloudflare认为:十年后数字经济的网络安全基础设施会像水过滤系统一样普及,而这个过滤系统的核心就是waf。对于服务器来说,部署WEB应用防火墙十分重要,笔者经过大量搜索,并结合市场热度,整理出2021年十大开源web应用防火墙。1、OpenRestyOpenResty是由中国人章亦春发起,把nginx和各种三方模块的一个打包而成的软件平台,核心就是nginx+lua脚本语言。主要是因为nginx是C语言编写,修改很复杂,而lua语言则简单得多,国内很多

    2022年6月2日
    193
  • java的hashmap用法_java hash函数

    java的hashmap用法_java hash函数摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(JavaDevelopmetKit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。简介Java为数据结构中的映射定义了一个接口java.util.Map,…

    2025年10月18日
    5

发表回复

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

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