整數規划之割平面法 How and why?
說明
本文並不是一篇教程,只是把學習過程中的不解的地方做記錄,解釋為什么使用割平面法時添加的約束方程是那個樣子的。
割平面法
割平面法的大致思路是通過先求解非整數規划也就是普通線性規划的最優解,對於非整數解通過添加約束條件來使得可行域變小,再重新解加了約束條件的普通線性規划,直到解為整數解。割平面法相對與分支定界法稍微難理解一點,后者非常簡單明了,在對非整數解分成大於和小於兩個分支搜索結果,而割平面法不容易理解的地方在於添加的約束。
上圖中虛線是割平面法添加的約束,將線性規划問題的可行域減小。
下面將以一個例子作為展開,來說明割平面法是如何添加約束的。
假定一個整數規划問題如下:
手動單純形法解一下非整數的線性規划問題,得到下面的單純形表:
5 | 8 | 0 | 0 | |||
---|---|---|---|---|---|---|
Cb | 基 | b | x1 | x2 | s1 | s2 |
5 | x1 | 9/4 | 1 | 0 | 9/4 | -1/4 |
8 | x2 | 15/4 | 0 | 1 | -5/4 | 1/4 |
檢驗數 | 0 | 0 | -5/4 | -3/4 |
這個時候可以看到解x1和x2都不是整數,於是對x2添加一個約束條件:
How and why
為什么是添加這個約束條件呢?
首先由表中x2那一行我可以得到這個約束等式:
改寫一下形式(將整數部分和小數部分分開):
將整數部分移項:
等號左邊分為兩個部分,可以得到:
那為啥這里可以把等號變成大於等於號呢?可以證明,如果IL和IR是任意兩個整數,f為正分數,F為一些正分數的和,使得\(IL + F = IR + f\),那么一定有:
簡單證明:如果F> 1,則F>f;如果0<F<1,則F = f。這樣就可以得到小數部分的關系如上了。
在添加約束條件之前的可行域:
藍線和紅線為兩個約束條件,藍色部分為可行域。
添加約束條件之后的可行域:
藍色虛線為添加的約束條件。可見約束條件剛好能包含原可行域內所有整數可行解,並且可行域的大小減小了。
實際上,只要能夠讓可行域的大小減小並且能包含所有整數可行解,無論怎么添加約束條件都是可以的,上述的約束條件添加的方法只是很多方法中的一種,是Gomory第一個發現的,所以很常用。從幾何意義上講,約束條件的添加是對可行域的一次切割,所以稱為割平面法。
那為啥要用對偶單純形法解而不是單純形法呢?
因為添加了約束,約束肯定是大於等於,再引入新的松弛變量的時候,一定是減去松弛變量等於右邊,這個時候松弛變量前面的系數為-1,沒辦法作為基變量,而如果將不等式兩邊都取負號,就變成了小於等於,加的松弛變量前面的系數就是1,但是b卻成了負值,而對應的對偶問題是有解的,所以用對偶單純形法解。
還有最后一個問題,為啥每次加的約束都要對b的小數部分最大的那一行加約束,而不是對其他行,或者說所有非整數解都加約束呢?
按照書上的說法是,經驗表明,往往加小數部分最大的那一行的約束收斂會更快,那如果把所有非整數解對應的行都加上約束,可行域不是更小了嗎,這是不是意味着迭代次數將會減少呢?然而單純形法的時間復雜度是指數級別的,這樣加可能會算的時間更長吧(猜測),需要證明或者驗證一下結論。