【问题标题】:How to set up simulation architecture, OO design [closed]如何建立模拟架构,OO设计[关闭]
【发布时间】:2012-10-16 03:13:45
【问题描述】:

我正在用 Java 构建一个模拟。因此,我将模拟分为两部分:

1) 仿真引擎

2) 仿真模型

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

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

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

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

编辑:

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

【问题讨论】:

  • 你想模拟什么?将“引擎”与“模型”分开是没有意义的(除非您正在为成千上万的用户和数百万用户构建一个非常通用的框架)。另外,我可以看到您没有对“模型”一词应用一致的定义。请从描述问题的物理原理开始。
  • 很抱歉。请查看编辑

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答 :) 我发现该链接有助于增加我对 MVC 的了解。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 非常好的答案。我发现它非常有帮助,所以根本不需要为不连贯的推测道歉:) 在这个模拟中,输入事件将是外部实体(人类)和模拟本身的逻辑的混合,它将提供例如事件崩溃。在用户交互方面,我正在考虑关闭道路,这会导致司机找到一条替代的最短路线(例如 dijkstra 算法)。无论如何,我喜欢你将它与 MVC 设计模式相匹配的方式,它帮助理清了一些事情,并给了我一些关于如何设置它的想法。谢谢:)
【解决方案3】:

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

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

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

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

【讨论】:

  • 感谢您的推荐
  • 我需要的模拟精度如下。我将有一个道路网络,最初会有随机分布的汽车进入。会有路口会有红绿灯。我将在高峰时间分配更多车辆,这将导致排队。排队将影响驾驶员档案,进而导致更大的碰撞机会。实际碰撞不会详细说明。它将是最低限度的动画,但仅从 2d 角度来看,并且碰撞将对相关道路产生影响
  • 此外,道路将可以关闭和打开。这会明显影响排队,让司机们选择其他路线。道路的关闭和开放是一种用户交互。模拟的全部目的是实现潜在的瓶颈。在我启动并运行模拟之后,我将根据真实的统计数据来计算汽车、事故等的分布,稍后我会得到这些数据。一般来说,我确实知道模拟的范围。我已经定义了我想要的和不想要的。
  • 如果您将碰撞概率设为概率,则相关问题将是您想要整合汽车数量的区域(使碰撞机会成为密度的函数)。从您的描述中可以清楚地看出,a)所有汽车的非常高维的状态向量,b)离散控制变量(打开/关闭道路)-在现实生活中也有不同的灯光周期,c)高度非线性方程运动(驾驶员解决导航问题的结果),d)迫切需要在蒙特卡洛模式下运行模拟,因为您希望结论对异常值具有鲁棒性。
  • 有趣的评论。谢谢你。你已经启发了我需要进一步思考的一些领域。但一开始我的目标很简单,即有一条与两条道路的交叉口,以及一辆服从交通信号灯的汽车。我知道非常简单,但是当我拥有它时,我可以扩展它,因为让整个动画等工作对我来说也是一个挑战,因为我没有过多地使用动画,甚至实际上甚至没有使用 Swing。有很多工作要做:) 感谢您的时间和投入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多