gpt4 book ai didi

java - 这个模拟器的最佳架构是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:56 24 4
gpt4 key购买 nike

我必须用 Java 制作一个模拟器,它将模拟在高速公路上行驶的汽车。高速公路应该有3条车道,每条车道上都有匀速行驶的汽车。在这条高速公路上,有一个特工必须开车通过并且不能撞到任何其他汽车。详细说明参见this paper在第 2.5 节和图片 5。

这张图片来自提到的论文,展示了高速公路的样子:

enter image description here

我的目标是只写一个模拟器(和 GUI),而不是代理的逻辑。现在,我想设计这个模拟器的架构,这正是我需要帮助的地方。

我的想法,代理的 API 看起来是这样的:

public abstract class BaseAgent {
public abstract void run()
public abstract void onCrash();
}

高速公路上的代理(汽车)应该是这个类的后代。在每一步中,模拟器调用函数 run() 代理逻辑在哪里。在这个函数中,代理可以调用​​如下函数:

goLeft();
goRight();
getNearestCarInLane(int lane_no);
getMySpeed();

因此,在每一步中,智能体都可以决定他是留在当前车道上,还是左转或右转。仅此而已,代理可以做什么。

所以这是代理 API,但我不知道如何设计模拟器的其余部分。我对模拟器架构的第一次尝试是:

class Agent — descendant of BaseAgent, can ride on highway.
class Highway — stores position of all cars on highway.
class Simulator — creates instance of agent and highway; in every step, call agent’s `run()` and monitors any car crash.

这不是一个好的架构。 goLeft()goRight()getNearestCarInLane() 方法应该在哪个类中?因为这些方法必须在 BaseAgent 类中,而且必须知道高速公路上每辆车的位置。所以最后,我有这样的事情:

Simulator s = new Simulator();
Highway h = new Highway();
Agent a = new Agent();

s.setAgent(a);
s.setHighway(h);
a.setHighway(h);
h.setAgent(a);

它又丑又丑。

所以我需要这里聪明人的一点帮助。有人可以给我链接到书籍、文章,无论是关于模拟器/架构的吗?或者解释我做错了什么?

我不是程序员,这个项目是我所在学院名为软件工程的选修类(class)的一部分。

最佳答案

我的建议是使用intelligent agent 的正式概念设计代理的界面。 in mind:从模拟的角度来看,它是一个黑匣子,可以从其环境中接收感知(例如,传感器数据),然后决定某个 Action (例如,向左或向右驾驶汽车)。

基于此定义并假设一个简单的离散逐步模拟,您的代理类可能如下所示:

public abstract class BaseAgent {
public AgentAction act(HighwayPerception hwyPerception);
}

其中 AgentAction 是表示代理可以决定在单个步骤中执行的操作的类型(在最简单的情况下,这将是一个具有值 STEER_LEFT 的枚举) >、STEER_RIGHT 等 --- 对于更复杂的问题,您可以使用 AgentAction 定义整个类层次结构作为父类(super class)/接口(interface))。模拟器的工作是解释代理返回的 AgentAction 对象并相应地更改其环境状态(即 Highway 对象)。

另一方面,参数 HighwayPerception 表示代理在当前时间步能够感知的所有内容:例如,汽车的速度(getMySpeed()) 或到下一辆车的距离 (getNearestCarInLane(int laneNumber))。这避免将代理直接耦合到它的环境(即Highway)——这很重要,因为它分离关注点:只有代理感知他们的环境决定行动,而不是直接与之互动。同样,模拟器的工作是根据当前环境状态为代理创建感知。

最后,这种设计还更容易控制代理HighwayPercept 类必须设计成只能用于读取代理应该能够感知的数据,而不是影响直接周围的环境。相比之下,您原始设计中的代理可以访问 Highway 对象,因此可以尝试作弊,例如,查看前方几英里的汽车并相应地规划其路线,或者只是改变高速公路上其他汽车的位置。 这永远不可能,即使您不太关心安全性,因为这样的事情也可能无意中发生并且调试起来可能很棘手。

根据您的要求,您的架构当然可能需要更加复杂更多信息应该很容易从关于 multi-agent simulation systems 的文献中获得(这是对您的问题的概括,即可以模拟几个代理在您的高速公路上行驶)。该领域正在进行大量研究,您可能需要查看多种用于多代理模拟的工具(例如 Repast )。

关于java - 这个模拟器的最佳架构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com