列生成算法在整数规划中的应用示例
题目描述
考虑一个整数规划问题:某工厂需要生产两种产品A和B,生产过程中使用两种原材料(甲和乙)。已知每生产1单位A产品消耗甲材料2单位、乙材料1单位,利润为3元;每生产1单位B产品消耗甲材料1单位、乙材料3单位,利润为5元。现有甲材料100单位、乙材料120单位。工厂希望制定生产计划(A和B的产量为非负整数),在资源限制下最大化总利润。若直接枚举所有整数解组合计算量较大,尝试使用列生成算法(结合分支定价)高效求解。
解题过程
1. 问题建模
设产品A的产量为 \(x_1\)(整数),产品B的产量为 \(x_2\)(整数),建立整数规划模型:
\[\text{Maximize} \quad 3x_1 + 5x_2 \]
\[ \text{Subject to} \quad 2x_1 + x_2 \leq 100 \quad \text{(甲材料约束)} \]
\[ x_1 + 3x_2 \leq 120 \quad \text{(乙材料约束)} \]
\[ x_1, x_2 \geq 0, \quad \text{整数} \]
2. 列生成算法核心思想
- 主问题(Master Problem, MP):初始仅包含部分变量(列),通过不断生成新列(即新变量)改进解。
- 子问题(Pricing Problem):检查是否存在未加入主问题的列,其检验数(降低成本)可改善当前目标值。
- 整数性处理:将列生成嵌入分支定界框架(分支定价),在每个节点求解线性松弛并生成必要列。
3. 算法步骤详解
步骤1:构造限制主问题(RMP)
初始仅包含部分变量,例如仅包含单位矩阵对应的辅助变量(松弛变量)或简单可行列。这里为简化,假设初始RMP包含两个人工变量 \(s_1, s_2\)(松弛变量)和初始可行列(如 \(x_1, x_2\) 的某个组合):
\[\text{RMP: Maximize} \quad 3x_1 + 5x_2 \]
\[ 2x_1 + x_2 + s_1 = 100 \]
\[ x_1 + 3x_2 + s_2 = 120 \]
\[ x_1, x_2, s_1, s_2 \geq 0 \]
(注意:实际列生成中初始RMP可能仅包含少量列,此处为演示方便直接包含 \(x_1, x_2\))
步骤2:求解RMP的线性松弛
使用单纯形法求解RMP,得到最优解和对应的对偶变量值。假设初始解为 \(x_1=0, x_2=0, s_1=100, s_2=120\),但对偶变量未激活。更合理的初始列可通过启发式方法生成,例如单独优化某个产品:
- 若只生产B,最大产量为 \(\min(100/1, 120/3)=40\),利润200。
- 将列 \((x_1, x_2)=(0,1)\) 和 \((1,0)\) 加入RMP。
步骤3:子问题构造与求解
子问题目标为寻找降低成本(检验数)最大的列。设当前RMP的对偶变量为 \(\pi_1\)(对应甲约束)和 \(\pi_2\)(对应乙约束)。子问题为:
\[\text{Maximize} \quad (3 - 2\pi_1 - \pi_2) x_1 + (5 - \pi_1 - 3\pi_2) x_2 \]
\[ \text{Subject to} \quad x_1, x_2 \geq 0, \quad \text{整数} \]
(注意:子问题本身是整数规划,但小规模时可枚举或直接分析。)
- 若子问题目标最大值 > 0,则对应列可加入RMP;否则当前RMP已是最优线性松弛。
步骤4:迭代生成新列
举例迭代过程:
- 初始RMP包含列 \((0,1)\) 和 \((1,0)\),求解RMP得 \(x_1=36, x_2=28\)(通过单纯形法计算),对偶变量 \(\pi_1=1, \pi_2=1\)。
- 子问题目标:\((3-2-1)x_1 + (5-1-3)x_2 = 0\cdot x_1 + 1\cdot x_2\)。最大值为正(当 \(x_2>0\)),但列 \((0,1)\) 已在RMP中。需检查其他列如 \((x_1,x_2)=(1,1)\):降低成本为 \(3+5-2-1-1-3=1>0\),可加入RMP。
- 更新RMP,重新求解,重复直至子问题目标最大值 ≤ 0。
步骤5:处理整数约束
当线性松弛最优解非整数时,进入分支定界:
- 分支:选择分数变量(如 \(x_1=15.5\))生成两个子节点(\(x_1 \leq 15\) 和 \(x_1 \geq 16\))。
- 在每个节点应用列生成求解线性松弛,直到所有节点被剪枝或找到整数最优解。
4. 最终结果
通过分支定价最终得到整数最优解:
枚举验证可得最优解为 \(x_1=30, x_2=30\),利润 \(3\times30 + 5\times30 = 240\),满足约束:
甲材料:\(2\times30 + 30 = 90 \leq 100\)
乙材料:\(30 + 3\times30 = 120 \leq 120\)
关键点总结
- 列生成通过分解问题避免枚举所有变量,尤其适用于变量数远多于约束数的问题。
- 分支定价结合了列生成和分支定界,是求解大规模整数规划的有效方法。
- 本例中子问题规模小可直接计算,实际应用中子问题可能为复杂整数规划需专用算法。