离散事件模拟无全局队列



我正在考虑建模材料流网络。有一些以一定速度运行的过程,可以在这些速度上溢出或下底和连接的过程。

我看不到使用全球事件队列在经典离散事件模拟(DES)时尚中对此进行建模的任何问题。我尝试在没有队列的情况下对系统进行建模,但在早期阶段失败。我仍然不了解需要队列的根本原因,至少对于源于"内部"网络的事件。

无排队的DES的想法是将整个网络视为从外界获取事件并返回状态变化的函数。网络中的每个节点应仅受直接连接到该节点的节点的影响。我已经对Haskell的箭头和功能性反应性编程(FRP)设定了一些希望,但我仍在学习。

事件队列对我来说看起来也"全球"。如果我的网络分解为两个子网,而它们之间没有连接,我只问有关一个子网的状态变化的问题,另一个子网根本不应进行任何计算。在这种情况下,我可以使用两个事件队列。但是,一旦我连接两个子网,就必须将所有事件都放入一个队列中。我不喜欢这个想法,我需要知道网络的拓扑才能设置我的队列。

so

  • 有人知道不需要全局队列的算法吗?
  • 有原因为什么这很困难甚至不可能?
  • FRP在DES的背景下有用吗?

要回答第一点,不,我不知道任何不需要全局事件队列的离散事件模拟(des)算法。可能具有事件队列的层次结构,其中每个事件队列在其父事件队列中表示为事件(与下一个事件的时间相对应)。如果将新事件添加到事件队列中,以使其成为队列的下一个事件,则需要将事件队列重新安排在其父母中,以保留事件执行的顺序。但是,您最终仍会归结为一个全球事件队列,该活动是层次结构中所有其他所有事件的父母,并且派遣每个事件。

另外,您可以分配DES并执行类似于可编程逻辑控制器(plc)更类似的东西,该逻辑控制器(plc)每天都会重新评估整个网络的状态。但是,通常情况下,这会慢得多(甚至可能不如实时运行),因为大多数情况下它无关紧要。如果您选择太大的时间增加,模拟可能会失去准确性。

第二点最简单的答案是,据我所知,最终,如果没有全球事件队列,就不可能做。每个仿真事件都需要在正确的时间执行,并且 - 由于时间无法向后运行 - 派遣事件的顺序。当前的仿真时间由当前事件执行的时间定义。如果您有单独的事件队列,那么至少可以说,您也有单独的时钟,这会使事情变得非常混乱。

在您的情况下,如果您的子网完全独立,则可以单独模拟每个子网。但是,如果一个子网的状态影响总网络的状态,并且总网络的状态会影响每个子网络的状态,那么 - 由于事件受到事件的影响,因此只能影响事件遵循但不能影响它之前的内容 - 您必须使用全局事件队列模拟整个网络。

如果有任何安慰,则真正的DES模拟不会在事件之间执行任何处理(其他确定下一个事件是什么),因此,如果所有操作都在另一个子网中进行。

最后,功能反应性编程(frp)在DES的上下文中是绝对有用的。确实,我现在使用这种方法在Scala中写了很多DES模拟。

我希望这会有所帮助!

update :自写上述文章以来,我使用了(非常出色的 frp 库,该库是由OP在下面的评论),并且可以添加一些进一步的解释:提供了一种订阅事件的手段,并在发生这些事件时执行操作。但是,在这里,我在这里使用术语事件,例如用户在a gui 中单击的按钮,或者是网络包到达的按钮,等等。换句话说,事件不一定是仿真事件。

您仍然可以使用—或任何其他 frp library—作为模拟的一部分,以订阅模拟事件并在发生时执行操作;但是,这些工具通常没有内置的模拟支持,因此您必须将仿真引擎合并为模拟事件的来源,就像A gui 合并为用户的来源一样交互事件。全球事件队列必须居住在该引擎内。

顺便说一句,如果您试图执行并行或分布式仿真模型执行,那么事情会变得更加复杂。在这些情况下,您有多个事件队列,但必须同步(赋予单个队列的外观)。这两种基本方法是保守的同步乐观的同步

最新更新