vas*_*sco 6 java architecture simulation agent
我必须用Java制作模拟器,它将模拟在高速公路上骑车.高速公路上应该有3条车道,每条车道都有恒定速度的车.在这条高速公路上,有一个代理商,必须穿过而不会撞到任何其他车辆.详细描述可以在本文的2.5节和图5中找到.
这张图片来自提到的纸张,显示了高速公路的外观:
我的目标是只编写模拟器(和GUI),而不是代理逻辑.现在,我想设计一个这个模拟器的架构,这是我需要帮助的地方.
我的想法,代理的API看起来如何:
public abstract class BaseAgent {
public abstract void run()
public abstract void onCrash();
}
Run Code Online (Sandbox Code Playgroud)
高速公路上的特工(汽车)应该是这个班级的后代.在每一步中,模拟器调用函数run()
在哪里是代理逻辑.在此函数中,代理可以调用以下函数:
goLeft();
goRight();
getNearestCarInLane(int lane_no);
getMySpeed();
Run Code Online (Sandbox Code Playgroud)
因此,在每一步中,代理人都可以决定他是否留在当前车道,或者他是左转还是右转.这就是代理人可以做的事情.
所以这是代理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.
Run Code Online (Sandbox Code Playgroud)
这不是一个好的架构.哪个类应该是方法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);
Run Code Online (Sandbox Code Playgroud)
这很可怕也很难看.
所以我需要一些聪明人的帮助.有人可以给我一个关于书籍,文章,模拟器/架构的链接吗?或者解释一下我做错了什么?
我不是程序员,这个项目是我的教师名为软件工程的可选课程的一部分.
我的建议是有正式的概念设计了代理界面智能代理记:从模拟的角度来看,它是接收黑匣子知觉从其环境中(例如,传感器数据),然后在一定的决定作用(例如,向左或向右转向汽车).
基于此定义并假设一个简单的离散逐步模拟,您的代理类可能如下所示:
public abstract class BaseAgent {
public AgentAction act(HighwayPerception hwyPerception);
}
Run Code Online (Sandbox Code Playgroud)
其中,AgentAction
将代表的动作类型的代理可以决定在一个单一的步骤(在最简单的情况下这样做,这将是具有价值的枚举STEER_LEFT
,STEER_RIGHT
等等---对于更复杂的问题,你可以定义一个全班具有AgentAction
超类/接口的层次结构).模拟器的工作是解释AgentAction
代理返回的对象并相应地改变其环境(即Highway
对象)的状态.
HighwayPerception
另一方面,该参数表示代理在当前时间步骤能够感知的所有内容:例如,汽车(getMySpeed()
)的速度或到下一辆汽车的距离(getNearestCarInLane(int laneNumber)
).这避免了将代理直接耦合到其环境(即Highway
),这很重要,因为它将关注点分开:代理只感知其环境决定操作,而不是直接与之交互.同样,在给定当前环境状态的情况下,模拟器的工作是为代理创建感知.
最后,这种设计还使控制代理更容易.该HighwayPercept
班必须被设计成只能用于读取代理的数据应该能够察觉,不直接影响周围的环境.相比之下,原始设计中的代理可以访问这样的Highway
对象,因此可以尝试欺骗,例如,向see
前方几英里的车辆作弊并相应地规划其路线,或仅改变高速公路上其他车辆的位置.即使您不太关心安全性,也应该永远不可能这样做,因为这些事情也可能无意中发生并且可能很难调试.
根据您的要求,您的架构当然可能需要更加复杂.从多代理仿真系统的文献中可以很容易地获得更多信息(这是您的问题的概括,即可以模拟几个代理在您的高速公路上行驶).这个领域正在进行大量研究,您可能需要查看多种代理模拟工具(例如Repast).