如何建立仿真架构,OO设计

时间:2012-10-25 20:49:16

标签: java model-view-controller design-patterns simulation oop

我正在用Java构建模拟。所以,我将我的模拟分为两部分:

1)模拟引擎

2)模拟模型

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

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

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

另外,我想知道,如果我要实现MVC设计模式,那么我将如何解决这个问题?

编辑:

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

3 个答案:

答案 0 :(得分:5)

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

因此,使用MVC的这个类比,你会得到你的模型作为道路,汽车的集合,只包含对象的坐标和引擎将移动汽车,检测碰撞等。

一轮完成后,您将获得模型的更新版本(一些车辆处于新位置,新速度,一些建筑物燃烧(嘿)等)。并且您将处理这个更新的模型到您的视图(无论它是什么)进行渲染。

我唯一不确定的是系统的哪个部分将提供输入事件。在通常的MVC中,这是一些外部实体(通常是人类操作员)。如果事件是指人类输入,那么对于您的应用程序来说它将是相同的。如果你的意思是碰撞等事件,比如汽车的运动 - 那么它的引擎本身会产生这样的事件,就像模拟每一步的计算结果一样。

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

对于这个相当不连贯的猜测感到抱歉,这是一个相当广泛的主题,并且有很多关于此类事情的书籍。

答案 1 :(得分:2)

你还没有给我们足够的信息来真正帮助勾画出你的模拟,但这里有一个很好的提示:任何你认为是一件东西应该是一个对象。所以上课Car。一堂课TrafficLight。然后创建课程Driver,每个Car都有一个字段Driver。而Road会有List<Car>

在开始考虑如何实现MVC框架之前,请确保您理解what it is.。关于MVC最重要的是它是关于用户如何与宇宙交互。因此,如果您正在编写一个名为SimTraffic的游戏,那么您需要MVC,因为您不仅需要进行流量模拟,而且用户也需要以某种方式控制它。如果您只是在观看模拟(没有交互),请不要担心MVC。

答案 2 :(得分:1)

忘记GUI。请从物理学开始 - 有很多交通模拟;我假设你已经阅读过至少一本关于这个主题的书,如果不是这样的话,那么:起点可能是施普林格出版的各种现代模型的论文集,称为交通模拟基础(ISBN 1441961410),Jaume Barcelo(编辑)(2010)。

编辑:建议先决定你的SIM卡的范围;什么是不变的假设?它将在什么时间段内调整?道路网络会改变吗?你是否允许汽车碰撞,DUI白痴,旁观者从坠机现场为Youtube拍电影?

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

编辑#2:从你的评论到@Victor Sorokin的回答,我知道你很清楚将驱动程序的期望添加到模型中 - 会使驱动程序的AI成为第一个编码的东西:是的,最短的路径,但是最短路径问题的解决方案来自陈旧数据(可能有可变延迟)。如果你给司机完美的远见,就不会有任何崩溃;如果你使它们不完美,你将不得不模拟感官输入,或许归结为检测来车的方向特定概率。当然,它会占用大量的CPU周期。