Functional programming 无全局队列的离散事件模拟?

Functional programming 无全局队列的离散事件模拟?,functional-programming,simulation,reactive-programming,frp,Functional Programming,Simulation,Reactive Programming,Frp,我正在考虑建模一个物流网络。有以一定速度运行的进程,有可能溢出或下溢的缓冲区,以及它们之间的连接 我没有发现任何问题,使用全局事件队列以经典的离散事件模拟(DES)方式对此进行建模。我尝试在没有队列的情况下对系统进行建模,但在早期阶段失败了。但我仍然不理解为什么需要队列,至少对于“在”网络内部发起的事件不需要 无队列DES的思想是将整个网络视为一个函数,从外部世界接收事件流并返回状态变化流。网络中的每个节点应仅受直接连接到它的节点的影响。我对Haskell的arrows和函数式反应式编程(FRP

我正在考虑建模一个物流网络。有以一定速度运行的进程,有可能溢出或下溢的缓冲区,以及它们之间的连接

我没有发现任何问题,使用全局事件队列以经典的离散事件模拟(DES)方式对此进行建模。我尝试在没有队列的情况下对系统进行建模,但在早期阶段失败了。但我仍然不理解为什么需要队列,至少对于“在”网络内部发起的事件不需要

无队列DES的思想是将整个网络视为一个函数,从外部世界接收事件流并返回状态变化流。网络中的每个节点应仅受直接连接到它的节点的影响。我对Haskell的arrows和函数式反应式编程(FRP)总的来说抱有一些希望,但我仍在学习

事件队列在我看来太“全局”了。如果我的网络分成两个子网,它们之间没有连接,我只问一个子网状态变化的问题,那么另一个子网根本不应该做任何计算。在这种情况下,我可以使用两个事件队列。但是,一旦我连接了两个子网,我就必须将所有事件放入一个队列中。我不喜欢这样的想法,我需要知道网络的拓扑结构才能设置队列

所以

  • 有人知道不需要全局队列的DES算法吗
  • 这是困难甚至不可能的原因吗
  • FRP在DES中有用吗

回答第一点,不,我不知道任何不需要全局事件队列的离散事件模拟(DES)算法。可以有一个事件队列层次结构,其中每个事件队列在其父事件队列中表示为一个事件(对应于其下一个事件的时间)。如果将新事件添加到事件队列中,使其成为队列的下一个事件,则需要在其父事件队列中重新调度事件队列,以保持事件执行的顺序。但是,您最终仍将归结为一个全局事件队列,它是层次结构中所有其他事件的父级,并分派每个事件

或者,您可以不使用DES,而是执行更类似于可编程逻辑控制器(PLC)的操作,该控制器每隔一小段时间重新评估整个网络的状态。然而,通常情况下,这会慢得多(它甚至可能没有实时运行得那么快),因为大部分时间它将无所事事。如果拾取的时间增量太大,模拟可能会失去准确性

第二点最简单的答案是,据我所知,没有全局事件队列是不可能的。每个模拟事件都需要在正确的时间执行,因为时间不能倒转,所以事件的调度顺序很重要。当前模拟时间由当前事件执行的时间定义。如果您有单独的事件队列,那么您也有单独的时钟,这至少会让事情变得非常混乱

在本例中,如果子网络完全独立,则可以单独模拟每个子网络。但是,如果一个子网络的状态影响整个网络的状态,并且整个网络的状态影响每个子网络的状态,那么-由于事件受之前事件的影响,因此只能影响后面的事件,但不能影响前面的内容-必须使用全局事件队列模拟整个网络

如果可以安慰的话,真正的DES模拟不会在事件之间执行任何处理(除了确定下一个事件是什么),因此如果所有操作都在另一个子网中发生,则在一个子网中不应有浪费的处理

最后,函数式反应式编程(FRP)在DES环境中绝对有用。事实上,我现在用这种方法在Scala中编写了很多DES模拟

我希望这有帮助

更新:自撰写上述内容以来,我使用了(一个优秀的FRP库,OP在下面的评论中引用了该库),并可以添加一些进一步的解释:钠提供了订阅事件以及在这些事件发生时执行操作的方法。然而,这里我使用的术语是一般意义上的事件,例如用户在GUI中单击的按钮,或到达的网络包等。换句话说,事件不一定是模拟事件

您仍然可以使用Na钠或任何其他FRP库作为模拟的一部分,订阅模拟事件并在发生时执行操作;但是,这些工具通常没有对模拟的内置支持,因此您必须将模拟引擎合并为模拟事件源,就像将GUI合并为用户交互事件源一样。全局事件队列必须驻留在此引擎中


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

在您的鼓励下,我进一步研究了FRP,但根本看不到事件队列。你在哪里看到FRP样式DES中的队列?我很乐意回答这个问题,但是你能澄清一下“看到队列”是什么意思吗?我不确定我是否理解这个问题。在钠和反应性香蕉(Haskell)中,一切似乎都围绕着行为(又名信号)和事件以及组成网络的方式运行。没有明确的队列概念。当你这样做的时候