一類要求變數取整數值的數學規劃。若要求全部變數取整數值,則稱為純整數規劃,簡稱為整數規劃。若隻要求部分變數取整數值,則稱為混合整數規劃。特別地,當在線性規劃中要求變數取整數時,就是線性整數規劃。若要求變數為0,1變數,即其值隻取0或1時,則稱為0-1規劃。由於實際問題中有許多量具有不可分割的性質,如人數、機器數、元件數等;還有一些邏輯現象如開與關,取與舍,有與無等可利用0、1變數作數量化描述,因此,在線路設計、工廠選址、人員安排、代碼選取以及其他領域中,常常常出現整數規劃問題。1958年,R.E.戈莫裡提出解線性整數規劃的割平面法後,整數規劃逐步形成一個獨立的分支。
形式最簡單的整數規劃問題是背包問題,也就是求 max
![](/img3/11915.gif)
,滿足
![](/img3/11916.gif)
(
x
j取0或1)的解的問題。假如將
V解釋為背包的容積,
v
j為物體
j的體積,
w
j為物體
j的重量,而變量
x
j取1時表示物體
j裝入背包,
x
j取0時表示物體
j不裝入背包,那麼背包問題就是要尋求一種既不超過背包容積,又能使總重量最大的裝法。背包問題的一種特殊解法是動態規劃的方法,這種方法所需的計算時間與所給問題中的參數
n,
V有關,大致與
n
V成正比例增長。
設所給的整數規劃問題(p)為求極小值問題。在整數規劃的一般性解法中,有三個基本概念。①分解,以F(p)表示問題(p)的約束集。所謂問題(p)分解為子問題(p1),(p2),…,(pq)之和,是指滿足條件(S1)和(S2),(S1):問題(p)的任何一個可行解,恰好是(p1),(p2),…,(pq)中某一個問題的可行解;(S2):任何子問題(pi)的可行解也是(p)的可行解,即
![](/img3/11917.gif)
,1≤
i≠
j≤
q。最通常的分解方式是“二分法”,例如,若
x
j是(
p)的0,1變量,把條件“
x
j=0”和“
x
j=1”分別添進問題(
p)的約束條件中,則問題(
p)分解為兩個子問題之和。②松弛,凡是放棄問題(
p)的某些約束條件後所得到的問題(
P̃),都稱為問題(
p)的松弛問題。任何松弛問題(
P̃)都具有以下三個明顯的性質:(R1)若(
P̃)沒有可行解,則(
p)也沒有可行解;(R2)對同樣的目標函數而言,(
p)的最小值不小於(
p)的最小值;(R3)若(
P̃)的一個最優解是(
p)的可行解,則它也是(
p)的一個最優解。最通常的松弛方式是放棄變量的整數性要求。③探測假設按某種規則,已將問題(
p)分解為子問題(
p
1),(
p
2),…,(
p
q)之和,並且各(
p
j)已有對應的松弛問題(
P̃
j)。若(
P̃
j)沒有可行解,則探明瞭(
p
j)沒有可行解,因此,可從(
p)的分解表上把它刪去。此種情形記為(F1)。假若當時已掌握瞭(
p)的一個可行解
x
*,與之相應的目標函數值為
z
*,如果松弛問題(
P̃
j)的最小值不比
z
*小,那麼就探明瞭(
p
j)中沒有比
x
*更好的可行解,因此已無須再考慮子問題(
p
j),就可從分解表上把它刪去。此種情形記為(F2)。若(
P̃
j)的最優解是(
p
j)的可行解,則已求得瞭(
p
j)的一個最優解。因此也無須再考慮它瞭,可以從分解表上把(
p
j)刪去,這時若(
p
j)的最優解比
x
*好,則替換掉
x
*,同時刷新
z
*的值。此種情形記為(F3)。假如各個(
P̃
j)的目標函數最小值都不比
z
*小,則
x
*便是原問題(
p)的最優解。此種情形記為(F4)。情形(F1)通常稱為可行性探測。情形(F2)至(F4)通常稱為最優性探測。
概括地說,求解一個整數規劃問題(p),有以下幾個步驟。首先,選定一種松弛方式,將(p)松弛為問題(P̃),使得比較容易求解。若(P̃)沒有可行解,則(p)也沒有可行解。若(P̃)的最優解是(p)的可行解,則已求得(p)的最優解。若(P̃)的最優解不是(p)的可行解,則有兩條不同的途徑,一是設法改進松弛問題(P̃),繼續探測問題(P̃);一是選定一種分解方式,把(p)分解成兩個或幾個子問題之和,將其列表記錄,並且賦予各子問題盡可能好的目標函數值的下界。然後,按一定的次序,逐個進行探測。當某個子問題已經被探明時,就從表中刪去,否則,繼續對子問題進行分解。
對線性整數規劃問題,不用分解的算法有割平面法,它以線性規劃問題作為松弛問題,利用生成割平面來不斷改進松弛問題,使最終求得的松弛問題的最優解也是整數解;還有一種是群論方法,它用有限阿貝爾群上的一個背包問題作為松弛問題,是放棄一部分變量的非負性要求後得到的。利用分解的算法有隱數法和分枝定界法兩類。它們通常都是以線性規劃問題作為松弛問題,不同之處僅在於探測子問題的先後次序。隱數法是按照子問題表中“先入後出”的原則來確定探測次序,即後出現的子問題先探測。分枝定界法是按照所賦予的下界大小來確定探測的先後順序,即下界小的子問題優先探測。前者計算程序比較簡單,在計算過程中所需要保存的信息較少,而後者在選取子問題時有靈活性,因為往往下界數值小的子問題中存在最優解的可能性較大。
對線性混合整數規劃問題,J.F.本德爾斯提出瞭一種分解算法。它的求解過程可以分為兩部分,一部分是解一個線性整數規劃問題,另一部分是解一個線性規劃問題。
割平面法 例如,考慮整數規劃問題:求
![](/img3/11918.gif)
(1)
滿足條件
![](/img3/11919.gif)
(2)
![](/img3/11920.gif)
(3)
![](/img3/11921.gif)
(4)
![](/img3/11922.gif)
(5)
x1、x2取整數值。 (6)
取它的松弛問題為線性規劃(1)~(5),約束集為圖1
中的多邊形
A
B
C
D。整數規劃的可行解是此多邊形內的整點(即座標為整數的點)。松弛問題的基本最優解為
即圖1中的點
C。目標函數的最優值
設
![](/img3/11926.gif)
(7)
![](/img3/11927.gif)
(8)
從(7)和(8)中解出
x
1、
x
2,得
![](/img3/11928.gif)
(9)
![](/img3/11929.gif)
(10)
因
x
1、
x
2、
y、
z都必須取整數值,故由(9)和(10)可得同餘方程
![](/img3/11930.gif)
(11)
![](/img3/11931.gif)
(12)
利用方程(11)或(12)中
y和
z的系數,可以導出整數規劃的一個新的約束條件,例如,用
![](/img3/11932.gif)
乘條件(2)的兩邊,用
![](/img3/11933.gif)
乘(4)的兩邊,然後將(2)和(4)的兩邊分別相加,可得
![](/img3/11934.gif)
。由於
x
1必須取整數值,就可推得一個新的約束條件:
x
1≤1。這就是整數規劃的一個割平面。類似地,由
![](/img3/11935.gif)
可推得另一個割平面:3
x
1-
x
2≤4。增加割平面
x
1≤1後,新的松弛問題的約束集如圖
2
所示。它的基本最優解為:
x
1=1,
![](/img3/11938.gif)
,是圖2中的點
Q。
![](/img3/11939.gif)
再由條件
x
1≤1和
![](/img3/11940.gif)
可導出一個新的割平面:
x
1+
x
2≥3。增加此割平面後,松弛問題的約束集如圖3所示。它的基本最優解為:
x
1=1即圖3中的點
R。由於它已是整數解,故必為整數規劃(1)~(6)的最優解。目標函數的最大值
x
0=1。
分枝定界法 例如,整數規劃問題(p):求
![](/img3/11941.gif)
(13)
滿足條件
![](/img3/11942.gif)
(14)
![](/img3/11943.gif)
(15)
![](/img3/11944.gif)
(16)
x1、x2、x3取整數值。 (17)
取松弛問題(P̃)為線性規劃(13)~(16)。(P̃)的最優解為x1=0.4,x2=3.8,x3=0;x0=14.2。按條件x2≤3和x2≥4將(p)分解為子問題(p1)與(p2)之和。解(p1)的松弛問題(P̃1),得x1:x11=0.5,x21=3,x
![](/img3/11945.gif)
=0.5;
x
0
1=14.5。再按條件
x
1=0和
x
1≥1將(
p
1)分解為(
p
3)與(
p
4)之和。這時子問題表為{(
p
3,(
p
4),(
p
2)}。這些子問題的
x
0的下界,暫時都可以取為15。按表中“先入後出”原則,解(
p
3)的松弛問題(
P̃
3),得
x
3:
x
1
3=0,
x
2
3=3,
x
3
3=2;
x
0
3=17。由於
x
3是整數解,故必為(
p
3)的最優解。因此,(
p
3)已被探明,就可從表中刪去,記
x
*=
x
3,
z
*=17,這是被找到的第一個整數解。解(
P̃
4),得
![](/img3/11946.gif)
;
![](/img3/11947.gif)
。由於
x
z
*=17,故已探明(
p
4)中沒有(
p)的最優解。解(
P̃
2),得
![](/img3/11949.gif)
。按條件
x
1=0和
x
2≥1 將(
p
2)分解為(
p
5)與(
p
6)之和。(
p
5)、
p
6的
x
0的下界可取為15。解(
P̃
5),得
![](/img3/11951.gif)
。由於
x
3是整數解,故已探明(
p
5)。由於
x
![](/img3/11952.gif)
<
z
*=17,故可刷新記錄解,取
x
*=
x
3,
![](/img3/11954.gif)
。由於
x
![](/img3/11952.gif)
也達到(
p
6)的下界,故已探明(
p
6)中沒有比
x
3更好的解,至此(
p)已探明,最優解為
x
*=
x
3。以上過程可表示為圖4
。
參考書目
R.S.Garfinkel and G.L.Nemhauser,Integer Programming,John Wiley &Sons,New York,1972.