基于线性规划的拉格朗日松弛算法求解示例
题目描述
考虑一个整数规划问题:
\[\begin{aligned} \min \quad & 4x_1 + 5x_2 \\ \text{s.t.} \quad & 3x_1 + 2x_2 \geq 10 \quad (\text{约束1}) \\ & x_1 + 4x_2 \geq 12 \quad (\text{约束2}) \\ & x_1, x_2 \in \mathbb{Z}^+ \end{aligned} \]
由于整数约束导致问题难以直接求解,我们使用拉格朗日松弛方法将问题转化为更容易求解的形式。具体地,将约束1和约束2松弛到目标函数中,并引入拉格朗日乘子 \(\lambda_1, \lambda_2 \geq 0\),得到松弛问题。
解题过程
步骤1:构造拉格朗日松弛问题
将约束1和约束2乘以拉格朗日乘子后加入目标函数:
\[L(\lambda_1, \lambda_2) = \min_{x_1, x_2 \in \mathbb{Z}^+} \left[ 4x_1 + 5x_2 + \lambda_1 (10 - 3x_1 - 2x_2) + \lambda_2 (12 - x_1 - 4x_2) \right] \]
整理目标函数:
\[L(\lambda_1, \lambda_2) = \min_{x_1, x_2 \in \mathbb{Z}^+} \left[ (4 - 3\lambda_1 - \lambda_2)x_1 + (5 - 2\lambda_1 - 4\lambda_2)x_2 + 10\lambda_1 + 12\lambda_2 \right] \]
步骤2:求解松弛问题
对于固定的 \(\lambda_1, \lambda_2\),松弛问题变为两个独立的整数变量优化:
- 若 \(4 - 3\lambda_1 - \lambda_2 < 0\),则 \(x_1\) 应取尽可能大的值,但问题无上界约束,需根据实际场景添加边界(例如假设 \(x_1, x_2 \leq M\))。这里假设变量有上界 \(M=10\)(实际中需根据问题设定)。
- 但更常见的做法是:由于原问题有不等式约束 \(\geq\),松弛后的问题中,若变量系数为负,则变量取最大值;若系数为正,则取最小值(0)。
系数分析:
令 \(c_1 = 4 - 3\lambda_1 - \lambda_2\), \(c_2 = 5 - 2\lambda_1 - 4\lambda_2\)。
- 若 \(c_1 \geq 0\),则最优解中 \(x_1 = 0\);否则 \(x_1 = M\)。
- 若 \(c_2 \geq 0\),则 \(x_2 = 0\);否则 \(x_2 = M\)。
步骤3:设定乘子更新规则
拉格朗日对偶问题为:
\[\max_{\lambda_1, \lambda_2 \geq 0} L(\lambda_1, \lambda_2) \]
使用次梯度法更新乘子:
- 初始化 \(\lambda_1^0 = 0, \lambda_2^0 = 0\),设定步长 \(t_k = 1 / \sqrt{k+1}\)。
- 在第 \(k\) 次迭代中:
- 求解 \(L(\lambda_1^k, \lambda_2^k)\) 得到 \(x^k\)。
- 计算次梯度:
\[ g_1^k = 10 - 3x_1^k - 2x_2^k, \quad g_2^k = 12 - x_1^k - 4x_2^k \]
- 更新乘子:
\[ \lambda_1^{k+1} = \max(0, \lambda_1^k + t_k g_1^k), \quad \lambda_2^{k+1} = \max(0, \lambda_2^k + t_k g_2^k) \]
步骤4:迭代计算
-
迭代1:\(\lambda_1^0=0, \lambda_2^0=0\)
\(c_1 = 4 > 0, c_2 = 5 > 0\) → \(x_1=0, x_2=0\)
目标值 \(L=0 + 10\cdot 0 + 12\cdot 0 = 0\)
次梯度 \(g_1 = 10 - 0 - 0 = 10, g_2 = 12 - 0 - 0 = 12\)
更新:\(\lambda_1^1 = 0 + \frac{1}{1} \cdot 10 = 10, \lambda_2^1 = 0 + \frac{1}{1} \cdot 12 = 12\) -
迭代2:\(\lambda_1=10, \lambda_2=12\)
\(c_1 = 4 - 3\cdot 10 - 12 = -38 < 0\) → \(x_1 = M=10\)
\(c_2 = 5 - 2\cdot 10 - 4\cdot 12 = -63 < 0\) → \(x_2 = M=10\)
\(L = -38\cdot 10 + (-63)\cdot 10 + 10\cdot 10 + 12\cdot 12 = -380 - 630 + 100 + 144 = -766\)
次梯度 \(g_1 = 10 - 3\cdot 10 - 2\cdot 10 = -40, g_2 = 12 - 10 - 4\cdot 10 = -38\)
更新:\(\lambda_1^2 = \max(0, 10 + \frac{1}{\sqrt{2}} \cdot (-40)) \approx 10 - 28.28 < 0 \) → 取 0
\(\lambda_2^2 = \max(0, 12 + \frac{1}{\sqrt{2}} \cdot (-38)) \approx 12 - 26.87 < 0 \) → 取 0 -
迭代3:乘子回到0,重复迭代1。为避免循环,需调整步长或使用更智能的更新规则(如自适应步长)。
步骤5:获取近似解
在迭代过程中记录最优可行解(满足原约束的 \(x\))。例如,当乘子使松弛问题解接近可行时,对解进行修正(如向上取整)使其可行,并计算目标值。最终选择目标值最小的可行解作为近似解。
总结
拉格朗日松弛通过将困难约束放入目标函数,将原问题分解为易求解的子问题。次梯度法优化乘子,逐步逼近原问题的最优下界。此方法特别适用于整数规划或复杂约束问题,但需注意收敛性和可行解的构造。