基于线性规划的“有向无环图(DAG)最长路径”问题的线性规划建模与求解
题目描述
给定一个有向无环图(DAG) \(G=(V,E)\),其中:
- \(V\) 是顶点集,共 \(n\) 个顶点,顶点编号为 \(1,2,\dots,n\)。
- \(E\) 是边集,共 \(m\) 条有向边,每条边 \(e=(u,v)\) 有一个权重 \(w_e\)(可正可负,表示距离、时间、收益等)。
- 图中无有向环(保证是 DAG)。
选取图中一条路径(顶点不重复),使得路径上边的权重之和最大。此问题称为 DAG 的最长路径问题。
注意:由于是 DAG,最长路径可以在多项式时间内求解(例如用动态规划),但本题要求用线性规划建模并解释如何求解。
解题步骤
1. 线性规划模型构建
我们需要为每个顶点 \(v\) 引入一个连续变量 \(d_v\),表示从某个固定起点 \(s\) 到顶点 \(v\) 的“最长距离”估计。
设 \(s\) 为路径的起点,\(t\) 为路径的终点。我们可以将问题转化为约束最大化问题。
决策变量:
\(d_v \in \mathbb{R}\),对每个顶点 \(v \in V\)。
目标函数:
最大化从起点 \(s\) 到终点 \(t\) 的路径长度,即:
\[\text{最大化} \quad d_t \]
但需注意,我们最终要得到的是全局最长路径,而不仅仅是 \(s\) 到 \(t\) 的。为此,可以引入一个“超级源”和“超级汇”,或者直接对所有可能的起点终点建模。这里采用更通用的方法:约束所有边满足“距离三角不等式”,并最大化所有 \(d_v\) 中的最大值。
一个常见的技巧是:
- 固定一个“参考点” \(r\),设 \(d_r = 0\)。
- 对所有边 \((u,v) \in E\),要求:
\[ d_v \ge d_u + w_{(u,v)} \]
- 则对任意顶点 \(v\),\(d_v\) 至少等于从 \(r\) 沿某条路径到 \(v\) 的长度。
- 为了找到整个图中的最长路径,我们最大化所有 \(d_v\) 的和(或最大值),但需小心避免无界。
更好的建模是直接对路径的边选择进行0-1变量建模,然后用线性规划松弛。这里我们用流平衡思想:
另一种建模(基于流):
引入变量 \(f_e \ge 0\) 表示边 \(e\) 是否在路径中被使用(连续松弛)。
设路径起点为 \(s\),终点为 \(t\),则:
- 对 \(s\):流出流量 = 1,流入流量 = 0。
- 对 \(t\):流入流量 = 1,流出流量 = 0。
- 对其他顶点:流入 = 流出。
- 目标是最大化 \(\sum_{e \in E} w_e f_e\)。
但这样会允许流量分流(变成流问题),不一定形成简单路径。在 DAG 中,由于无环,我们可以证明最优解会是整数(实际上是一个最长路径的表示)。
我们采用更直观的三角不等式模型:
设 \(d_v\) 表示从某个“虚拟源”到 \(v\) 的最长距离,但我们不固定源点,而是允许任意起点。
我们可以引入一个“超级源” \(s\) 连接到所有顶点,边权为 0,并设 \(d_s = 0\),然后对所有 \(v\),最大化 \(d_v\)。
但这样会导致 \(d_v\) 可以无限大(如果有正权环,但 DAG 无环,所以不会无限大,但可能多个起点导致目标不明确)。
更好的方法是标准最长路径的线性规划(基于对偶思想):
变量:\(x_e \in \{0,1\}\) 表示边 \(e\) 是否在路径中。
约束:
- 对每个顶点 \(v\),路径中进入 \(v\) 的边数 = 离开 \(v\) 的边数,除非 \(v\) 是路径起点(出度=1,入度=0)或终点(入度=1,出度=0)。
- 但这样需要区分离起点和终点,不方便。
实际常用且简单的建模(适用于 DAG):
决策变量:
\(d_v\):从任意起点到顶点 \(v\) 的最长路径长度(连续变量)。
约束:
对每条有向边 \((u,v) \in E\):
\[d_v \ge d_u + w_{(u,v)} \quad \text{(三角不等式)} \]
这表示:到 \(v\) 的距离至少是到 \(u\) 的距离加上边权。
目标:
最大化 \(\sum_{v \in V} d_v\) 或 \(\max_{v} d_v\)。
但为了避免所有 \(d_v\) 同时增大,我们需要固定一个顶点的 \(d\) 值为 0(否则可整体加常数不影响约束)。
设任意一个顶点 \(r\) 为参考点,令:
\[d_r = 0 \]
然后目标函数为:
\[\text{最大化} \quad d_t \quad \text{(对某个终点 $t$)} \]
但我们要找全局最长路径,所以可以依次对每个可能的终点 \(t\) 求解,取最大。
或者,引入一个虚拟终点 \(t'\),从所有顶点连到 \(t'\) 边权为 0,然后最大化 \(d_{t'}\)。
最终采用的简洁模型(DAG 最长路径的线性规划):
- 在原图 \(G\) 中添加一个超级源 \(s\),从 \(s\) 到每个顶点 \(v\) 加一条有向边 \((s,v)\),边权为 0。
- 添加一个超级汇 \(t\),从每个顶点 \(v\) 到 \(t\) 加一条有向边 \((v,t)\),边权为 0。
- 决策变量:对每个顶点 \(v\),\(d_v \in \mathbb{R}\) 表示从 \(s\) 到 \(v\) 的最长距离。
- 约束:
- 对每条原图的边 \((u,v) \in E\):
\[ d_v \ge d_u + w_{(u,v)} \]
- 对每条添加的边 \((s,v)\):
\[ d_v \ge d_s + 0 = d_s \]
- 对每条添加的边 \((v,t)\):
\[ d_t \ge d_v + 0 \]
- 固定 \(d_s = 0\)(避免全体偏移)。
- 目标:最大化 \(d_t\)。
解释:
由于 DAG 无环,这个线性规划的最优解中,每个 \(d_v\) 正好等于从 \(s\) 到 \(v\) 的最长路径长度(通过拓扑排序可验证)。
因此 \(d_t\) 就是全局最长路径长度。
2. 线性规划形式
\[\begin{aligned} \max \quad & d_t \\ \text{s.t.} \quad & d_v \ge d_u + w_{(u,v)}, \quad \forall (u,v) \in E \\ & d_v \ge d_s, \quad \forall v \in V \quad (\text{来自超级源的边}) \\ & d_t \ge d_v, \quad \forall v \in V \quad (\text{到超级汇的边}) \\ & d_s = 0 \\ & d_v \in \mathbb{R}, \quad \forall v \in V \end{aligned} \]
实际上,从 \(s\) 到 \(v\) 的边权为 0 的约束可简化为 \(d_v \ge 0\)(因为 \(d_s=0\))。
类似地,\(d_t \ge d_v\) 保证 \(d_t\) 至少是所有 \(d_v\) 的最大值。
因此模型可简化为:
\[\begin{aligned} \max \quad & d_t \\ \text{s.t.} \quad & d_v \ge d_u + w_{(u,v)}, \quad \forall (u,v) \in E \\ & d_v \ge 0, \quad \forall v \in V \\ & d_t \ge d_v, \quad \forall v \in V \\ & d_s = 0 \end{aligned} \]
但注意 \(d_s\) 是超级源,我们可省略其变量,因为其值固定为 0。
3. 求解方法
这是一个线性规划,变量数为 \(|V|\),约束数为 \(|E| + 2|V|\) 级别。
可以用单纯形法或内点法求解。
但由于是 DAG,我们可以利用其特殊结构:
这个线性规划的约束矩阵是全单模的(因为关联矩阵是网络矩阵),所以最优解是整数(如果边权是整数)。
实际上,此线性规划的对偶问题是最小割问题,但在 DAG 中最长路径等价于最短路径的相反数(将边权取负后求最短路径)。
因此,求解步骤可以是:
- 将所有权重 \(w_e\) 取负,得到新权重 \(w'_e = -w_e\)。
- 在新图上求最短路径(可用动态规划,因为 DAG 无环)。
- 将最短路径长度取负,即得到原图最长路径长度。
4. 举例说明
考虑一个简单 DAG:
顶点:1,2,3,4
有向边与权重:
(1→2, 5), (1→3, 3), (2→4, 2), (3→4, 4)
我们希望求最长路径。
用上述线性规划建模:
变量:\(d_1,d_2,d_3,d_4,d_t\),固定 \(d_s=0\)(这里 \(s\) 是超级源,我们可隐去,直接设 \(d_1 \ge 0\) 等)。
约束:
- \(d_2 \ge d_1 + 5\)
- \(d_3 \ge d_1 + 3\)
- \(d_4 \ge d_2 + 2\)
- \(d_4 \ge d_3 + 4\)
- \(d_1 \ge 0, d_2 \ge 0, d_3 \ge 0, d_4 \ge 0\)
- \(d_t \ge d_1, d_t \ge d_2, d_t \ge d_3, d_t \ge d_4\)
- 目标:\(\max d_t\)
求解:
从约束看出,要使 \(d_t\) 最大,应尽可能提高 \(d_4\)。
路径 1→3→4 长度 3+4=7,路径 1→2→4 长度 5+2=7,所以最长路径长度为 7。
线性规划最优解:\(d_1=0, d_2=5, d_3=3, d_4=7, d_t=7\)。
5. 一般求解步骤(数值计算)
- 输入 DAG 的边列表及权重。
- 建立线性规划模型:
- 变量:\(d_v\) 对每个顶点 \(v\)。
- 约束:对每条边 \((u,v)\),\(d_v - d_u \ge w_{uv}\)。
- 目标:\(\max \sum_v d_v\) 或 \(\max d_t\)(若指定终点)。
- 为消除自由度,固定一个顶点(如编号最小)的 \(d=0\)。
- 用线性规划求解器(如单纯形法)求解。
- 最优目标值即为最长路径长度。
- 恢复路径:检查哪些边满足 \(d_v = d_u + w_{uv}\)(紧约束),这些边构成最长路径的边。
总结
- DAG 最长路径可用线性规划建模为一系列三角不等式约束下的最大值问题。
- 该线性规划具有网络结构,可用高效算法求解,等价于动态规划(拓扑排序)。
- 模型简单直观,展示了如何用线性规划处理图论优化问题。