基于线性规划的图最大流问题的多终端扩展模型(多源点多汇点)求解示例
题目描述
我们考虑一个多源点、多汇点的最大流问题。在一个有向图G=(V, E)中,每条边e∈E有一个非负容量c(e)。与经典单源单汇最大流问题不同,现在我们指定一个源点集合S ⊆ V和一个汇点集合T ⊆ V,其中S和T不相交。目标是从源点集合S向汇点集合T发送尽可能多的流,使得每条边上的流量不超过其容量,且除了源点和汇点外,每个中间节点的流量守恒。
更形式化地,我们需要最大化从S发出的总净流量(或流入T的总净流量),并满足以下约束:
- 边的容量约束:0 ≤ f(e) ≤ c(e)
- 节点流量守恒:对于每个节点v ∈ V \ (S ∪ T),流入流量等于流出流量。
- 源点和汇点的净流量:源点可以有净流出,汇点可以有净流入,但同一个节点不能同时是源点和汇点。
这个模型在网络通信、交通分配、资源分配等场景中很常见,例如多个数据中心(源点)向多个用户终端(汇点)传输数据。
解题过程
我们将采用添加超级源点和超级汇点的方法,将多源点多汇点问题转化为等价的单源单汇最大流问题,然后用经典算法(如Edmonds-Karp算法)求解,最后解释结果。
步骤1:问题转化
- 在原有向图G中添加一个虚拟超级源点s和一个虚拟超级汇点t**。
- 从s向每个实际源点s∈S添加一条有向边(s→s),容量设为无穷大(或一个足够大的数,例如所有实际边的容量之和)。
- 从每个实际汇点t∈T向t添加一条有向边(t→t),容量同样设为无穷大。
- 原图G中的所有边保留原有容量。
这样,新图G中的单源单汇最大流问题(从s到t*)的最优值就等于原多源点多汇点问题的最大流值。因为从s出发的无穷大边允许每个实际源点流出任意所需流量,而流入t的无穷大边允许每个实际汇点接收任意所需流量。
步骤2:建立线性规划模型
定义决策变量x_ij表示从节点i到节点j的边上的流量。以转化后的单源单汇图G为例,线性规划模型为:
目标:最大化从s流出的总流量(等价于流入t*的总流量)
约束:
- 容量约束:0 ≤ x_ij ≤ c_ij,对所有边(i,j)∈E*(E是G的边集)
- 流量守恒:对每个节点v∈V(V是原图节点集),流入流量等于流出流量。注意:这里s只有流出,t只有流入,其他节点(包括原S和T中的节点)都满足流量平衡。
写成线性规划标准形式:
Maximize ∑{(s*,j)∈E*} x{sj}
subject to:
∑_{(i,v)∈E} x_{iv} = ∑{(v,j)∈E*} x{vj}, ∀v∈V (注意这里V包含原图所有节点,但s和t是后加的,所以需单独处理)
0 ≤ x_e ≤ c_e, ∀e∈E*
步骤3:用Edmonds-Karp算法求解
我们将转化后的问题用Edmonds-Karp算法(最短增广路算法)求解。该算法是Ford-Fulkerson方法的一种实现,每次用BFS寻找最短(边数最少)的增广路径,并沿路径增加流量,直到没有增广路为止。
算法步骤:
- 初始化所有边流量为0。
- 在残留网络中,用BFS从s到t寻找一条路径。
- 如果存在路径,找出路径上最小的残留容量,并沿路径增加等量流量,更新残留网络。
- 重复步骤2-3,直到BFS找不到路径。
- 最终,从s*发出的总流量就是最大流值。
由于Edmonds-Karp算法的时间复杂度是O(VE^2),可以高效求解。
步骤4:从解中恢复原问题流分布
求解后,我们得到转化后图G*上每条边的最优流量x_e。原问题的解是这些流量在原图G的边上的取值。
- 原图G中每条边e∈E的流量就是x_e。
- 每个实际源点s∈S的净流出量等于流入它的超级源点边上的流量(即x_{s*→s})。
- 每个实际汇点t∈T的净流入量等于从它流出的超级汇点边上的流量(即x_{t→t*})。
- 总的最大流值等于所有实际源点的净流出量之和,也等于所有实际汇点的净流入量之和。
步骤5:正确性说明
添加超级源汇的方法之所以正确,是因为:
- 超级源点s*到实际源点的边容量无穷大,不会限制从实际源点流出的总量。
- 实际汇点到超级汇点的边容量无穷大,不会限制流入实际汇点的总量。
- 转化后图的任何可行s*-t*流都对应原图的一个可行多源多汇流(只需忽略添加的边),反之亦然。
- 因此,转化后图的最大流值等于原问题的最大流值。
步骤6:示例
假设一个简单有向图:节点1,2为源点,节点3,4为汇点,边及容量为:(1→3,2), (1→4,3), (2→3,4), (2→4,1)。
转化:添加s和t,边(s*→1, ∞), (s*→2, ∞), (3→t*, ∞), (4→t*, ∞)。
用Edmonds-Karp算法求解s*-t*最大流:
- 增广路1:s*→1→4→t*,流量3,更新后边1→4满。
- 增广路2:s*→1→3→t*,流量2,更新后边1→3满。
- 增广路3:s*→2→3→t*,流量2,更新后边2→3剩余2。
- 增广路4:s*→2→4→t*,流量1,更新后边2→4满。
- 此时已无增广路。总流量=3+2+2+1=8。
原问题最大流值为8,各边流量:1→3:2, 1→4:3, 2→3:2, 2→4:1。源点1流出5,源点2流出3;汇点3流入4,汇点4流入4。
这个多源点多汇点模型通过添加超级源汇转化为经典问题,是网络流中常见的建模技巧,可广泛应用于多起点多终点的运输或通信问题。