3

我正在用 Java 构建一个模拟。所以,我将把我的模拟分成两部分:

1) 仿真引擎

2) 仿真模型

基本上我想要一些关于如何拆分它的帮助(提示/建议),即去哪里。

所以我认为引擎会跟踪时间。它会监听事件,当事件到达时它会更新模拟的状态(我正在构建一个离散事件模拟)。仿真模型将具有 GUI,它将从实际引擎中获取逻辑和数据。我认为该模型将提供实际事件作为引擎的输入。我一直在考虑一个汽车类比,其中发动机是汽车的车身,模型是驾驶员。所以我希望它表现得像司机(模型)告诉汽车(发动机)做什么,即什么时候转弯,什么时候休息,以什么速度行驶等

你认为我以正确的方式解决这个问题吗?我能感觉到我听起来有点混乱,而且不是很清楚。所以我要澄清一下,我正在寻找的只是一些关于我应该如何拆分它以及引擎和模型的责任实际上应该是什么的输入。

另外,我想知道,如果我要实现 MVC 设计模式,这将如何适应我试图打破它的方式?

编辑:

通过模型,我的意思是我希望模拟具有一组特定的规则,然后引​​擎会遵循这些规则。当我正在构建一个道路交通模拟器时,规则可能是,汽车的分布,驾驶员资料,汽车可以做什么和不可以做什么(例如红灯停车)等。所以模型就像“大脑”如果你明白我的意思,那么模拟,然后引擎是模型指定的一组“规则”的实际模拟。我希望这更有意义。

4

3 回答 3

5

可能不是很适用,但是对于相当广泛和接受的 MVC 方法(模型-视图-控制器),控制器似乎对应于您所说的引擎。而模型就是这样——一堆简单的转储 Java 对象,逻辑尽可能少,只包含它们所代表的真实世界对象的属性。

因此,使用 MVC 进行类比,您将获得模型作为一组道路、汽车,仅包含对象的坐标,并且引擎将移动汽车、检测碰撞等。

一轮移动完成后,您将获得模型的更新版本(一些汽车以新的速度处于新位置,一些建筑物正在燃烧(呵呵)等)。您将处理这个更新的模型到您的视图(无论它可能是什么)以进行渲染。

我在这里唯一不确定的是系统的哪个部分将提供输入事件。在通常的 MVC 中,这是一些外部实体(通常是人工操作员)。如果事件是指人工输入,那么对于您的应用程序也是如此。如果您的意思是诸如由于汽车运动而引起的碰撞之类的事件,那么引擎本身将根据模拟的每个步骤的计算结果来产生此类事件。

虽然,这不是很经典的 OO 设计。在经典的 OO 设计中,您会得到具有内部逻辑的模型类,例如汽车,这将定义,例如,汽车突然改变它的速度。我不会走这条路,因为它使您的代码逻辑分布在模型类和控制器类之间。您在世界开始时拥有一组模型对象,前进的唯一方法是通过引擎决策来影响它们或拥有真正的外部输入(例如来自人类的 GUI 输入)。如果你需要模型对象来改变它的行为,它应该是引擎代码的责任,而不是模型代码。

对不起,这个相当不连贯的猜测,这是一个相当广泛的话题,有很多关于这些事情的书。

于 2012-10-25T21:33:35.160 回答
2

您没有给我们足够的信息来真正帮助您勾画出您的模拟,但这里有一个很好的提示:任何您可以识别为事物的东西都应该是一个对象。所以做一个类Car。还有一类TrafficLight。然后做一个类Driver,每个类Car都有一个字段Driver。并且 aRoad会有一个List<Car>

在开始考虑如何实现 MVC 框架之前,请确保您了解它是什么。. MVC 最重要的是它是关于用户如何与 Universe 交互的。因此,例如,如果您正在编写一个名为 SimTraffic 的游戏,您会需要 MVC,因为您不仅需要交通模拟,而且用户也需要以某种方式控制它。如果您只是观看模拟的发生(没有交互),请不要担心 MVC。

于 2012-10-25T21:30:51.170 回答
1

忘记图形用户界面。请从物理开始——有数十种交通模拟;我假设您至少已经阅读过一本关于该主题的书,如果没有,现在是时候阅读了:起点可以是 Springer 出版的关于各种现代模型的论文集,称为交通模拟基础 (ISBN 1441961410),Jaume巴塞罗(编辑)(2010 年)。

编辑:建议首先确定您的模拟范围;什么是不变的假设?它将在什么时间段内进行调整?路网会改变吗?你允许车祸、酒后驾车的白痴、围观者从车祸现场为 Youtube 拍摄电影吗?

您需要从 sim 获得什么精度 - 您希望将其用于城市规划、环境控制或交通管理吗?你设置的变量和参数是什么?您是否有统计数据来验证您的模拟和测试预测?您是否有关于您的模型宇宙/城市中汽车/驾驶员物理特征的现成数据(加速度、线性大小、违反交通规则的倾向)?在您坐下来编写代码之前,应该回答很多问题......

编辑#2:从您对@Victor Sorokin 的回答的评论中,我认为您有一个很好的想法,将驾驶员的期望添加到模型中 - 将使驾驶员的 AI 成为编码的第一件事:是的,最短路径,但解决方案最短路径问题来自陈旧数据(可能存在可变延迟)。如果你给司机完美的远见,就不会有任何碰撞;如果你让它们变得不完美,你将不得不对感觉输入进行建模,也许可以归结为检测到来车的特定方向的概率。当然,这会消耗大量的 CPU 周期。

于 2012-10-25T21:47:40.503 回答