基于线性规划的图最小费用循环流问题的多项式时间双尺度尺度算法求解示例
题目描述
考虑一个带权有向图 \(G = (V, E)\),其中每条边 \(e \in E\) 有容量上界 \(u_e\)、容量下界 \(l_e\)(通常为0)和单位流量成本 \(c_e\)。最小费用循环流问题要求找到一个循环流(即满足流量守恒的流),使得总成本 \(\sum_{e \in E} c_e f_e\) 最小,且满足容量约束 \(l_e \leq f_e \leq u_e\)。本问题可通过线性规划建模,并利用多项式时间的双尺度尺度算法求解,该算法通过动态调整成本和容量尺度,逐步逼近最优解。
解题过程
- 线性规划建模
定义决策变量 \(f_e\) 表示边 \(e\) 的流量,问题可写为:
\[ \begin{align} \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 = 0, \quad \forall v \in V \quad \text{(流量守恒)} \\ & l_e \leq f_e \leq u_e, \quad \forall e \in E \end{align} \]
其中 \(\delta^+(v)\) 和 \(\delta^-(v)\) 分别表示从顶点 \(v\) 出发和进入 \(v\) 的边集合。
-
算法核心思想
双尺度尺度算法通过两种尺度参数控制优化过程:- 成本尺度 \(\Delta\):将成本系数按 \(\Delta\) 缩放,仅考虑高成本边以简化问题。
- 容量尺度 \(\delta\):将容量约束按 \(\delta\) 缩放,逐步放宽精度要求。
算法迭代地调整 \(\Delta\) 和 \(\delta\),每次在缩放后的问题上求解近似解,并逐步细化至最优解。
-
初始化与预处理
- 令初始成本尺度 \(\Delta = \max_{e \in E} |c_e|\),容量尺度 \(\delta = \max_{e \in E} u_e\)。
- 若图中存在负环(成本为负的环),需先通过负环消去算法预处理,确保问题有界。
-
缩放阶段(外循环:成本尺度)
步骤1:成本缩放
将成本系数按当前尺度 \(\Delta\) 离散化:
\[ c_e' = \left\lfloor \frac{c_e}{\Delta} \right\rfloor \]
仅保留满足 \(|c_e'| \leq K\) 的边(\(K\) 为常数),忽略高价边以简化网络。
步骤2:容量缩放(内循环)
- 初始化容量尺度 \(\delta = \max u_e\),当前流 \(f = 0\)。
- While \(\delta \geq 1\):
a. 构建残量网络 \(G_f\),其中边的残量容量为 \(r_e = u_e - f_e\)(正向)或 \(f_e - l_e\)(反向)。
b. 将残量容量按 \(\delta\) 缩放:仅保留容量 \(\geq \delta\) 的边,形成子网络 \(G_f(\delta)\)。
c. 在 \(G_f(\delta)\) 中寻找负成本环(单位成本 \(c_e'\) 下)。若存在,沿环增广流量(步长 \(\delta\)),更新流 \(f\)。
d. 若无可增广环,将 \(\delta\) 减半: \(\delta \leftarrow \delta / 2\)。
步骤3:更新成本尺度
将 \(\Delta\) 减半: \(\Delta \leftarrow \Delta / 2\)。若 \(\Delta < 1\),终止;否则返回步骤1。
- 终止与最优性检验
- 当 \(\Delta < 1\) 时,当前流 \(f\) 即为 \((1+\epsilon)\)-近似最优解(\(\epsilon\) 由尺度参数控制)。
- 通过残量网络检验最优性:若无可增广负环,则流为最优。
实例演示
考虑简单图:顶点集 \(V = \{1, 2, 3\}\),边集 \(E = \{(1,2), (2,3), (3,1)\}\),容量 \(u_e = 5\),成本 \(c = (2, -1, 1)\)。
- 初始化 \(\Delta = 2\),\(\delta = 5\)。
- 成本缩放:\(c' = (1, -1, 0)\)。
- 容量缩放:
- \(\delta = 5\) 时,残量网络包含所有边(容量均 ≥5)。沿环 \(1 \to 2 \to 3 \to 1\) 增广流量5(成本 \(1-1+0=0\))。
- \(\delta = 2.5\) 时无负环,继续缩放至 \(\delta < 1\)。
- 更新 \(\Delta = 1\),重新缩放成本后求解,得最优流 \(f = (5, 5, 5)\),总成本 \(5 \times (2 -1 +1) = 10\)。
关键点说明
- 双尺度尺度通过粗到细的缩放平衡计算效率与精度,复杂度为 \(O(|E|^2 \log |V| \log U)\)(\(U\) 为最大容量)。
- 容量缩放避免处理小容量边,减少负环搜索范围;成本缩放逐步聚焦关键成本边。
- 该算法适用于大规模网络流问题,尤其当成本和容量范围较大时。