基于线性规划的“有向无环图最长路径”问题的动态规划与线性规划建模求解示例
字数 3927 2025-12-24 10:32:50

基于线性规划的“有向无环图最长路径”问题的动态规划与线性规划建模求解示例

1. 题目描述

我们考虑在一个有向无环图(Directed Acyclic Graph, DAG)中,每条边都带有一个权重(可以是长度、成本、时间等)。目标是找到从指定的起点 s 到指定的终点 t 的一条路径,使得路径上所有边的权重之和最大。这就是经典的“DAG最长路径问题”。

输入

  • 一个DAG:G = (V, E),其中 V 是顶点集合,|V| = nE 是边集合,|E| = m
  • 一个权重函数 w: E -> R,为每条边 (i, j) 分配一个实数权重 w_{ij}。权重可以是正数、负数或零。
  • 指定的起点 s ∈ V 和终点 t ∈ V

输出

  • st 的一条最长路径(即总权重最大的路径)。
  • 该路径的最大总权重值。

这是一个可以在多项式时间内精确求解的问题,通常使用动态规划(基于拓扑排序)来解决。但本题目将展示如何将其建模为一个线性规划(LP)问题,并解释为什么这个LP的最优解恰好能给出最长路径,以及如何从LP解中恢复出路径。这揭示了组合优化问题与线性规划之间的一种深刻联系。


2. 线性规划建模

2.1 核心观察

在有向无环图中,从 st 的路径具有一个关键性质:对于路径上的任意中间顶点,流入该顶点的路径边恰好有一条,流出也恰好有一条(除了起点 s 只有流出,终点 t 只有流入)。

我们可以为每条边 (i, j) 引入一个决策变量 x_{ij},我们希望它满足以下条件时,就能表示一条从 st 的路径:

  1. 流平衡约束:除了 st 外,每个顶点的流入量等于流出量。
  2. 单路径流:从 s 流出的总流量为 1,流入 t 的总流量为 1。
  3. 非负性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),并且对应一条从 st 的路径。因此,我们可以直接求解其线性规划松弛。

2.3 最终线性规划模型

决策变量

  • 对于每条有向边 (i, j) ∈ E,变量 x_{ij} ≥ 0

目标函数

  • 最大化总权重:max ∑_{(i,j)∈E} w_{ij} * x_{ij}

约束条件

  1. 源点 s 的流量守恒:从 s 流出的净流量为1。
    ∑_{(s,j)∈E} x_{sj} - ∑_{(i,s)∈E} x_{is} = 1
  2. 汇点 t 的流量守恒:流入 t 的净流量为1。
    ∑_{(i,t)∈E} x_{it} - ∑_{(t,j)∈E} x_{tj} = 1
  3. 中间顶点 v (v ≠ s, t) 的流量守恒:流入等于流出。
    ∑_{(i,v)∈E} x_{iv} = ∑_{(v,j)∈E} x_{vj} (对所有 v ∈ V \ {s, t}
  4. 非负约束
    x_{ij} ≥ 0 (对所有 (i, j) ∈ E

注意:这是一个最大费用流问题的特殊形式,其中所有边的容量为无穷大(或设置为1以上),单位流成本是权重 w_{ij},并且我们要求从 st 恰好发送1个单位的流。


3. 为什么线性规划的解对应一条路径?

3.1 总是一组路径和环的集合

根据网络流理论,任何一个可行解 x 都可以分解成若干个从 st 的路径流和若干个环流的和。因为从 s 流出的净流量是1,流入 t 的净流量是1,所以必然存在至少一条从 st 的路径流。

3.2 DAG中无正环

关键点在于:在一个DAG中,不存在有向环。因此,分解中出现的“环流”只能是零流(因为没有环可以承载流量)。所以,任何可行解 x 必然可以分解为一条或多条st 的路径的凸组合。

3.3 最优解是一条简单路径

假设最优解 x* 分解为多条路径 P1, P2, ..., Pk,对应的流量值分别为 f1, f2, ..., fk,且 f1 + f2 + ... + fk = 1fi > 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解,对应着从 st 的最长简单路径。

结论:对于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. 顶点1 (源点): x12 + x13 = 1 (流出为1,假设没有流入边)。
  2. 顶点5 (汇点): x25 + x35 + x45 = 1 (流入为1)。
  3. 顶点2: x12 = x24 + x25 (流入 x12 等于流出 x24+x25)。
  4. 顶点3: x13 = x34 + x35
  5. 顶点4: x24 + x34 = x45
  6. 非负: 所有 x_{ij} ≥ 0

步骤2:求解线性规划

我们可以使用单纯形法或任何LP求解器。通过手动推理或计算,可以找到最优解:

  • x12 = 1, x13 = 0
  • x24 = 1, x25 = 0
  • x34 = 0, x35 = 0
  • x45 = 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] 为从 sv 的最长路径长度。
  • 按拓扑序处理顶点,对于每个顶点 vdist[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 就是从 st 的最长路径长度。这正是动态规划算法!
  • 强对偶定理保证了原始LP的最优值等于对偶LP的最优值。

因此,线性规划建模不仅提供了另一种求解视角,还通过对偶理论将问题与高效的动态规划算法联系了起来。


6. 总结

  • DAG最长路径问题可以自然地建模为一个线性规划问题,其约束是流平衡方程,目标是最大化路径权重和。
  • 由于图中无环,该线性规划松弛的最优解自动是整数解,直接对应一条从源到汇的最长简单路径。
  • 求解此线性规划等同于求解一个特殊的最大费用流问题(发送1单位流)。
  • 该线性规划的对偶问题直接对应于基于拓扑排序的动态规划算法,这体现了优化理论中原始-对偶的优美对称性。
  • 此方法不仅提供了理论上的洞察,也可以利用成熟的线性规划求解器来实际计算最长路径,尤其适用于当图的规模很大或需要嵌入到更大优化模型中时。
基于线性规划的“有向无环图最长路径”问题的动态规划与线性规划建模求解示例 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 = 0 x24 = 1 , x25 = 0 x34 = 0 , x35 = 0 x45 = 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单位流)。 该线性规划的对偶问题直接对应于基于拓扑排序的 动态规划算法 ,这体现了优化理论中原始-对偶的优美对称性。 此方法不仅提供了理论上的洞察,也可以利用成熟的线性规划求解器来实际计算最长路径,尤其适用于当图的规模很大或需要嵌入到更大优化模型中时。