使用FRP模拟道路网络与堵塞

Mar*_*urg 6 simulation haskell arrows conceptual frp

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

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

到现在为止还挺好.但是这个模型没有考虑到,这些细分可能会被卡住.虽然每个部分都可以很好地响应繁忙的交通并且越来越多地延迟汽车,但是它获得的拥挤越多,就没有回水效应,即堵塞不会向后传播到其他路段.

我怀疑我在这里应用了太多的OO思考,而不是专注于需要计算的东西,但我不能在脑子里把它弄好.

  • 如何使用箭头模拟道路网络,以便考虑回水效应?

Pet*_*lák 2

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

Yampa - 信号功能

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

因此,每个路段都需要有 2 个输入:一个说法是,下一个路段可以接受多少辆汽车,以及前一个路段有多少辆汽车(应该始终小于或等于该路段可以容纳的汽车数量)暂时接受)。这意味着 FRP 信号流实际上是循环的。为此,您需要循环(如上图中最后一张图片所示),它们由ArrowLoop类型类捕获。最有可能的是,您将拥有一个用于路段的自定义绑定函数,该函数将在内部创建所需的环路。请注意,循环中必须有时间延迟,以防止其发散,这是有道理的,因为汽车从一个路段行驶到另一路段需要一些时间。

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