列生成算法在钢铁生产计划问题中的应用示例
题目描述
某钢铁厂生产多种型号的钢板(如厚度、宽度不同的板材),需根据客户订单制定生产计划。已知:
- 订单需求:每种型号钢板的需求量(如型号A需10吨,型号B需15吨)。
- 原材料钢卷:宽度固定为2000mm,可切割成不同宽度的小卷(如型号A需宽度1000mm,型号B需宽度800mm)。
- 切割模式:一种切割模式指将原材料钢卷按特定方式切割成若干小卷(例如,模式1:切割出2卷1000mm宽的小卷;模式2:切割出1卷1000mm和1卷800mm宽的小卷)。
- 目标:最小化使用的原材料钢卷总数,同时满足所有订单需求。
该问题可建模为线性规划问题,但切割模式组合极多(组合爆炸),直接枚举所有模式求解不可行。需使用列生成算法动态生成有价值的切割模式。
解题过程
步骤1:建立主问题模型
设:
- \(D_i\):型号 \(i\) 的需求量(\(i = 1, \dots, m\))。
- \(a_{ij}\):切割模式 \(j\) 中型号 \(i\) 的产量(即该模式切割出的小卷数)。
- \(x_j\):使用切割模式 \(j\) 的次数(决策变量)。
主问题(Master Problem, MP)为:
\[\text{minimize} \quad \sum_{j} x_j \]
\[\text{subject to} \quad \sum_{j} a_{ij} x_j \geq D_i \quad \forall i, \quad x_j \geq 0. \]
由于模式 \(j\) 的数量庞大,初始仅包含少数模式(如简单模式:每种型号单独切割),构成限制主问题(Restricted Master Problem, RMP)。
步骤2:构造子问题(定价问题)
列生成的核心是通过子问题生成能改进目标的新模式。设 \(\pi_i\) 为RMP中需求约束的对偶变量(即型号 \(i\) 的边际成本)。子问题需找到一个新模式 \(a^*\),使得其检验数(reduced cost)最小:
\[\text{minimize} \quad 1 - \sum_{i} \pi_i a_i \]
其中 \(a_i\) 为新模式中型号 \(i\) 的产量,且需满足切割的物理约束:
- 原材料宽度 \(W = 2000mm\),型号 \(i\) 的宽度为 \(w_i\)。
- 切割需满足:\(\sum_{i} a_i w_i \leq W\),且 \(a_i\) 为非负整数。
子问题实质是一个背包问题:选择整数 \(a_i\),使总宽度不超过 \(W\),且最小化 \(1 - \sum_i \pi_i a_i\)。
步骤3:迭代求解流程
- 初始化RMP:包含少量简单模式(如每个模式仅切割一种型号)。
- 求解RMP:得到最优解 \(x_j^*\) 和对偶变量 \(\pi_i^*\)。
- 求解子问题:
- 若子问题目标值 \(\geq 0\)(即所有检验数非负),当前RMP已是最优,算法终止。
- 若子问题目标值 \(< 0\),则将新模式加入RMP。
- 重复步骤2-3直至收敛。
步骤4:具体数值示例
假设有两种型号:
- 型号1:宽度 \(w_1 = 1000mm\),需求 \(D_1 = 10\)。
- 型号2:宽度 \(w_2 = 800mm\),需求 \(D_2 = 15\)。
迭代1:
- 初始模式:模式1(仅切1卷1000mm)、模式2(仅切1卷800mm)。
- RMP:
\[\text{min} \quad x_1 + x_2 \quad \text{s.t.} \quad 1x_1 + 0x_2 \geq 10, \quad 0x_1 + 1x_2 \geq 15. \]
解:\(x_1 = 10, x_2 = 15\),目标值25。对偶变量 \(\pi_1 = 1, \pi_2 = 1\)。
- 子问题:最小化 \(1 - (1 \cdot a_1 + 1 \cdot a_2)\),约束为 \(1000a_1 + 800a_2 \leq 2000\)。
枚举可行解:- \(a_1 = 2, a_2 = 0\):检验数 \(= 1 - 2 = -1\)。
- \(a_1 = 1, a_2 = 1\):检验数 \(= 1 - 2 = -1\)。
- \(a_1 = 0, a_2 = 2\):检验数 \(= 1 - 2 = -1\)。
任选新模式(如 \(a_1 = 2, a_2 = 0\))加入RMP。
迭代2:
- RMP新增模式3(产量 \(a_1 = 2, a_2 = 0\)):
\[\text{min} \quad x_1 + x_2 + x_3 \quad \text{s.t.} \quad 1x_1 + 0x_2 + 2x_3 \geq 10, \quad 0x_1 + 1x_2 + 0x_3 \geq 15. \]
解:\(x_1 = 0, x_2 = 15, x_3 = 5\),目标值20。对偶变量 \(\pi_1 = 0.5, \pi_2 = 1\)。
- 子问题:最小化 \(1 - (0.5a_1 + 1a_2)\)。
枚举:- \(a_1 = 0, a_2 = 2\):检验数 \(= 1 - 2 = -1\)。
- \(a_1 = 1, a_2 = 1\):检验数 \(= 1 - 1.5 = -0.5\)。
加入模式4( \(a_1 = 0, a_2 = 2\))。
迭代3:
- RMP加入模式4后求解,目标值降至18.75(详细计算略)。
- 继续子问题,直至无负检验数模式,得到最优解。
关键点
- 列生成通过分解主问题与子问题,避免枚举所有列。
- 子问题的背包结构可用动态规划高效求解。
- 最终解可能含小数,需结合整数规划方法(如分支定界)得到整数解。