基于线性规划的图最小费用循环流问题的原始-对偶近似算法求解示例
问题描述
给定一个有向图 \(G = (V, E)\),每条边 \(e \in E\) 有容量 \(u_e > 0\)、单位流量费用 \(c_e \in \mathbb{R}\),以及节点 \(v \in V\) 的流量需求 \(b_v\)(满足 \(\sum_{v \in V} b_v = 0\))。目标是找到一可行流 \(f: E \to \mathbb{R}_{\ge 0}\),满足节点流量平衡约束和边容量约束,且总费用 \(\sum_{e \in E} c_e f_e\) 最小。若所有数据为整数,需设计一原始-对偶近似算法,在保证解可行的前提下逼近最优解。
解题过程
1. 问题建模为线性规划
最小费用循环流问题的标准线性规划形式为:
\[\begin{aligned} \min \quad & \sum_{e \in E} c_e f_e \\ \text{s.t.} \quad & \sum_{e \in \delta^+(v)} f_e - \sum_{e \in \delta^-(v)} f_e = b_v, \quad \forall v \in V \\ & 0 \le f_e \le u_e, \quad \forall e \in E \end{aligned} \]
其中 \(\delta^+(v)\) 和 \(\delta^-(v)\) 分别表示节点 \(v\) 的出边和入边集合。
2. 构造对偶问题
为每条边引入对偶变量 \(p_e \ge 0\)(对应容量约束 \(f_e \le u_e\)),为每个节点引入对偶变量 \(\pi_v\)(无符号限制,对应流量平衡约束)。对偶问题为:
\[\begin{aligned} \max \quad & \sum_{v \in V} b_v \pi_v - \sum_{e \in E} u_e p_e \\ \text{s.t.} \quad & \pi_{u} - \pi_{v} - p_e \le c_e, \quad \forall e = (u,v) \in E \\ & p_e \ge 0, \quad \forall e \in E \end{aligned} \]
对偶约束可改写为 \(p_e \ge \pi_{u} - \pi_{v} - c_e\),结合目标函数中 \(p_e\) 系数为负,最优解需取 \(p_e = \max(0, \pi_{u} - \pi_{v} - c_e)\)。
3. 原始-对偶算法框架
算法通过动态调整节点势 \(\pi_v\) 和边流量 \(f_e\),逐步满足互补松弛条件:
- 原始可行性:流量平衡与容量约束。
- 对偶可行性:\(p_e = \max(0, \pi_{u} - \pi_{v} - c_e) \ge 0\)。
- 互补松弛:
- 若 \(f_e > 0\),则 \(\pi_{u} - \pi_{v} - p_e = c_e\)。
- 若 \(p_e > 0\),则 \(f_e = u_e\)。
4. 算法步骤详解
步骤1:初始化
- 设初始势 \(\pi_v = 0\)(\(\forall v \in V\)),初始流 \(f_e = 0\)。
- 定义边集 \(E_f = \{ e \in E \mid f_e < u_e \}\)(可增广边)。
步骤2:构造辅助图与最短路径计算
- 以当前势 \(\pi\) 定义辅助边权:
\[ w_e = \begin{cases} c_e - (\pi_{u} - \pi_{v}) & \text{若 } e = (u,v) \in E_f \ (\text{可增广边}) \\ -(\pi_{u} - \pi_{v}) - c_e & \text{若 } e = (v,u) \in E \text{ 且 } f_e > 0 \ (\text{可减边}) \end{cases} \]
- 在辅助图中计算从超源 \(s^*\) 到所有节点的最短路径距离 \(d_v\)(使用Bellman-Ford算法处理负权边)。
步骤3:势更新与流量增广
- 更新节点势:\(\pi_v \leftarrow \pi_v + d_v\)。
- 沿最短路径增广流量:
- 对路径上的前向边(属 \(E_f\)),增加流量至容量上限。
- 对路径上的后向边(对应原图反向边),减少流量至零。
- 重复步骤2-3直至所有节点流量平衡约束满足。
5. 算法正确性与近似保证
- 正确性:每次迭代通过最短路径增广保证流量平衡,势更新确保对偶可行性。
- 近似比:若费用和容量为整数,算法在 \(O(\text{poly}(|V|, |E|))\) 时间内得到最优解(因该问题具完全对偶性,无需近似比)。
6. 实例演示
考虑图 \(G\) 含节点 \(\{1,2,3\}\),边集与参数:
- \(e_1 = (1,2): c=2, u=3\)
- \(e_2 = (2,3): c=1, u=2\)
- \(e_3 = (3,1): c=0, u=4\)
需求 \(b_1 = -2, b_2 = 1, b_3 = 1\)。
迭代1:
- 初始 \(\pi = [0,0,0]\), \(f = [0,0,0]\)。
- 辅助图边权:\(w_{e_1}=2, w_{e_2}=1, w_{e_3}=0\)。
- 最短路径:\(1 \to 3\)(权0),增广流量2(经 \(e_3\)),更新 \(f_3 = 2\)。
迭代2:
- 更新势:\(d=[0, \infty, 0]\),势不变。
- 辅助图新增反向边 \((3,1)\) 权0(因 \(f_3>0\))。
- 最短路径:\(2 \to 3 \to 1 \to 2\)(经反向边 \((3,1)\) 和 \(e_1\)),增广流量1,更新 \(f_1=1, f_3=1\)。
最终流 \(f_1=1, f_2=1, f_3=1\),总费用 \(1\times2 + 1\times1 + 1\times0 = 3\),满足所有约束且最优。