使用 FRP 模拟拥堵路网

问题描述 投票:0回答:1

我目前正在尝试理解箭头和FRP,我遇到了一个问题,我似乎无法将其映射到FRP,即如何对道路网络进行建模。

我想我可以将道路网络建模为箭头,其中每个箭头代表一个路段。它在不同地点和时间接受汽车流,并生产相同类型的汽车,尽管地点和时间不同。

到目前为止一切顺利。但该模型没有考虑到段可能会被堵塞。虽然每个路段都能很好地应对交通拥堵,车辆延误的情况越来越严重,但越拥堵,就不会出现“回水效应”,即拥堵不会向后传播到其他路段。

我怀疑我在这里应用了太多的面向对象思想,而不是专注于需要计算的内容,但我无法在头脑中正确理解它。

  • 如何使用箭头对道路网络进行建模以考虑回水效应?
haskell simulation frp conceptual arrow-abstraction
1个回答
2
投票

问题在于,在箭头和 FRP 中,信息流通常是单向的。将 FRP 箭头想象成一段数字电路。电路元件的输出并不取决于与其连接的内容 - 它只是将输出“提供”给感兴趣的人。这也在 Yampa 概述中的原始信号函数中进行了直观描述:

Yampa - signal functions

你的情况有所不同。路段的状态取决于下一个路段和前一个路段 - 汽车从前一个路段驶来,但如果汽车无法驶向下一个路段,则它们必须留下来。它就像一根自来水管。如果您关闭管道的末端,水就会停止,并且有关信息会以水中声速通过管道向后传播。

因此,每个路段都需要有 2 个输入:一个说法是,下一个路段可以接受多少辆汽车,以及前一个路段有多少辆汽车(应该始终小于或等于该路段的汽车数量)目前可以接受)。这意味着 FRP 信号流实际上是循环的。为此,您需要 loops,如上图中最后一张图片所示,它由

ArrowLoop
类型类捕获。最有可能的是,您将拥有一个用于路段的自定义绑定函数,该函数将在内部创建所需的环路。请注意,循环中必须有时间延迟,以防止其发散,这是有道理的,因为汽车从一个路段转到另一个路段需要一些时间。

(如果我有更多时间,我可能会用一个例子来扩展答案。)

© www.soinside.com 2019 - 2024. All rights reserved.