我正在用Java构建一个模拟程序。因此,我将把我的模拟分成两部分:
1)模拟引擎
2)仿真模型
基本上,我需要一点帮助(提示/建议)关于如何拆分它,也就是说,什么东西放在哪里。
所以我认为引擎会记录时间。它将监听事件,当事件到达时,它将更新模拟的状态(我正在构建一个离散事件模拟)。模拟模型将具有GUI,它将从实际引擎获取逻辑和数据。我认为模型会将实际事件作为输入提供给引擎。我一直在想一个汽车的类比,引擎是车身,模型是司机。所以我希望它的行为就像司机(模型)告诉汽车(引擎)做什么,即何时转弯,何时刹车,以多高的速度行驶等。
你认为我处理这件事的方式正确吗?我能感觉到我听起来有点困惑,也不是很清楚。所以我要澄清的是,我正在寻找的只是一些输入,关于我应该如何划分它,以及引擎和模型的责任实际上应该是什么。
此外,我想知道,如果我要实现MVC设计模式,它将如何适应我试图分解它的方式?
编辑:
通过模型,我的意思是我希望模拟有一组特定的规则,然后引擎遵循这些规则。当我构建一个道路交通模拟器时,规则可以是,汽车的分布,驾驶员的配置文件,汽车可以和不可以做什么(例如,红灯时停车)等。因此,如果你明白我的意思,那么模型就像模拟的“大脑”,然后引擎是模型指定的一组“规则”的实际模拟。我希望这更有意义。
发布于 2012-10-26 05:33:35
可能不是很适用,但对于MVC方法(模型-视图-控制器),这是相当广泛和被接受的,控制器似乎对应于你所说的引擎。模型就是这样--一堆简单的转储Java对象,逻辑尽可能少,只包含它们所表示的真实对象的属性。
因此,使用MVC进行类比,你会得到一组道路,汽车,只包含物体坐标的模型,引擎将移动汽车,检测碰撞等。
在一轮的移动完成后,你会得到一个新版本的模型(一些汽车在新的位置以新的速度,一些建筑物正在燃烧(嘿),等等)。您将处理这个更新后的模型到您的视图(无论它是什么)以进行渲染。
这里我唯一不确定的是系统的哪个部分将提供输入事件。在通常的MVC中,这是一些外部实体(通常是人工操作员)。如果您所说的事件指的是人工输入,那么对于您的应用程序来说也是如此。如果你指的是像碰撞这样的事件,比如汽车的运动--那么引擎本身就会在模拟的每一步中产生这样的事件作为计算的结果。
不过,这并不是非常经典的面向对象设计。在经典的面向对象设计中,你会得到模型类,比如汽车,它们有自己的内部逻辑,这将定义,比如说,汽车突然改变了它的速度。我不会走这条路,因为它使您的代码逻辑分布在模型类和控制器类之间。你在世界之初就有了一组模型对象,唯一的方法是要么通过引擎决策影响它们,要么拥有真正的外部输入(比如来自人类的GUI输入)。如果你需要模型对象来改变它的行为,这应该是引擎代码的责任,而不是模型代码的责任。
对于这个相当不连贯的猜测,我很抱歉,这是一个相当广泛的主题,有很多关于这类事情的书籍。
发布于 2012-10-26 05:30:51
你还没有给我们足够的信息来帮助你勾画出你的模拟,但这里有一个很好的提示:任何你可以识别为物体的东西都应该是对象。因此,创建一个Car类。和一个类TrafficLight。然后创建一个类Driver,每个Car都有一个字段Driver。Road会有一个List<Car>
在开始考虑如何实现MVC框架之前,请确保您了解what it is.。MVC最重要的一点是,它是关于用户如何与世界交互的。例如,如果你正在编写一个名为SimTraffic的游戏,你可能需要MVC,因为你不仅需要一个交通模拟,而且用户还需要以某种方式控制它。如果你只是在观察模拟的发生(没有交互),不用担心MVC。
发布于 2012-10-26 05:47:41
忘了GUI吧。请从物理开始--有大量的交通模拟;我假设你至少读过一本关于这个主题的书,如果没有,现在是时候这样做了:一个起点可以是Springer出版的关于各种现代模型的论文集,名为Fundamentals of traffic Simulation (ISBN 1441961410),Jaume Barcelo (ed.) (2010年)。
编辑:建议首先决定sim的范围;不变的假设是什么?它将被调优到什么时间段?道路网络会改变吗?你允许车祸,酒后驾车的笨蛋,旁观者从事故现场拍电影到Youtube上吗?
您对sim的准确性有何要求?您希望将其用于城市规划、环境控制还是交通管理?您设置的变量和参数是什么?你有没有统计数据来验证你的模拟和测试预测?你有现成的数据关于你所建模的世界/城市中汽车/驾驶员的物理特征(加速度,线性尺寸,违反交通规则的倾向)吗?在你开始编写代码之前,有一堆问题需要回答……
编辑#2:从你的评论到@Victor Sorokin的回答,我猜你有一个很好的想法,将驾驶员的期望添加到模型中-将使驾驶员的人工智能成为编码的第一件事:是的,最短路径,但最短路径问题的解决方案来自陈旧的数据(可能具有可变延迟)。如果你给司机完美的预见,就不会有任何撞车;如果你让它们不完美,你将不得不对感官输入建模,也许可以归结为检测到迎面而来的汽车的特定方向的概率。这肯定会产生一些巨大的CPU周期支出。
https://stackoverflow.com/questions/13077023
复制相似问题