网络流 - 模拟水管网络

时间:2014-03-21 21:24:47

标签: algorithm graph max-flow ford-fulkerson

我试图设计一种算法,该算法将模拟具有多个源和多个特定容量接收器的管道网络。

到目前为止,我已尝试使用经典的Ford-Fulkerson算法,但我遇到的问题是这个,给出如下图:

    S
    |
    a
   / \
  B   C

给定 S ,源容量为1, B和C ,接收容量为1 - 流量将产生S - a - B,饱和B到1并离开C流0。

我试图在整个网络中统一分配流量,以便 B和C都接收0.5 。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

假设你有 n 来源 s 1 ,...,s n ,其源容量 c i m t 1 ,...,t m 。设 f = sum i c i 。我们希望在网络中找到一个可行的流,其中每个源 i 的净流量为 -c i ,并且每个接收器都有净流量 f / m

我们可以通过引入超级源 S 和超级接收器 T 并将每个源 i 连接到来解决这个问题S 通过容量 c i 的边( s i ,S)。我们通过容量 f / m 的边缘将每个 t i 连接到T.然后我们只用源S运行max-flow并接收T。

如果无法将 f / m 流量单位精确地推送到每个接收器,则不清楚要优化的是什么,但您可能会发现以下两种方法非常有用:

  • 选择 e 并通过容量 f / m + e 的边缘将接收器连接到T.使用二进制搜索查找最小 e ,使总流量 f 。这最小化 max i 流入(t i
  • 选择 e 并通过下边界 e 将边线添加到T中。使用二进制搜索来查找仍允许可行流的最大 e 。这最大化 min i 流入(t i 。具有下限的可行流问题可以减少到最大流量:http://www.cs.uiuc.edu/~jeffe/teaching/algorithms/2009/notes/18-maxflowext.pdf在这种情况下,构造非常简单:只需添加一个额外的超级源S'并通过容量边缘将S'连接到S em> m * e 。通过容量 e 的边缘将所有接收器连接到T.检查S'和T之间的最大流量是否 m * e

答案 1 :(得分:0)

我是供水网络工程师。在对供水网络进行建模时,我通常将水源作为压力节点,将汇作为需求节点,因为水仿真软件可以求解水头或水流。我知道源头泵的能力和客户的消耗。用诸如Hazen-Williams或Darcy-Weisbach之类的水头损失方程来解决管道中的流动。

在您的示例中,在流量方面,汇的需求超出了源所提供的需求。 B和C的客户都将尝试打开尽可能大的水龙头,以满足他们1个单位的需求;但是假设从a到B的管道路径与从a到C的管道路径相同,则在B和C都尽最大努力使各自的末端流量最大化之后,这1个流量单位将平均分配。

但是由于不能满足2个单元的总需求的约束,因此模拟软件将无法解决。要么将水源更改为压力节点,以提供将2单位水送出所需的压力,要么应降低客户需求以匹配水源功能。在后一种情况下,目的是模拟从源头到汇点的水力坡度线。