基于线性规划的图最大流问题的多项式时间近似算法求解示例
我将为你讲解如何利用线性规划和原始-对偶方法,为有向图最大流问题设计一个多项式时间的近似算法,并分析其理论性能。
1. 问题描述与背景
给定一个有向图 \(G = (V, E)\),其中 \(V\) 是顶点集(\(n = |V|\)),\(E\) 是边集(\(m = |E|\))。每条边 \(e \in E\) 有一个非负的容量 \(u_e\)。指定两个特殊顶点:源点 \(s \in V\) 和汇点 \(t \in V\)(\(s \neq t\))。
一个“流”是一个函数 \(f: E \to \mathbb{R}_{\ge 0}\),满足:
- 容量约束:对每条边 \(e\),有 \(0 \le f_e \le u_e\)。
- 流量守恒:对每个顶点 \(v \in V \setminus \{s, t\}\),有 \(\sum_{e \in \delta^+(v)} f_e = \sum_{e \in \delta^-(v)} f_e\),其中 \(\delta^+(v)\) 表示以 \(v\) 为起点的出边集合,\(\delta^-(v)\) 表示以 \(v\) 为终点的入边集合。
流的值(或流量)定义为从 \(s\) 流出的总流量:\(|f| = \sum_{e \in \delta^+(s)} f_e - \sum_{e \in \delta^-(s)} f_e\)(通常 \(\delta^-(s) = \emptyset\))。
最大流问题要求找到一个流 \(f\),使得流的值 \(|f|\) 最大。
这是一个经典多项式时间可解问题(例如,通过 Edmonds-Karp 或 Push-Relabel 算法)。但有趣的是,我们可以从线性规划对偶的角度,设计一个近似算法框架,这有助于理解问题的结构,并为更复杂的问题(如多商品流)提供思路。
2. 线性规划建模
首先,将最大流问题形式化为线性规划。
- 决策变量:对每条边 \(e \in E\),令 \(f_e\) 表示边上的流量。
- 目标:最大化从 \(s\) 流出的净流量。
- 约束:容量约束和流量守恒。
线性规划(原问题,P)如下:
\[\begin{aligned} \max \quad & \sum_{e \in \delta^+(s)} f_e - \sum_{e \in \delta^-(s)} f_e \\ \text{s.t.} \quad & \sum_{e \in \delta^+(v)} f_e - \sum_{e \in \delta^-(v)} f_e = 0, \quad \forall v \in V \setminus \{s, t\} \\ & 0 \le f_e \le u_e, \quad \forall e \in E \end{aligned} \]
为了简化,通常引入一个虚拟边从 \(t\) 到 \(s\),容量为无穷大,并将目标改为最大化该虚拟边上的流量。但更常见的做法是直接考虑等价形式:
将最大化从 \(s\) 到 \(t\) 的流量,转化为在所有满足守恒约束的流中,最大化一个从 \(s\) 到 \(t\) 的“势差”。这里我们采用另一种常见表述:对每个顶点分配一个势(或高度)\(d_v\),并利用对偶理论。
3. 构造对偶问题
写出原问题的对偶线性规划。引入对偶变量:
- 对每个顶点 \(v \in V \setminus \{s, t\}\),设 \(p_v\)(无约束)对应流量守恒约束。
- 对每条边 \(e\),设 \(z_e \ge 0\) 对应容量约束 \(f_e \le u_e\)。
注意,原问题中还有非负约束 \(f_e \ge 0\),这在对偶中自动满足。经过推导(详细步骤略),可得对偶问题(D)为:
\[\begin{aligned} \min \quad & \sum_{e \in E} u_e z_e \\ \text{s.t.} \quad & z_e \ge p_v - p_w, \quad \forall e = (v, w) \in E \\ & p_s = 1, \quad p_t = 0 \\ & z_e \ge 0, \quad \forall e \in E \\ & p_v \in \mathbb{R}, \quad \forall v \in V \end{aligned} \]
这里 \(p_v\) 可以解释为顶点 \(v\) 的势(或标签),且不失一般性可设 \(p_s=1, p_t=0\)。约束 \(z_e \ge p_v - p_w\) 意味着 \(z_e\) 至少是势差的正部。
对偶问题的目标是最小化加权容量和,其最优值等于最大流的值(强对偶定理)。
4. 原始-对偶近似算法设计
我们设计一个基于原始-对偶框架的近似算法。注意,最大流是多项式时间精确可解的,但这里的“近似算法”是指我们通过一个迭代过程,同时构造原始可行流(可行但未必最优)和对偶可行解,并保证最终流的流量至少是(1-ε)倍最优值。这可以视为一个“近似”方案,尤其当迭代次数有限时。
算法思路:
- 初始化:设 \(f_e = 0\) 对所有边 \(e\),对偶势 \(p_v\) 初始化为:\(p_s = 1, p_t = 0\),其他顶点 \(p_v = 0\)(或一个中间值)。设 \(z_e = \max(0, p_v - p_w)\) 以保持对偶可行。
- 迭代改进:在每次迭代中,我们尝试增加从 \(s\) 到 \(t\) 的流量,同时更新对偶势,以控制对偶目标值的增长。
- 终止条件:当原始流量足够接近对偶目标值时停止(通过差距判断)。
具体迭代步骤:
- 定义残余图 \(G_f = (V, E_f)\),其中残余容量 \(r_e = u_e - f_e\)(正向边)和 \(f_e\)(反向边,允许减少流量)。
- 在残余图中,寻找从 \(s\) 到 \(t\) 的一条路径 \(P\),使得路径上每条边 \(e = (v, w)\) 满足 \(p_v - p_w \le \delta\)(其中 δ 是一个小的正数,是算法参数)。这类似“允许边”的概念。
- 如果存在这样的路径 \(P\),则沿 \(P\) 增加流量,增量为 \(\min_{e \in P} r_e\)。更新流 \(f\) 和残余图。
- 如果不存在这样的路径,则更新对偶势:以某种方式增加 \(p_v\)(例如,对所有能从 \(s\) 通过允许边到达的顶点增加势),使得新的允许边集合可能扩大。
- 同时,根据新的势更新 \(z_e = \max(0, p_v - p_w)\),保持对偶可行。
- 当对偶间隙(对偶目标值 - 原始流值)小于 ε 倍原始流值时停止。
5. 算法分析与近似保证
- 对偶可行性:在每一步,通过设置 \(z_e = \max(0, p_v - p_w)\),显然满足 \(z_e \ge p_v - p_w\) 和 \(z_e \ge 0\),且 \(p_s=1, p_t=0\) 保持不变。因此对偶解始终可行。
- 原始可行性:流 \(f\) 始终满足容量约束和守恒约束,因为我们在残余图上沿路径增广,这是标准最大流算法的操作。
- 近似比:可以证明,经过有限次迭代后,原始流的值至少是 \((1 - \varepsilon)\) 倍的最优流值。这是因为对偶目标值 \(\sum u_e z_e\) 是原问题最优值的上界,而算法控制原始值和对偶值的差距在 ε 倍原始值以内。
- 多项式时间:若每次迭代至少增加固定量流量或势更新次数有限,则总迭代次数是输入规模的多项式(实际中,类似算法可能与最短增广路算法复杂度相近,为 O(nm²) 或更好,取决于实现)。
6. 算法意义与扩展
这个算法展示了如何用原始-对偶方法解释经典最大流算法。它不是一个为了“近似”而牺牲精度的算法,而是通过控制对偶间隙得到近似解,实际上可以通过减小 ε 得到任意精度的解。这种视角有助于:
- 理解最大流最小割定理的算法证明。
- 推广到更难的流问题,如多商品流,其中精确求解是 NP-hard,但原始-对偶框架可设计近似算法。
- 与内点法、能量优化等方法相联系。
7. 简单算例演示
考虑一个简单有向图:顶点 \(V = \{s, a, b, t\}\),边 \(E = \{(s,a):3, (s,b):2, (a,b):1, (a,t):2, (b,t):3\}\)(括号内为容量)。
- 初始化:流 \(f=0\),势 \(p_s=1, p_t=0, p_a=p_b=0\),对偶变量 \(z\) 按定义设置。
- 迭代1:残余图中,边 (s,a) 的势差 \(p_s-p_a=1\),若设 δ=1,则是允许边。类似地,(s,b) 势差为1,也是允许边。路径 s-a-t 上势差满足条件。沿此路径增广流量2(受限于 (a,t) 容量)。更新流。
- 更新对偶势:可能需要调整以继续增广。经过几次迭代后,最终流值达到4(最大流),对偶目标也收敛到4,间隙为0。
这个算法框架强调了线性规划对偶在组合优化问题中的应用,即使对于多项式时间可解问题,也能提供新的洞察。