我试图设计一种算法,该算法将模拟具有多个源和多个特定容量接收器的管道网络。
到目前为止,我已尝试使用经典的Ford-Fulkerson算法,但我遇到的问题是这个,给出如下图:
S
|
a
/ \
B C
给定 S ,源容量为1, B和C ,接收容量为1 - 流量将产生S - a - B,饱和B到1并离开C流0。
我试图在整个网络中统一分配流量,以便 B和C都接收0.5 。有什么想法吗?
谢谢!
答案 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 流量单位精确地推送到每个接收器,则不清楚要优化的是什么,但您可能会发现以下两种方法非常有用:
答案 1 :(得分:0)
我是供水网络工程师。在对供水网络进行建模时,我通常将水源作为压力节点,将汇作为需求节点,因为水仿真软件可以求解水头或水流。我知道源头泵的能力和客户的消耗。用诸如Hazen-Williams或Darcy-Weisbach之类的水头损失方程来解决管道中的流动。
在您的示例中,在流量方面,汇的需求超出了源所提供的需求。 B和C的客户都将尝试打开尽可能大的水龙头,以满足他们1个单位的需求;但是假设从a到B的管道路径与从a到C的管道路径相同,则在B和C都尽最大努力使各自的末端流量最大化之后,这1个流量单位将平均分配。
但是由于不能满足2个单元的总需求的约束,因此模拟软件将无法解决。要么将水源更改为压力节点,以提供将2单位水送出所需的压力,要么应降低客户需求以匹配水源功能。在后一种情况下,目的是模拟从源头到汇点的水力坡度线。