【问题标题】:Event driven train simulation, can't seem to wrap my head around it [closed]事件驱动的火车模拟,我似乎无法理解它[关闭]
【发布时间】:2014-02-13 14:25:23
【问题描述】:

我已经在这个项目上工作了很长时间,我很遗憾地说我很快就会放弃它,只是因为我无法理解它。每次我尝试并编写 UML 或我卡住的代码,我已经卡住了将近八周。因此,作为最后的手段,我向 SO 寻求帮助。而且我知道我应该为你们提供一个更完整的解决方案来帮助我,但由于我没有比我将在这个问题中进一步展示的内容更进一步,所以没有什么可展示的。

无论如何.. 任务是创建一个事件驱动的火车模拟。 我会先列出要求。

要求是:

车辆

  • 所有车辆都有唯一的 ID 号。
  • 一个重要特性是一个虚拟函数,它可以提供有关给定车辆的详细信息的字符串表示形式。

  • 不同类型的车辆及其属性是:

    1. 机车
      • 内燃机车[最大速度和油耗]
      • 电力机车[最大速度和效果]
    2. 乘用车
      • 坐车 [座位数量和 Wifi 是/否]
      • 卧铺车[床位数]
    3. 货车
      • 敞篷货车[装载能力和装载空间]
      • 封闭式货车[容量]

  • 当涉及到车辆时,我们可以声明给定车辆要么在车站车辆池中,要么在火车上。但不得移动任何车辆物体。所有对象都是在启动时动态创建的(从某个文件中读取车辆数据),在模拟过程中,您只需通过移动指针来转移车辆的所有权。

火车

  • 从一个城镇到另一个城镇的每一列火车,或者更确切地说是火车连接,都有一个唯一的火车 ID。

    此 ID 是一个逻辑 ID,具有给定 ID 的火车每天以相同的 PRINCIPAL 成分从同一个出发城镇在同一时间同一时间运行到同一目的地。 IE。具有给定 ID 的火车在车辆类型和编号方面始终具有相同的车辆集,但在实际车辆方面则不然。

  • 火车由不同类型的车辆组成。火车也可以由相同类型的车辆组成,例如。 859号列车由两辆电力机车和三辆卧铺车组成。

  • 一列火车在火车出发站组装。

    根据出发站的可用车辆,车辆每天都会有所不同。 如果火车无法组装,则会延迟到可以组装为止。

  • 每列火车经过六个不同的州。

    未组装 - 火车存在,但仅作为一个逻辑概念,没有连接机车/汽车。
    未准备好 - 火车正在当前车站组装,汽车正在连接。
    READY - 火车现在准备从车站出发。
    RUNNING - 它在移动并朝着它的目的地前进。
    ARRIVED - 火车现已到达目的地。
    完成 - 火车正在分离,车辆现在进入车站车辆池,车辆现在可以用于车站上的其他火车。

车站

  • 每个站点都有一个可用车辆池,作为一个提示,我们知道站点有一个容器,用于存放车辆指针作为数据成员。
  • 如果火车无法在车站组装,因为车站车辆库没有火车所需的车辆,它将被延误,火车仍将保持在“未组装”状态。

模拟

  • 简而言之,模拟应该从一个时间点到另一个时间点进行,例如从 08.00 到 16.00。在模拟期间,用户始终可以访问有关模拟中任何给定车辆、模拟中任何火车或火车站的信息。在模拟开始时,最多读取三个文件,并且在这三个文件中存储有关车辆/火车/车站的所有信息。
  • 文件中的开始信息不能包含火车的车辆 ID,只能包含它们的类型(例如“DIESEL_LOCOMOTIVE”)。火车组装完成后,就会确定确切的车辆 ID(从“未就绪”状态变为“就绪”状态)
  • 用户以 10 分钟长的步长逐步完成模拟,模拟相应地更新所有状态/位置/池等。


我知道一种经典的方法是扫描描述以查找可能是类的名词和可能是操作的动词。快速演练给出了一些中心类:车辆、火车、车站、连接、时间表等。但我完全停止了这项任务。我什么都没做,开始松懈。我编写了很多 UML 图来帮助我指导编码,并且我编写了很多具有不同类型实现的程序,以至于我快要放弃了。任何帮助是极大的赞赏。

【问题讨论】:

  • 有时暂时颠倒一切是有帮助的——将一些代码放在一起至少完成一些任务,让它或多或少地工作,在这个过程中你应该了解什么高级设计应该是这样的。然后带着这个新见解回到你的 UML。
  • 我认为你只见树木不见森林,而且你试图咬掉的东西比你能咀嚼的还多。在 Internet 上搜索有关离散事件模拟的资源,并了解一些人以前是如何解决此类问题的。接下来,从简单开始:尝试让一列火车从一个车站开到另一个车站。确保您的系统从模拟中报告您想要的数据。现在开始增加复杂性,也许有 2 列火车共享一个轨道和程序避免碰撞。最后,这个问题太宽泛了,无法在 SO 相当严格的规则中给出好的答案,所以我投票结束
  • 如果您想进行基于事件的仿真,您需要采用离散事件建模范式。请查看informs-sim.org/wsc06papers/001.pdf 获取教程。我同意 @HighPerformanceMark 的观点,即从小处着手并逐步建立是一个好主意。
  • 还有一件事,只是为了让你的森林更深更复杂。您的分析没有提及火车运行的轨道或控制火车运动的信号。回到基础。
  • 请注意,“以 10 分钟为增量的系统步骤”不是 DES。 DES,顾名思义,是基于事件来推进时间。因此,一个实体将发出一个事件,表示某个变化将在 10 分钟内发生(如火车到达),另一个实体将发出一个事件,表示某事将在 8 分钟内发生。事件队列将有两个事件,时间会提前 8 分钟,然后 2 分钟(除非 8 分钟发生的事情导致 1 分钟发生新事件)。这是一种非常不同的系统思考方式。

标签: c++ inheritance polymorphism containers simulation


【解决方案1】:

你所拥有的更接近系统要求而不是用户要求。这可能是有问题的,因为前者是您解决问题的方式,后者是您要解决的问题。如果不清楚,您的解决方案将不稳定。例如,

如果火车不能在车站组装,因为车站的车辆 游泳池没有火车所需的车辆,会延误 并且火车仍将保持在“未组装”状态。

这是系统要求。什么用户要求导致必须在车站组装火车,用户需要做什么?

我的猜测是你太快进入问题的复杂性。清楚地定义几个简单的目标,并用一些用户要求详细说明它们,并保持简单。如果您有 6 种类型的车辆和 6 个州等,并且没有明确的顶级用户需求,那么您就想多了,走得太快了。一旦你有了一组简单的用户需求,并且你构建了一个基于 DES 的解决方案,你可以快速退后一步,思考你应该如何修改它,以便以后可以合并更多的复杂性,而不必重做一堆东西,但是这可能为时过早。迭代是最好的方法,学习问题域(关于火车的东西,但具体我不确定),并逐渐学习解决方案技术(DES)。

我同意 cmets 的观点,即这对于 SO 来说过于宽泛,但我希望以上内容有所帮助,祝你好运。

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2010-09-27
    相关资源
    最近更新 更多