文章目錄
- 前言
- 1. 問題定義 (Problem Definition)
- 2. 拉格朗日松弛 (Lagrangian Relaxation)
- 3. 拉格朗日對偶問題 (Lagrangian Dual)
- 4. 次梯度優化 (Subgradient Optimization)
- 5. Python 代碼實現
- 導入庫和問題定義
- 輔助函數:求解拉格朗日松弛子問題
- 次梯度優化主循環
- 結果展示與繪圖
- 總結
前言
在運籌學和組合優化的世界里,我們經常遇到一些“棘手”的問題,這些問題因為其內在的組合復雜性(例如整數變量、非線性約束等)而難以直接求解。拉格朗日松弛(Lagrangian Relaxation)是一種強大的技術,它通過將這些“復雜”約束暫時“松弛”掉,并將其以懲罰項的形式移入目標函數,從而將原問題轉化為一個相對容易求解的子問題(拉格朗日松弛子問題)。
這個子問題的最優解為原問題提供了一個界限(對于最大化問題是上界,最小化問題是下界)。然后,通過迭代調整與被松弛約束相關的拉格朗日乘子,我們可以逐步逼近這個界限的最優值,這個過程就是求解拉格朗日對偶問題。
本篇博客將通過一個具體的0-1整數規劃例子,結合 Python 代碼實現,帶您一步步了解拉格朗日松弛的基本原理、子問題的求解以及經典的次梯度優化方法來更新拉格朗日乘子。讓我們從代碼中學習,揭開拉格朗日松弛的神秘面紗!
完整代碼:下載鏈接
1. 問題定義 (Problem Definition)
我們將考慮以下形式的優化問題:
最大化 c T x c^T x cTx
約束于:
A x ≤ b Ax \leq b Ax≤b (復雜約束)
D x ≤ e Dx \leq e Dx≤e (簡單約束,例如 x i ∈ { 0 , 1 } x_i \in \{0,1\} xi?∈{0,1} 或 x x x 屬于某個單純形)
我們感興趣的是那些如果忽略 A x ≤ b Ax \leq b Ax≤b 約束(或將其整合到目標函數中)就很容易解決的問題。例如,如果 D x ≤ e Dx \leq e Dx≤e 表示 x i ∈ { 0 , 1 } x_i \in \{0,1\} xi?∈{0,1},那么問題就很容易解決。
這里,我們考慮以下 0-1 整數規劃問題(示例):
最大化 12 x 1 + 8 x 2 + 7 x 3 + 6 x 4 + 10 x 5 + 5 x 6 12x_1 + 8x_2 + 7x_3 + 6x_4 + 10x_5 + 5x_6 12x1?+8x2?+7x3?+6x4?+10x5?+5x6?
約束于:
5 x 1 + 2 x 2 + 3 x 3 + 4 x 4 + x 5 + 2 x 6 ≤ 7 5x_1 + 2x_2 + 3x_3 + 4x_4 + x_5 + 2x_6 \leq 7 5x1?+2x2?+3x3?+4x4?+x5?+2x6?≤7 (約束1)
x 1 + x 2 ≤ 1 x_1 + x_2 \leq 1 x1?+x2?≤1 (約束2)
x 3 + x 4 ≤ 1 x_3 + x_4 \leq 1 x3?+x4?≤1 (約束3)
x 5 + x 6 ≤ 1 x_5 + x_6 \leq 1 x5?+x6?≤1 (約束4)
x i ∈ { 0 , 1 } x_i \in \{0,1\} xi?∈{0,1} 對于 i = 1 , . . . , 6 i = 1, ..., 6 i=1,...,6
在這個問題中,我們可以將約束 (1) 視為“復雜”約束,而約束 (2)-(4) 以及二元變量約束可以被視為“簡單”約束。請注意,這個問題足夠小,可以用標準求解器輕松解決。然而,它可以用來說明拉格朗日松弛的過程。
2. 拉格朗日松弛 (Lagrangian Relaxation)
對于上述問題,我們將復雜約束 A x ≤ b Ax \leq b Ax≤b 松弛掉。這意味著我們將它們從約束集合中移除,并將它們(以懲罰的形式)添加到目標函數中。為此,我們為每個被松弛的約束引入一個拉格朗日乘子 λ i ≥ 0 \lambda_i \geq 0 λi?≥0。
由此產生的拉格朗日(松弛)子問題 L ( λ ) L(\lambda) L(λ) 定義如下:
L ( λ ) = max ? { c T x + λ T ( b ? A x ) } L(\lambda) = \max \{c^T x + \lambda^T (b - Ax)\} L(λ)=max{cTx+λT(b?Ax)}
約束于:
D x ≤ e Dx \leq e Dx≤e
x i ∈ { 0 , 1 } x_i \in \{0,1\} xi?∈{0,1}
對于任意給定的 λ ≥ 0 \lambda \geq 0 λ≥0, L ( λ ) L(\lambda) L(λ) 的最優值是原問題最優值的上界。
對于我們的示例問題,如果我們松弛約束 (1),拉格朗日乘子 λ 1 \lambda_1 λ1? (簡寫為 λ \lambda λ,因為只有一個) 必須是非負的。子問題 L ( λ ) L(\lambda) L(λ) 變為:
L ( λ ) = max ? { ( 12 x 1 + 8 x 2 + 7 x 3 + 6 x 4 + 10 x 5 + 5 x 6 ) + λ ( 7 ? ( 5 x 1 + 2 x 2 + 3 x 3 + 4 x 4 + x 5 + 2 x 6 ) ) } L(\lambda) = \max \{ (12x_1 + 8x_2 + 7x_3 + 6x_4 + 10x_5 + 5x_6) + \lambda(7 - (5x_1 + 2x_2 + 3x_3 + 4x_4 + x_5 + 2x_6)) \} L(λ)=max{(12x1?+8x2?+7x3?+6x4?+10x5?+5x6?)+λ(7?(5x1?+2x2?+3x3?+4x4?+x5?+2x6?))}
約束于:
x 1 + x 2 ≤ 1 x_1 + x_2 \leq 1 x1?+x2?≤1