運籌優化(十)--整數規劃求解
分支界定法
1.分枝定界法的思想
分枝定界法通過增加附加約束條件,使整數最優解最終成為線性規劃的一個極點(頂點),於是整個問題就可使用單純形法找到這個整數最優解;對有約束條件的最優化問題(其可行解為有限數)的可行解空間恰當地進行系統搜尋,這就是分枝與定界的內容。通常,把全部可行解空間反覆地分割為越來越小的子集,稱為分枝;並且對每個子集內的解集計算一個目標下界,這稱為定界。在每次分枝後,凡是界限不優於已知可行解集目標值的那些子集不再進一步分枝,這樣,許多子集可不予考慮,這稱為剪枝。這就是分枝定界法的主要思路。
下面通過例子說明分枝定界法的步驟。
2.用分枝定界法求解整數規劃
例1: 某廠擬購進甲、乙兩類機床生產新產品。已知甲、乙機床進價分別為2萬元和3萬元;安裝佔地面積分別為4m2和2m2;投後的收益分別為3百元/日和2百元/日。廠方目前僅有資金14萬元,安裝面積18m2,為使收益最大,廠方應購進甲、乙機床各多少臺?
解:設應購進甲、乙機床臺數分別為x1和x2,對此問題可建立整數規劃數模如下:
(1)去掉約束(4),用圖解法求得對應的鬆弛問題LP0(鬆弛問題LP0與原模型的區別:僅不含整數約束,目標函式與其他約束均同。)的最優解(見圖1)。
圖1
由圖1知,鬆馳問題的最優解為h點:,Z(0)=14.75
由此可知ILP的最優解為:0≤z* ≤ Z(0)*=14.75, 且必為整數,從而可以斷言: 0≤z* ≤14。因 x1=3.25 ,x2=2.5非整數解,故選擇一個非整數變數分枝,這裡選x1,即對 3 ≤ x1 ≤ 4 進行分枝。
(2)對上問題分枝構成兩個子問題數模LP1和LP2如下:
子問題數模 LP1 子問題數模LP2
max Z=3x1+2x2 max z=3x1+2x2
(3)對這兩個子問題數模用圖解法求得最優解分別為 (見圖1):
記Z*為當前最好的整數解,則Z*=Z(2)=14
(4)由於Z(1)> =14,對子問題LP1需繼續分枝,選擇x2分枝得到子問題LP3和LP4如下:
子問題數模LP3 子問題數模LP4
max Z=3x1+2x2 max Z=3x1+2x2
(5)對LP3和LP4兩個子問題數模用圖解法求得最優解分別為(見2):
X(3)=(3, 2) T, Z(3)=13
X(4)=(2.5, 3) T, Z(4)=13.5
(6)此時由於所有子問題的目標值均小於或等於Z(2),故Z* =Z(2)=14。最優解為:
X* =X(2)=(4,1)T , Z * =14
由此可知,例1的最優解是:工廠應購進甲類機床4臺,乙類機床1臺,可獲最大收益為14(百元/日)。
3.分枝定界法的一般步驟
設有最大化的整數規劃問題A ,與它相對應的鬆弛問題為 B。
(1)先不考慮原問題的整數約束,求解相應的鬆弛問題。用圖解法或單純形法求得最優解,記為 。
(2)若求得的最優解 剛好就是整數解,則該整數解就是原整數規劃問題的最優解;否則,對原問題進行分枝尋求整數最優解。
(3)分枝。根據對變數重要性的瞭解,在最優解中選擇一個不符合整數約束條件的xj ,其值為bj ,以[bj]表示小於bj 的最大整數。構造兩個約束條件: x≤ [bj]和 x≥[bj]+1分別加入原LP問題形成兩個子問題,因為[bj] 與[bj]+1之間無整數,故這兩個子集內的整數解必定與原可行解集合整數解一致,這一步稱為分枝。
(4)定界。首先判斷各個子問題是否存在整數解。若存在,找出目標函式值最大對應的整數解,設為Z*,則A問題的整數解目標函式Z≥Z*,這就是定界。而且分枝過程中,一旦有某個子問題Z≥Z*,則令Z*=Z。
(5)若存在大於Z*的子問題則需分枝。第(4)步中若不存在整數解,也需繼續分枝尋找整數解,並從目標函式值最大對應的子問題先分枝。
(6)若所有子問題的目標值都小於等於Z*,則不需繼續分枝,Z*所對應的整數解即為最優解。
割平面法
1.割平面法思想
分枝定界法是對原問題可行解域進行了切割,切割的方法是對取非整數解相鄰整數作附加約束,這些附加約束從圖解的幾何概念上說,是一些相當於切割可行解域的超平面,它們的特點是與座標軸平行,雖然約束方程簡單,但子問題卻由於分枝的增多而呈指數增長。為了克服上述缺點,本節介紹的割平面法則採用另一種切割辦法,既要切割掉非整數解域,又不希望對原問題進行分枝。
割平面法的基礎仍然是用解線性規劃的方法去解整數規劃問題。首先不考慮變數為整數這一約束條件。但增加線性約束條件(用幾何術語,稱為割平面)使得從原可行解域中切割掉一部分,這部分只包含非整數解,但沒有切割掉任何整數可行解。因此,採用割平面法的關鍵是如何找到割平面約束方程,使切割後最終得到這樣的可行解域,它的一個有整數座標的極點恰好就是問題的最優解(見圖1示)。
2.割平面法的步驟
(1)去掉整數約束,用單純形法求解。若最優解是整數,停止計算,否則轉下一步;
(2)尋求附加約束(割平面方程);
① 從最優表中抄下非整數解的某個約束方程;
② 將該約束方程的所有係數和常數分解為整數和正真分數之和;
③ 整數項(包括整係數項和整常數項)歸寫於方程左邊,真分數項寫於右邊;
④ 利用整數約束條件求出割平面方程。
(3)將割平面方程標準規範化後加到約束方程組中求解,如所得最優解仍為非整數,則轉到第(2)步繼續進行,直到找到最優整數解為止。
現舉例來說明割平面法解題步驟。
例1:求下列整數規劃模型:
解:(1)去掉整數約束。如果約束條件係數和右邊常數不是整數,則需化約束為整,而後才能標準規範化(這是保證所新增的鬆馳變數均為整數)。如下:
用單純形法迭代得最終表1。
表1
XB |
x1 |
x2 |
x3 |
x4 |
b |
x2 |
0 |
1 |
1/2 |
-1/2 |
5/2 |
x1 |
1 |
0 |
-1/4 |
3/4 |
13/4 |
-Z |
0 |
0 |
-1/4 |
-5/4 |
-59/4 |
最優解:X1=13/4,X2=5/2,Z=59/4 為非整數解。
(2)尋找割平面方程。從最優表1中抄下非整數解的約束方程。例如第一個約束方程:
將①式的所有係數和常數分解為整數和正真分數之和,即:
將上式中的整係數項歸寫於方程左邊,真分數項寫於右邊,即有:
現對②式進行分析:考慮整數約束條件,②式左邊為整數,右邊的(·)內是正數;為保持方程平衡,所以②式右邊必是負數。因此有:
即有:,③式即為割平面方程。
對原數模引入割平面約束,將③式標準規範化(鬆馳變數x5也必為整數):加到表1中,用對偶單純形法求解,求解過程示於表2。
表2
XB |
x1 |
x2 |
x3 |
x4 |
x5 |
b |
x2 |
0 |
1 |
1/2 |
-1/2 |
0 |
5/2 |
x1 |
1 |
0 |
-1/4 |
3/4 |
0 |
13/4 |
x5 |
0 |
0 |
[-1/2] |
-1/2 |
1 |
-1/2 |
-Z |
0 |
0 |
-1/4 |
-5/4 |
0 |
-59/4 |
x2 |
0 |
1 |
0 |
-1 |
1 |
2 |
x1 |
1 |
0 |
0 |
1 |
-1/2 |
7/2 |
x3 |
0 |
0 |
1 |
1 |
-2 |
1 |
Z |
0 |
0 |
0 |
-1 |
-1/2 |
-58/4 |
得最優解為x1=7/2,x2=2,仍為非整數,故又轉入第二步求割平面方程。為此從表2中抄下非整數解x1=7/2的約束方程為:,按整數、分數歸併原則寫成:,考慮整數約束條件,上式左邊為整數;為保持方程平衡,因此上式右邊必為負數,有:
④式為割平面方程。將④式標準規範化:加到表2中,用對偶單純形法求解,求解過程如表3所示。得最優解:x1=4,x2=1,Z=56/4=14,為整數最優解,計算停止。
表3
XB |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
b |
x2 |
0 |
1 |
0 |
-1 |
1 |
0 |
2 |
x1 |
1 |
0 |
0 |
1 |
-1/2 |
0 |
7/2 |
x3 |
0 |
0 |
1 |
1 |
-2 |
0 |
1 |
x6 |
0 |
0 |
0 |
0 |
[-1/2] |
1 |
-1/2 |
-z |
0 |
0 |
0 |
-1 |
-1/2 |
0 |
-58/4 |
x2 |
0 |
1 |
0 |
-1 |
0 |
2 |
1 |
x1 |
1 |
0 |
0 |
1 |
0 |
-1 |
4 |
x3 |
0 |
0 |
1 |
1 |
0 |
-4 |
3 |
x5 |
0 |
0 |
0 |
0 |
1 |
-2 |
1 |
-Z |
0 |
0 |
0 |
-1 |
0 |
-1 |
-56/4 |
上述過程中找到的兩個用決策變數表示的割平面方程分別為:
2x1+2x2≤11
x1+x2≤5
它們的切割過程見圖1。由圖1可知:
①去掉整數約束,求得最優解為(3.25,2.5),非整數解。
②第一個割平面方程:2x1+2x2≤11,得最優解為(3.5,2),非整數解。
③第二個割平面方程:x1+x2≤5,得最優解為(4,1),整數解。
圖1割平面尋優
0-1規劃和隱列舉法
當決策變數xi的取值僅為0或1時的規劃問題稱為0-1型整數規劃問題。它是整數規劃中的特殊情形,應用很廣泛,因此成為整數規劃中的一個重要分支。
0–1整數規劃雖然可用一般求整數規劃的方法求解。但0–1型整數規劃是整數規劃的一種特例,有自身的特殊解法――隱列舉法。現舉例說明。
1. 0-1規劃數學模型
例1:某廠擬在A,B,C,D,E五個城市中建立若干產品經銷聯營點,各處設點都需資金、人力、裝置等,需求量以及能提供的利潤各處不同,有些點可能虧本,但卻能獲得貸款和人力等。假設資料已知,見表1,為使總收益最大,問廠方應作何種最優選點決策?
表1
資源 城市 |
應投資金 (百萬元) |
應投人力 (人) |
應投裝置 (套) |
利潤 (十萬元) |
A |
4 |
5 |
1 |
4.5 |
B |
6 |
4 |
1 |
3.8 |
C |
12 |
12 |
1 |
9.5 |
D |
-8 |
3 |
0 |
-2 |
E |
1 |
-8 |
0 |
-1.5 |
限制資源 |
20 |
15 |
2 |
|
解:上述各城市是否被選,可用決策變數xj表示(j=1,2,…5),xj=1表示被選,否則xj=0,根據已知資料可建數模如下:
每個城市都有可能入選和不入選,即xj取值有0或1兩種狀態;有五個變數,這樣的0,1組合就共有25=32個。把每種組合列出,代入約束方程檢驗是否可行,這是一項很繁瑣的工作,並且找出可行組合後還要代入目標函式去比較得出最優解,因此,用列舉法僅對一些小型問題是可行和有效的。當變數個數增多時,組合解個數是按指數規律倍增,用列舉法將會非常困難。
實際上只要我們按目標函式值從優到劣(本例是從大到小)順序列出組合,逐個檢驗其可行性,最先滿足所有約束方程的組合就是最優解;而劣於最優解的組合即使可行,也不用去列出和檢驗,這就相當於把列舉法得出的所有非優組合隱去不算了,故稱為隱列舉法。
2.隱列舉法求解步驟
(1)變換目標函式和約束方程組
① 價值係數Cj前的符號統一。 在目標要求極大時,統一帶負號;求極小時統一帶正號。方法是:在不滿足上述要求時,用代入目標函式。如例1求極大,x1,x2,x3前符號不滿足要求,用代入目標函式和約束方程;
② 按∣Cj∣值從小到大排列決策變數項。上例變換結果如下:
(2)用目標函式值探索法求最優解
組合又滿足全部約束條件,則它為最優解;否則,按劣於Z0的組合解方向探索可行解。為此,按公式(1)須由小到大逐項計算組合解的Σ|Cj|值及其相應的Z值,代入約束方程組檢查可行性,如全部滿足,即為最優解。
目標函式值探索法計算過程示於表2,得最優解為:x1=1-=1,x2=1-=0,x3=1-=1,x4=0,x5=1,即在A,C,E三個城市中設聯營點,可獲最大收益12.5(十萬元)。
表2
分配問題和匈牙利法
在生活中經常遇到這樣的問題,某單位需完成n項任務,恰好有n個人可承擔這些任務。由於每人的專長不同,各人完成任務 (或所費時間) 不同,效率也不同。於是產生應分派哪個人去完成哪項任務,使完成n項任務的總效率最高(或所需總時間最短)。這類問題稱為分派問題(Assignment Problem)。
1.分派問題數學模型
例1:有A、B、C、D四項任務需分派給甲、乙、丙、丁四個人去做,這四個人都能承擔上述四項任務,但完成各項任務所需時間如表1所示。問應如何分派任務可使完成任務的總工時最少?試建立基數學模型。
表1
任務 人 |
A |
B |
C |
D |
甲 |
9 |
17 |
16 |
7 |
乙 |
12 |
7 |
14 |
16 |
丙 |
8 |
17 |
14 |
17 |
丁 |
7 |
9 |
11 |
9 |
解:引入決策變數xij
指派問題的解矩陣應當是每行或每列只能有一個元素為1,其餘均為 0 的 n 階方陣。如例 1的一個解矩陣:
2.匈牙利法原理
分派問題是0-1規劃的特例,也是運輸問題的特例。雖然分派問題可用整數規劃、0-1規劃或運輸問題的解法去求解,但都很費事。匈牙利數學家柯尼格(D. Konig)提出了一種新穎而又簡便的解法,常稱為匈牙利法。
匈牙利法是針對目標要求極小問題提出來的。其基本原理是:為了實現目標極小,在係數矩陣元素Cij≥0的條件下,如果能使矩陣具有一組處於不同行又不同列的零元素(C’ij=0)打上括號(),對應該元素的決策變數xij=1,未打括號元素對應的決策變數xij=0,那麼目標函式值Z=為最小,這樣的組合解就是最優解。
定理1:從(cij )矩陣的每行(或列)減去或加上一個常數ui(或vj)構成新矩陣(c′ij),c′ij= cij±(uI+vj ),則對應(c′ij)的(xij)最優解與原(cij )的最優解等價。
證明:如從新矩陣中得到最優解(xij),則其目標函式值達到極值:其中:K為一常數,故當Z‘達到極值時Z也達到極值。所以(xij)也為原矩陣(cij )的最優解。
利用這個定理,可以使原係數矩陣(Cij)變換成含有很多0元素的新系數矩陣(c′ij),從而最優解保持不變。
獨立的0元素:在係數矩陣(c′ij)中,位於不同行不同列的0元素。
若能在係數矩陣(c′ij)中找出n個獨立的0元素,則令解矩陣(Xij)中對應這n個獨立0元素的取值為1,其他元素取值為0。將其代入目標函式中得到Z’=0,因C′ij≥0,故它一定是最小值。這就是以(c′ij)為係數矩陣的分派問題的最優解,也就是原問題的最優解。
3.匈牙利法求解步驟
例2:求解例1中的最優解。
(1)變換系數矩陣,使其每行每列都出現0元素。首先每行減去該行最小數,再每列減去該列最小數。
|
(2)進行試分派,尋求最優解
經過上一步變換後,係數矩陣每行每列都已有了0元素,此時需找出n個獨立的0元素,為此按下列步驟進行。
① 從只有一個0元素的行(兩個或兩個以上0元素的行暫時不考慮,跳過去)開始,給這個0元素打上括號(),記作(0),表示對這行所代表的人,只有一種任務可分派。同時劃去(0)所在列的其他0元素,記作φ。這表示這列所代表的任務已分派完,不必再考慮別人了。
② 給只有一個0元素的列(兩個或兩個以上0元素的列暫時不考慮,跳過去)的0元素打括號;然後劃去(0)所在行的其他0元素,記作φ。
③ 反覆進行①,②兩步,直到所有0元素都被打括號和劃掉為止。轉第⑤步。
④ 若仍有沒有打括號或劃掉的0元素,且同行(列)的0元素至少有兩個,則找有0元素的矩形閉迴路,任選一個0元素打括號,破閉迴路,直到所有0元素都已打括號或劃掉為止。
⑤ 若打括號0元素的數目m等於矩陣的階數n,那麼這分派問題的最優解已得到,否則轉第(3)步。
對例1中的係數矩陣變換後,按上面步驟進行試分派,如下:
,
找到了4個獨立的0元素,解矩陣如(xij)示。即甲→D,乙→B,丙→A,丁→C。總工時:Z=7×1+7×1+8×1+11×1=33。
例3下列係數矩陣出現0元素閉迴路,可通過第④步破閉迴路求解:
若所有的0元素都已打括號或劃掉,但獨立的0元素個數小於矩陣階數,還需下面的第三步繼續求解。
(3)用覆蓋理論繼續求解
定理2:覆蓋所有0元素的最少直線條數正好等於已打括號的0元素個數。
方法:作最少的直線覆蓋所有0元素。步驟如下:
① 對沒有打括號0元素的行打√號;
② 對已打√的行中所有0元素所對應的列打√號;
③ 再對打有√的列中打括號的0元素所對應的行打√號;
④ 重複②,③,直到得不出新的打√號的行、列為止。
⑤ 對沒有打√號的行畫一橫線,已打√號的列畫一縱線,這就得到了覆蓋所有0元素的最少直線數。
⑥ 在未被直線覆蓋的部分中找出最小數,然後未覆蓋區所有元素減去這個最小數;而覆蓋區的交叉元素加上剛才的最小數,其餘元素不變。這樣得到新的係數矩陣,它的最優解和原問題相同,轉第(2)步。
上面的覆蓋理論,主要是為了第⑥步,增加0元素的個數。
例4:下列係數矩陣得打括號的0元素個數小於矩陣階數,用覆蓋理論求最優解。
此時, 得最優解為:
4.非標準指派問題
匈牙利法只適用於符合以下三個條件的分派問題的求解:
① 目標函式為極小型;
② 係數矩陣為方陣;
③ 係數矩陣元素值非負。即:
對於不滿足上述三個條件的分派問題應轉化為標準指派問題。
(1)當分派問題目標要求極大時,即求,此時,可把求極大型轉變為求極小型,利用式:
即:,
再由定理1,矩陣(-Cij)nxn每行均可加上一個常數M(或令Cij中最大元素為M即可),令:,這時係數矩陣可變換為:這時,bij≥0,B叫C的縮減矩陣。符合匈牙利法的條件。由定理1可知:所得的最小解就是原問題的最大解。
(2)係數矩陣不是方陣,目標仍為Min型問題:係數矩陣化為方陣。
其特點是:m 個人分派做 n 項工作,係數矩陣(Cij)為 m×n 矩陣,m ≠ n 。
①若 m < n ,則增添虛構的 s = n – m 行,補成方陣,但是對應的Cij=0 。
②若 m > n ,則增添虛構的 s = m – n 列,補成方陣,但是對應的Cij=0 。
相關文章
- 運籌優化(九)--整數規劃模型優化模型
- 運籌學-整數規劃IP演算法演算法
- 運籌優化(七)--動態規劃解析優化動態規劃
- 運籌學練習Python精解——整數規劃Python
- Cplex混合整數規劃求解(Python API)PythonAPI
- 運籌優化(五)--線性規劃之內點法優化
- 運籌優化(六)--目標規劃定義及解法優化
- 運籌優化(十一)--無約束非線性規劃優化
- 運籌優化(十七)--儲存論基礎及其最優化求解優化
- 運籌優化(十八)--對策論基礎及其最優化求解優化
- 運籌優化(十九)--決策論基礎及其最優化求解優化
- 運籌優化(十六)--排隊論基礎及其最優化求解優化
- 運籌優化(二)--線性規劃概念及應用模型優化模型
- 運籌優化(十二)--帶約束非線性規劃(NLP)優化
- 運籌優化(十三)--大規模優化方法優化
- 運籌優化(一)--運籌學概述優化
- 運籌優化(四)--線性規劃之對偶問題和靈敏度分析優化
- 帶約束條件的運籌規劃問題求解(模擬退火演算法實現)演算法
- 物業行業數字化整體規劃行業
- 運籌優化(八)--圖與網路優化優化
- Excel中的規劃求解。Excel
- 基於數值優化的自動駕駛實時運動規劃優化自動駕駛
- matlab求解非線性規劃Matlab
- 強化學習(三)用動態規劃(DP)求解強化學習動態規劃
- app開發的規劃與籌劃APP
- 【優化求解】基於蟻群演算法柵格地圖路徑規劃matlab優化演算法地圖Matlab
- 斜率優化動態規劃優化動態規劃
- 動態規劃求解數字數字三角形動態規劃
- matlab求解線性規劃問題Matlab
- LeetCode 343. 整數拆分--動態規劃LeetCode動態規劃
- 運籌優化(十四)--離散優化的啟發式演算法優化演算法
- 全渠道定價、庫存決策,混合整數規劃建模求解,MNL選擇模型,內附程式碼!模型
- 運籌優化(十五)--應用模型之分配問題優化模型
- Python小白的數學建模課-04.整數規劃Python
- Python求解線性規劃——PuLP使用教程PythonPulp
- 關於 線性規劃 非線性規劃 與 凸優化優化
- swoole優化核心引數調整優化
- 動態規劃之最長公共子序列求解動態規劃