基于线性规划的“有向无环图最长路径”问题的动态规划与线性规划建模求解示例
1. 题目描述
我们考虑在一个有向无环图(Directed Acyclic Graph, DAG)中,每条边都带有一个权重(可以是长度、成本、时间等)。目标是找到从指定的起点 s 到指定的终点 t 的一条路径,使得路径上所有边的权重之和最大。这就是经典的“DAG最长路径问题”。
输入:
- 一个DAG:
G = (V, E),其中V是顶点集合,|V| = n,E是边集合,|E| = m。 - 一个权重函数
w: E -> R,为每条边(i, j)分配一个实数权重w_{ij}。权重可以是正数、负数或零。 - 指定的起点
s ∈ V和终点t ∈ V。
输出:
- 从
s到t的一条最长路径(即总权重最大的路径)。 - 该路径的最大总权重值。
这是一个可以在多项式时间内精确求解的问题,通常使用动态规划(基于拓扑排序)来解决。但本题目将展示如何将其建模为一个线性规划(LP)问题,并解释为什么这个LP的最优解恰好能给出最长路径,以及如何从LP解中恢复出路径。这揭示了组合优化问题与线性规划之间的一种深刻联系。
2. 线性规划建模
2.1 核心观察
在有向无环图中,从 s 到 t 的路径具有一个关键性质:对于路径上的任意中间顶点,流入该顶点的路径边恰好有一条,流出也恰好有一条(除了起点 s 只有流出,终点 t 只有流入)。
我们可以为每条边 (i, j) 引入一个决策变量 x_{ij},我们希望它满足以下条件时,就能表示一条从 s 到 t 的路径:
- 流平衡约束:除了
s和t外,每个顶点的流入量等于流出量。 - 单路径流:从
s流出的总流量为 1,流入t的总流量为 1。 - 非负性:
x_{ij} ≥ 0。
2.2 整数规划模型
如果要求 x_{ij} ∈ {0, 1},那么 x_{ij} = 1 表示边 (i, j) 在路径上,否则为0。目标函数是最大化路径的总权重:∑_{(i,j)∈E} w_{ij} * x_{ij}。
这是一个整数规划(IP)问题。但有意思的是,对于DAG最长路径问题,其线性规划松弛(即允许 x_{ij} 在 [0, 1] 区间内取分数值)的最优解,自动是整数解(0或1),并且对应一条从 s 到 t 的路径。因此,我们可以直接求解其线性规划松弛。
2.3 最终线性规划模型
决策变量:
- 对于每条有向边
(i, j) ∈ E,变量x_{ij} ≥ 0。
目标函数:
- 最大化总权重:
max ∑_{(i,j)∈E} w_{ij} * x_{ij}
约束条件:
- 源点
s的流量守恒:从s流出的净流量为1。
∑_{(s,j)∈E} x_{sj} - ∑_{(i,s)∈E} x_{is} = 1 - 汇点
t的流量守恒:流入t的净流量为1。
∑_{(i,t)∈E} x_{it} - ∑_{(t,j)∈E} x_{tj} = 1 - 中间顶点
v(v ≠ s, t) 的流量守恒:流入等于流出。
∑_{(i,v)∈E} x_{iv} = ∑_{(v,j)∈E} x_{vj}(对所有v ∈ V \ {s, t}) - 非负约束:
x_{ij} ≥ 0(对所有(i, j) ∈ E)
注意:这是一个最大费用流问题的特殊形式,其中所有边的容量为无穷大(或设置为1以上),单位流成本是权重 w_{ij},并且我们要求从 s 到 t 恰好发送1个单位的流。
3. 为什么线性规划的解对应一条路径?
3.1 总是一组路径和环的集合
根据网络流理论,任何一个可行解 x 都可以分解成若干个从 s 到 t 的路径流和若干个环流的和。因为从 s 流出的净流量是1,流入 t 的净流量是1,所以必然存在至少一条从 s 到 t 的路径流。
3.2 DAG中无正环
关键点在于:在一个DAG中,不存在有向环。因此,分解中出现的“环流”只能是零流(因为没有环可以承载流量)。所以,任何可行解 x 必然可以分解为一条或多条从 s 到 t 的路径的凸组合。
3.3 最优解是一条简单路径
假设最优解 x* 分解为多条路径 P1, P2, ..., Pk,对应的流量值分别为 f1, f2, ..., fk,且 f1 + f2 + ... + fk = 1,fi > 0。每条路径 Pi 有一个总权重 W(Pi) = ∑_{(u,v)∈Pi} w_{uv}。
那么,目标函数值 = f1*W(P1) + f2*W(P2) + ... + fk*W(Pk)。
由于这是一个凸组合,其值不会超过这些 W(Pi) 中的最大值。即,f1*W(P1) + ... + fk*W(Pk) ≤ max{W(P1), ..., W(Pk)}。
为了最大化目标函数,最优解必然会将所有流量(即1个单位)都分配给具有最大总权重的那条路径。因此,x* 中,属于这条最长路径的边 x_{ij} = 1,其他边 x_{ij} = 0。这恰好是一个0-1解,对应着从 s 到 t 的最长简单路径。
结论:对于DAG,上述线性规划的最优解自动是整数解(0或1),并精确给出了最长路径。
4. 求解步骤与示例
假设我们有一个简单的DAG如下:
- 顶点:
V = {1, 2, 3, 4, 5},其中s=1,t=5。 - 有向边及权重:
(1,2): 3,(1,3): 2,
(2,4): 5,(2,5): 1,
(3,4): 1,(3,5): 4,
(4,5): 2。
步骤1:建立线性规划模型
变量:x12, x13, x24, x25, x34, x35, x45 (对应7条边)。
目标:max 3*x12 + 2*x13 + 5*x24 + 1*x25 + 1*x34 + 4*x35 + 2*x45
约束:
- 顶点1 (源点):
x12 + x13 = 1(流出为1,假设没有流入边)。 - 顶点5 (汇点):
x25 + x35 + x45 = 1(流入为1)。 - 顶点2:
x12 = x24 + x25(流入x12等于流出x24+x25)。 - 顶点3:
x13 = x34 + x35。 - 顶点4:
x24 + x34 = x45。 - 非负: 所有
x_{ij} ≥ 0。
步骤2:求解线性规划
我们可以使用单纯形法或任何LP求解器。通过手动推理或计算,可以找到最优解:
x12 = 1,x13 = 0x24 = 1,x25 = 0x34 = 0,x35 = 0x45 = 1
目标函数值 = 3*1 + 5*1 + 2*1 = 10。
步骤3:从解中恢复路径
检查 x_{ij} = 1 的边:(1,2), (2,4), (4,5)。它们形成一条路径 1 -> 2 -> 4 -> 5,总权重为 3+5+2=10。
步骤4:验证
我们也可以枚举从1到5的所有路径:
- 1-2-5: 3+1=4
- 1-2-4-5: 3+5+2=10
- 1-3-5: 2+4=6
- 1-3-4-5: 2+1+2=5
最长路径确实是1->2->4->5,权重为10,与LP结果一致。
5. 与动态规划方法的关联
对于DAG最长路径,经典的动态规划(DP)算法基于拓扑排序:
- 设
dist[v]为从s到v的最长路径长度。 - 按拓扑序处理顶点,对于每个顶点
v,dist[v] = max_{(u,v)∈E} {dist[u] + w_{uv}},初始dist[s] = 0。
有趣的是,这个DP算法实际上是上述线性规划问题的对偶问题的求解过程。
- 原始LP(我们建立的模型)是一个最大化的线性规划。
- 它的对偶LP 将为每个顶点
v引入一个对偶变量y_v(无符号限制),以及对偶约束:对于每条边(i,j),有y_i - y_j ≥ w_{ij}。目标是最小化y_t - y_s。 - 在DAG中,可以令
y_s = 0,然后按拓扑序递推y_v = max_{(u,v)∈E} {y_u + w_{uv}}。最终y_t就是从s到t的最长路径长度。这正是动态规划算法! - 强对偶定理保证了原始LP的最优值等于对偶LP的最优值。
因此,线性规划建模不仅提供了另一种求解视角,还通过对偶理论将问题与高效的动态规划算法联系了起来。
6. 总结
- DAG最长路径问题可以自然地建模为一个线性规划问题,其约束是流平衡方程,目标是最大化路径权重和。
- 由于图中无环,该线性规划松弛的最优解自动是整数解,直接对应一条从源到汇的最长简单路径。
- 求解此线性规划等同于求解一个特殊的最大费用流问题(发送1单位流)。
- 该线性规划的对偶问题直接对应于基于拓扑排序的动态规划算法,这体现了优化理论中原始-对偶的优美对称性。
- 此方法不仅提供了理论上的洞察,也可以利用成熟的线性规划求解器来实际计算最长路径,尤其适用于当图的规模很大或需要嵌入到更大优化模型中时。