1

我正在尝试设计一个离散事件模拟,其中事件的执行与时间无关。选择接下来发生什么事件仅取决于模型的条件(在我的例子中是一个人),并且一次执行一个。

我在那里找到了几个设计:

  • 事件调度 - 保留事件队列,在每个事件执行期间,安排新事件或取消旧事件。

  • 活动扫描——在每个周期中,所有事件都被迭代,如果人的当前状态满足事件的执行条件,则执行该事件。

  • 事件图 - 有一个事件图,并让每条边代表转换的条件。

我对每种方法的考虑如下:

  • 事件调度 - 应该添加什么事件的逻辑分布在事件中,因此很难跟踪。此外,队列会发生很大变化,并且由于它不是基于时间的,因此每次要进行更改以查找要删除的事件时,您都必须遍历整个队列(例如,如果您想要在两个事件 A 之前删除事件 B)。

  • 活动扫描 - 它的性能可能很差,特别是如果它必须遍历许多事件以在每个周期中找到下一个要执行的事件。

  • 事件图 - 如果图非常大,初始化它并设置所有边可能会变得很麻烦。

我想请您就哪种方法可能最合适提出意见,如果合适,我可以通过哪些方式解决上述考虑。也许完全不同的设计可能是合适的。

4

3 回答 3

3

您可以在http://www.simjs.com尝试 Javascript 离散事件模拟库。它支持事件调度和离散时间流。您可以为将来安排“事件”或让它们等待某个谓词,并注册回调函数,当(模拟)时间到达截止日期或满足谓词时将调用这些回调函数。

于 2011-07-03T19:01:47.457 回答
1

您的问题对我来说不是很清楚,但我认为您可以使用离散事件模拟系统并忽略时间组件。您可以“立即”安排所有事件,它应该独立于时域工作。我正在使用 SimPy http://simpy.sourceforge.net/和 IMO 它能够做到。

于 2011-03-11T12:32:20.713 回答
1

我建议研究 Petri Nets。它们被广泛用于业务流程建模,并且不需要时间。如果需要,彩色培养网也可以代表时间。随机 Petri 网也可以解决随机性和时间问题。这是对它们是什么以及它们可以做什么的明确介绍。

http://www2.ing.unipi.it/~a009435/issw/extra/murata.pdf

他们有大量不同语言的包,您可以使用他们的代数方法开发自己的包以快速实施。

于 2015-06-24T20:34:43.773 回答