线性规划的分解算法求解示例
字数 4574 2025-10-26 09:00:51

线性规划的分解算法求解示例

题目描述
考虑一个大型线性规划问题,其约束矩阵具有特殊的块角结构(Block Angular Structure)。这类问题常见于多工厂、多产品的生产规划场景。假设某公司有两个工厂(工厂1和工厂2),每个工厂生产两种产品(产品A和产品B)。每个工厂有各自的资源约束(如劳动力、原材料),同时公司有整体的共享资源约束(如总预算)。目标是在满足所有约束下最大化总利润。

具体模型如下:
决策变量

  • \(x_{ij}\):工厂i生产产品j的数量(i=1,2;j=A,B)

目标函数
最大化总利润:

\[\max Z = 5x_{1A} + 4x_{1B} + 6x_{2A} + 3x_{2B} \]

约束条件

  1. 共享资源约束(公司级):

\[ x_{1A} + 2x_{1B} + 3x_{2A} + x_{2B} \leq 10 \quad \text{(共享资源限制)} \]

  1. 工厂1的局部约束

\[ 2x_{1A} + x_{1B} \leq 8 \quad \text{(工厂1产能)} \]

\[ x_{1A} + 2x_{1B} \leq 7 \quad \text{(工厂1原材料)} \]

  1. 工厂2的局部约束

\[ x_{2A} + 3x_{2B} \leq 9 \quad \text{(工厂2产能)} \]

\[ 2x_{2A} + x_{2B} \leq 6 \quad \text{(工厂2原材料)} \]

  1. 非负性

\[ x_{ij} \geq 0 \quad \text{对所有i,j} \]

该问题的约束矩阵呈现块角结构:

  • 共享约束涉及所有变量,
  • 工厂1的约束仅涉及 \(x_{1A}, x_{1B}\)
  • 工厂2的约束仅涉及 \(x_{2A}, x_{2B}\)

解题过程
分解算法(如Dantzig-Wolfe分解)将问题分解为一个主问题(Master Problem)和多个子问题(Subproblems),通过迭代求解主问题和子问题来避免直接处理大规模模型。以下是逐步推导:

步骤1:问题分解

  • 主问题:处理共享约束(式1),代表资源协调层。
  • 子问题:每个工厂独立求解其局部问题(式2-5),生成可行生产方案。
    • 子问题1(工厂1):约束为式2和式3,变量为 \(x_{1A}, x_{1B}\)
    • 子问题2(工厂2):约束为式4和式5,变量为 \(x_{2A}, x_{2B}\)

