運籌優化(十)--整數規劃求解

Eason.wxd發表於2019-01-17

分支界定法

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元素。首先每行減去該行最小數,再每列減去該列最小數。

-4

(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,BC的縮減矩陣。符合匈牙利法的條件。由定理1可知:所得的最小解就是原問題的最大解。

(2)係數矩陣不是方陣,目標仍為Min型問題:係數矩陣化為方陣。

其特點是:個人分派做 項工作,係數矩陣(Cij) m×矩陣, n 

 m < n ,則增添虛構的 s = n – m 行,補成方陣,但是對應的Cij=0 

 m > n ,則增添虛構的 s = m – n 列,補成方陣,但是對應的Cij=0 

相關文章