步骤2:子问题的可行顶点枚举
每个子问题的可行域是多面体,其极点(顶点)代表基础生产方案。

  • 子问题1的顶点(通过枚举约束交点):

    • 顶点P1: \((x_{1A}, x_{1B}) = (0,0)\),利润贡献:0
    • 顶点P2: \((4,0)\)(由 \(2x_{1A} + x_{1B} = 8\)\(x_{1B}=0\) 解得),利润:\(5*4 + 4*0 = 20\)
    • 顶点P3: \((3,2)\)(由 \(2x_{1A} + x_{1B} = 8\)\(x_{1A} + 2x_{1B} = 7\) 解得),利润:\(5*3 + 4*2 = 23\)
    • 顶点P4: \((0,3.5)\)(由 \(x_{1A}=0\)\(x_{1A} + 2x_{1B} = 7\) 解得),利润:14
    • 顶点P5: \((2,3)\)(由 \(x_{1A} + 2x_{1B} = 7\)\(x_{1A}=2\) 插值?实际需验证可行性:代入式2: \(2*2+3=7 \leq 8\);式3: \(2+2*3=8>7\) 不可行?修正:正确顶点应为约束交点。重新计算:
      • 式2和式3的交点:解方程 \(2x_{1A} + x_{1B} = 8\)\(x_{1A} + 2x_{1B} = 7\),得 \(x_{1A}=3, x_{1B}=2\)(顶点P3)。
      • 其他顶点:与坐标轴交点:\((0,0)\)\((4,0)\)\((0,3.5)\)
      • 因此子问题1有4个顶点:P1(0,0), P2(4,0), P3(3,2), P4(0,3.5)。
  • 子问题2的顶点

    • 顶点Q1: \((0,0)\),利润:0
    • 顶点Q2: \((3,0)\)(由 \(2x_{2A} + x_{2B} = 6\)\(x_{2B}=0\) 解得),利润:18
    • 顶点Q3: \((0,3)\)(由 \(x_{2A} + 3x_{2B} = 9\)\(x_{2A}=0\) 解得),利润:9
    • 顶点Q4: \((2,2)\)(由 \(2x_{2A} + x_{2B} = 6\)\(x_{2A} + 3x_{2B} = 9\) 解得?验证:式4: \(2+3*2=8 \leq 9\);式5: \(2*2+2=6 \leq 6\),利润:\(6*2 + 3*2 = 18\)
    • 顶点Q5: \((1,4)\)(由 \(x_{2A} + 3x_{2B} = 9\)\(x_{2A}=1\)\(x_{2B}=8/3 \approx 2.67\),但代入式5: \(2*1 + 2.67=4.67>6\) 不可行)。修正:正确顶点为约束交点:
      • 式4和式5的交点:解 \(x_{2A} + 3x_{2B} = 9\)\(2x_{2A} + x_{2B} = 6\),得 \(x_{2A}=1.8, x_{2B}=2.4\)(顶点Q4)。
      • 其他顶点:\((0,0)\)\((3,0)\)\((0,3)\)
      • 因此子问题2有4个顶点:Q1(0,0), Q2(3,0), Q3(0,3), Q4(1.8,2.4)。

步骤3:主问题构建
主问题的变量是子问题顶点的权重(凸组合系数):

  • \(\lambda_k\):代表工厂1采用顶点Pk的方案权重(k=1,...,4)。
  • \(\mu_m\):代表工厂2采用顶点Qm的方案权重(m=1,...,4)。

主问题形式:

\[\max Z = \sum_{k=1}^4 (5p_{kA} + 4p_{kB}) \lambda_k + \sum_{m=1}^4 (6q_{mA} + 3q_{mB}) \mu_m \]

约束:

  1. 共享资源约束

\[ \sum_{k=1}^4 (p_{kA} + 2p_{kB}) \lambda_k + \sum_{m=1}^4 (3q_{mA} + q_{mB}) \mu_m \leq 10 \]

(其中 \(p_{kA}\) 是顶点Pk的x_{1A}值,例如P3的 \(p_{3A}=3, p_{3B}=2\)
2. 凸组合约束(保证权重和为1):

\[ \sum_{k=1}^4 \lambda_k = 1, \quad \sum_{m=1}^4 \mu_m = 1 \]

  1. 非负性\(\lambda_k, \mu_m \geq 0\)

步骤4:迭代求解(列生成)
由于顶点数量多,直接枚举低效,采用列生成法逐步添加顶点。

  1. 初始主问题:仅包含部分顶点(如每个子问题的原点顶点P1和Q1)。
    • 初始主问题:

\[ \max Z = 0\lambda_1 + 0\mu_1 \]

 约束:  
 - 共享资源: $ (0+2*0)\lambda_1 + (3*0+0)\mu_1 \leq 10 $ → 0 ≤ 10  
 - 凸组合: $ \lambda_1 = 1, \mu_1 = 1 $  
 解: $ \lambda_1=1, \mu_1=1, Z=0 $。  
  1. 子问题求解(生成新列)
    • 主问题共享约束的对偶变量记为 \(\pi\)(本例中只有一个共享约束)。
    • 子问题1的减少成本(Reduced Cost)为:

\[ \text{RC1} = (5 - \pi \cdot 1)x_{1A} + (4 - \pi \cdot 2)x_{1B} \]

 其中 $ \pi $ 是主问题共享约束的对偶值。初始主问题中,共享约束宽松(0 ≤ 10),故 $ \pi = 0 $。  
 子问题1的目标:最大化 $ 5x_{1A} + 4x_{1B} $,解为顶点P3(3,2),利润=23。  
  • 同理,子问题2在 \(\pi=0\) 下最大化 \(6x_{2A} + 3x_{2B}\),解为顶点Q2(3,0),利润=18。
  1. 添加新列
    • 将顶点P3和Q2加入主问题,主问题变为:

\[ \max Z = 23\lambda_3 + 18\mu_2 \]

 约束:  
 - 共享资源: $ (3 + 2*2)\lambda_3 + (3*3 + 0)\mu_2 \leq 10 $ → $ 7\lambda_3 + 9\mu_2 \leq 10 $  
 - 凸组合: $ \lambda_1 + \lambda_3 = 1 $, $ \mu_1 + \mu_2 = 1 $  
 - 非负性。  
 求解:尝试组合:若 $ \lambda_3=1, \mu_2=1 $,则共享资源:7+9=16>10不可行。需线性规划求解:  
   - 最优解: $ \lambda_3=1, \mu_2=0.333 $(满足 $ 7*1 + 9*0.333 = 10 $),Z=23 + 18*0.333=29。  
  1. 下一次迭代
    • 更新对偶变量 \(\pi\)(主问题共享约束的边际价值)。通过主问题求解得到 \(\pi \approx 2\)(具体值需计算对偶)。
    • 子问题1的新目标:最大化 \((5-2*1)x_{1A} + (4-2*2)x_{1B} = 3x_{1A} + 0x_{1B}\),最优解为P2(4,0),减少成本=12>0,可加入。
    • 子问题2的新目标:最大化 \((6-2*3)x_{2A} + (3-2*1)x_{2B} = 0x_{2A} + 1x_{2B}\),最优解为Q3(0,3),减少成本=3>0,可加入。
    • 添加新列后主问题重新求解,直至所有减少成本非正(最优条件)。

步骤5:终止与还原
当子问题的减少成本均非正时,主问题达到最优。最终主问题的解通过顶点权重组合还原原变量:

  • 例如最优权重 \(\lambda_3=1, \mu_4=1\)(假设),则 \(x_{1A}=3, x_{1B}=2, x_{2A}=1.8, x_{2B}=2.4\)

通过分解,将6个约束的原问题转化为多次小规模问题求解,提升计算效率。

线性规划的分解算法求解示例 题目描述 考虑一个大型线性规划问题,其约束矩阵具有特殊的块角结构(Block Angular Structure)。这类问题常见于多工厂、多产品的生产规划场景。假设某公司有两个工厂(工厂1和工厂2),每个工厂生产两种产品(产品A和产品B)。每个工厂有各自的资源约束(如劳动力、原材料),同时公司有整体的共享资源约束(如总预算)。目标是在满足所有约束下最大化总利润。 具体模型如下: 决策变量 : \( x_ {ij} \):工厂i生产产品j的数量(i=1,2;j=A,B) 目标函数 : 最大化总利润: \[ \max Z = 5x_ {1A} + 4x_ {1B} + 6x_ {2A} + 3x_ {2B} \] 约束条件 : 共享资源约束 (公司级): \[ x_ {1A} + 2x_ {1B} + 3x_ {2A} + x_ {2B} \leq 10 \quad \text{(共享资源限制)} \] 工厂1的局部约束 : \[ 2x_ {1A} + x_ {1B} \leq 8 \quad \text{(工厂1产能)} \] \[ x_ {1A} + 2x_ {1B} \leq 7 \quad \text{(工厂1原材料)} \] 工厂2的局部约束 : \[ x_ {2A} + 3x_ {2B} \leq 9 \quad \text{(工厂2产能)} \] \[ 2x_ {2A} + x_ {2B} \leq 6 \quad \text{(工厂2原材料)} \] 非负性 : \[ x_ {ij} \geq 0 \quad \text{对所有i,j} \] 该问题的约束矩阵呈现块角结构: 共享约束涉及所有变量, 工厂1的约束仅涉及 \( x_ {1A}, x_ {1B} \), 工厂2的约束仅涉及 \( x_ {2A}, x_ {2B} \)。 解题过程 分解算法(如Dantzig-Wolfe分解)将问题分解为一个主问题(Master Problem)和多个子问题(Subproblems),通过迭代求解主问题和子问题来避免直接处理大规模模型。以下是逐步推导: 步骤1:问题分解 主问题 :处理共享约束(式1),代表资源协调层。 子问题 :每个工厂独立求解其局部问题(式2-5),生成可行生产方案。 子问题1(工厂1):约束为式2和式3,变量为 \( x_ {1A}, x_ {1B} \)。 子问题2(工厂2):约束为式4和式5,变量为 \( x_ {2A}, x_ {2B} \)。 步骤2:子问题的可行顶点枚举 每个子问题的可行域是多面体,其极点(顶点)代表基础生产方案。 子问题1的顶点 (通过枚举约束交点): 顶点P1: \( (x_ {1A}, x_ {1B}) = (0,0) \),利润贡献:0 顶点P2: \( (4,0) \)(由 \( 2x_ {1A} + x_ {1B} = 8 \) 和 \( x_ {1B}=0 \) 解得),利润:\( 5 4 + 4 0 = 20 \) 顶点P3: \( (3,2) \)(由 \( 2x_ {1A} + x_ {1B} = 8 \) 和 \( x_ {1A} + 2x_ {1B} = 7 \) 解得),利润:\( 5 3 + 4 2 = 23 \) 顶点P4: \( (0,3.5) \)(由 \( x_ {1A}=0 \) 和 \( x_ {1A} + 2x_ {1B} = 7 \) 解得),利润:14 顶点P5: \( (2,3) \)(由 \( x_ {1A} + 2x_ {1B} = 7 \) 和 \( x_ {1A}=2 \) 插值?实际需验证可行性:代入式2: \( 2 2+3=7 \leq 8 \);式3: \( 2+2 3=8>7 \) 不可行?修正:正确顶点应为约束交点。重新计算: 式2和式3的交点:解方程 \( 2x_ {1A} + x_ {1B} = 8 \) 和 \( x_ {1A} + 2x_ {1B} = 7 \),得 \( x_ {1A}=3, x_ {1B}=2 \)(顶点P3)。 其他顶点:与坐标轴交点:\( (0,0) \)、\( (4,0) \)、\( (0,3.5) \)。 因此子问题1有4个顶点:P1(0,0), P2(4,0), P3(3,2), P4(0,3.5)。 子问题2的顶点 : 顶点Q1: \( (0,0) \),利润:0 顶点Q2: \( (3,0) \)(由 \( 2x_ {2A} + x_ {2B} = 6 \) 和 \( x_ {2B}=0 \) 解得),利润:18 顶点Q3: \( (0,3) \)(由 \( x_ {2A} + 3x_ {2B} = 9 \) 和 \( x_ {2A}=0 \) 解得),利润:9 顶点Q4: \( (2,2) \)(由 \( 2x_ {2A} + x_ {2B} = 6 \) 和 \( x_ {2A} + 3x_ {2B} = 9 \) 解得?验证:式4: \( 2+3 2=8 \leq 9 \);式5: \( 2 2+2=6 \leq 6 \),利润:\( 6 2 + 3 2 = 18 \)) 顶点Q5: \( (1,4) \)(由 \( x_ {2A} + 3x_ {2B} = 9 \) 和 \( x_ {2A}=1 \) 得 \( x_ {2B}=8/3 \approx 2.67 \),但代入式5: \( 2* 1 + 2.67=4.67>6 \) 不可行)。修正:正确顶点为约束交点: 式4和式5的交点:解 \( x_ {2A} + 3x_ {2B} = 9 \) 和 \( 2x_ {2A} + x_ {2B} = 6 \),得 \( x_ {2A}=1.8, x_ {2B}=2.4 \)(顶点Q4)。 其他顶点:\( (0,0) \)、\( (3,0) \)、\( (0,3) \)。 因此子问题2有4个顶点:Q1(0,0), Q2(3,0), Q3(0,3), Q4(1.8,2.4)。 步骤3:主问题构建 主问题的变量是子问题顶点的权重(凸组合系数): \( \lambda_ k \):代表工厂1采用顶点Pk的方案权重(k=1,...,4)。 \( \mu_ m \):代表工厂2采用顶点Qm的方案权重(m=1,...,4)。 主问题形式: \[ \max Z = \sum_ {k=1}^4 (5p_ {kA} + 4p_ {kB}) \lambda_ k + \sum_ {m=1}^4 (6q_ {mA} + 3q_ {mB}) \mu_ m \] 约束: 共享资源约束 : \[ \sum_ {k=1}^4 (p_ {kA} + 2p_ {kB}) \lambda_ k + \sum_ {m=1}^4 (3q_ {mA} + q_ {mB}) \mu_ m \leq 10 \] (其中 \( p_ {kA} \) 是顶点Pk的x_ {1A}值,例如P3的 \( p_ {3A}=3, p_ {3B}=2 \)) 凸组合约束 (保证权重和为1): \[ \sum_ {k=1}^4 \lambda_ k = 1, \quad \sum_ {m=1}^4 \mu_ m = 1 \] 非负性 : \( \lambda_ k, \mu_ m \geq 0 \)。 步骤4:迭代求解(列生成) 由于顶点数量多,直接枚举低效,采用列生成法逐步添加顶点。 初始主问题 :仅包含部分顶点(如每个子问题的原点顶点P1和Q1)。 初始主问题: \[ \max Z = 0\lambda_ 1 + 0\mu_ 1 \] 约束: 共享资源: \( (0+2 0)\lambda_ 1 + (3 0+0)\mu_ 1 \leq 10 \) → 0 ≤ 10 凸组合: \( \lambda_ 1 = 1, \mu_ 1 = 1 \) 解: \( \lambda_ 1=1, \mu_ 1=1, Z=0 \)。 子问题求解(生成新列) : 主问题共享约束的对偶变量记为 \( \pi \)(本例中只有一个共享约束)。 子问题1的 减少成本 (Reduced Cost)为: \[ \text{RC1} = (5 - \pi \cdot 1)x_ {1A} + (4 - \pi \cdot 2)x_ {1B} \] 其中 \( \pi \) 是主问题共享约束的对偶值。初始主问题中,共享约束宽松(0 ≤ 10),故 \( \pi = 0 \)。 子问题1的目标:最大化 \( 5x_ {1A} + 4x_ {1B} \),解为顶点P3(3,2),利润=23。 同理,子问题2在 \( \pi=0 \) 下最大化 \( 6x_ {2A} + 3x_ {2B} \),解为顶点Q2(3,0),利润=18。 添加新列 : 将顶点P3和Q2加入主问题,主问题变为: \[ \max Z = 23\lambda_ 3 + 18\mu_ 2 \] 约束: 共享资源: \( (3 + 2 2)\lambda_ 3 + (3 3 + 0)\mu_ 2 \leq 10 \) → \( 7\lambda_ 3 + 9\mu_ 2 \leq 10 \) 凸组合: \( \lambda_ 1 + \lambda_ 3 = 1 \), \( \mu_ 1 + \mu_ 2 = 1 \) 非负性。 求解:尝试组合:若 \( \lambda_ 3=1, \mu_ 2=1 \),则共享资源:7+9=16>10不可行。需线性规划求解: 最优解: \( \lambda_ 3=1, \mu_ 2=0.333 \)(满足 \( 7 1 + 9 0.333 = 10 \)),Z=23 + 18* 0.333=29。 下一次迭代 : 更新对偶变量 \( \pi \)(主问题共享约束的边际价值)。通过主问题求解得到 \( \pi \approx 2 \)(具体值需计算对偶)。 子问题1的新目标:最大化 \( (5-2 1)x_ {1A} + (4-2 2)x_ {1B} = 3x_ {1A} + 0x_ {1B} \),最优解为P2(4,0),减少成本=12>0,可加入。 子问题2的新目标:最大化 \( (6-2 3)x_ {2A} + (3-2 1)x_ {2B} = 0x_ {2A} + 1x_ {2B} \),最优解为Q3(0,3),减少成本=3>0,可加入。 添加新列后主问题重新求解,直至所有减少成本非正(最优条件)。 步骤5:终止与还原 当子问题的减少成本均非正时,主问题达到最优。最终主问题的解通过顶点权重组合还原原变量: 例如最优权重 \( \lambda_ 3=1, \mu_ 4=1 \)(假设),则 \( x_ {1A}=3, x_ {1B}=2, x_ {2A}=1.8, x_ {2B}=2.4 \)。 通过分解,将6个约束的原问题转化为多次小规模问题求解,提升计算效率。