第二章 整數規劃

第二章 整數規劃

###1 概要
####1.1 整數規劃的分類
####1.2 求解方法分類
###2 分枝定界法
###3 0 −1型整數規劃
###4 蒙特卡洛法(隨機取樣法)
###5 指派問題的計算機求解
###6 生產與銷售計劃問題

###1.概要
####1.1 整數規劃的分類
1) 變量全限制爲整數時,稱純(完全)整數規劃。
2) 變量部分限制爲整數的,稱混合整數規劃。

####1.2 求解方法分類:
(i)分枝定界法—可求純或混合整數線性規劃。
(ii)割平面法—可求純或混合整數線性規劃。
(iii)隱枚舉法—求解「0-1」整數規劃:
①過濾隱枚舉法;
②分枝隱枚舉法。
(iv)匈牙利法—解決指派問題(「0-1」規劃特殊情形)。
(v)蒙特卡洛法—求解各種類型規劃。

###2 分枝定界法
設有最大化的整數規劃問題 A ,與它相應的線性規劃爲問題 B ,從解問題 B 開始, 若其最優解不符合 A 的整數條件,那麼 B 的最優目標函數必是 A 的最優目標函數 * z 的 上界,記作 z ;而 A 的任意可行解的目標函數值將是 * z 的一個下界 z 。分枝定界法就 是將 B 的可行域分成子區域的方法。逐步減小 z 和增大 z ,最終求到 * z 。

###3 0 −1型整數規劃
0 −1型整數規劃是整數規劃中的特殊情形,它的變量 j x 僅取值 0 或 1。這時 j x 稱 爲0 −1變量,或稱二進制變量。 j x 僅取值 0 或 1 這個條件可由下述約束條件:
0 ≤ xj ≤ 1,整數所代替,是和一般整數規劃的約束條件形式一致的。
在這裏插入圖片描述
求解思路及改進措施:
(i) 先試探性求一個可行解,易看出( , , ) (1,0,0) x1 x2 x3 = 滿足約束條件,故爲一個可行解,且 z = 3。
(ii) 因爲是求極大值問題,故求最優解時,凡是目標值 z < 3的解不必檢驗是否 滿足約束條件即可刪除,因它肯定不是最優解,於是應增加一個約束條件(目標值下界):
(iii) 改進過濾條件。
(iv)由於對每個組合首先計算目標值以驗證過濾條件,故應優先計算目標值 z 大 的組合,這樣可提前擡高過濾門檻,以減少計算量。

###4 蒙特卡洛法(隨機取樣法)
在這裏插入圖片描述
解 (i)首先編寫 M 文件 No02_07_01.m 定義目標函數 f 和約束向量函數 g,程序如下:
function [f,g]=No02_07_01(x);
f=x(1)2+x(2)2+3x(3)2+4*x(4)2+2x(5)-8x(1)-2x(2)-3x(3)-…
x(4)-2
x(5);
g=[sum(x)-400
x(1)+2x(2)+2x(3)+x(4)+6x(5)-800
2
x(1)+x(2)+6x(3)-200
x(3)+x(4)+5
x(5)-200];
(ii)編寫M文件No2_07.m如下求問題的解:
rand(‘state’,sum(clock));
p0=0;
tic
for i=1:10^6
x=99*rand(5,1);
x1=floor(x);x2=ceil(x);
[f,g]=No02_07_01(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=No02_07_01(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0
toc
運行結果:x0 =
48
90
2
99
15

p0 =
48951
所以,x1=48,x2=90,x3=2,x4=99,x5=15 ,z=48951

###5 指派問題的計算機求解
整數規劃問題的求解可以使用 Lingo 等專用軟件。對於一般的整數規劃問題,無法直接利用 Matlab 的函數,必須利用 Matlab 編程實現分枝定界解法和割平面解法。但對於指派問題等0 −1整數規劃問題,可以直接利用 Matlab 的函數 bintprog 進行求解。(我在使用bintprog函數過程中出現函數未定義現象)
在這裏插入圖片描述
解:LINGO 程序
model:
sets:
var/1…5/;
link(var,var):c,x;
endsets
data:
c=3 8 2 10 3
8 7 2 9 7
6 4 2 7 5
8 4 2 3 5
9 10 6 9 10;
enddata
[email protected](link:c*x);
@for(var(i):@sum(var(j):x(i,j))=1);
@for(var(j):@sum(var(i):x(i,j))=1);
@for(link:@bin(x));
End
求得最優指派方案爲 x15 = x23 = x32 = x44 = x51 = 1,最優值爲 21。
下圖爲運行結果部分截圖:
在這裏插入圖片描述
###6 生產與銷售計劃問題
6.1問題實例
例 9 某公司用兩種原油( A 和 B )混合加工成兩種汽油(甲和乙)。甲、乙兩種
汽油含原油的最低比例分別爲 50%和 60%,每噸售價分別爲 4800 元和 5600 元。該公
司現有原油 A 和 B 的庫存量分別爲 500 噸和 1000 噸,還可以從市場上買到不超過 1500
噸的原油 A 。原油 A 的市場價爲:購買量不超過 500 噸時的單價爲 10000 元/噸;購買
量超過 500 噸單不超過 1000 噸時,超過 500 噸的部分 8000 元/噸;購買量超過 1000 噸
時,超過 1000 噸的部分 6000 元/噸。該公司應如何安排原油的採購和加工。
6.2 建立模型
(1)問題分析
安排原油採購、加工的目標是利潤最大,題目中給出的是兩種汽油的售價和原油 A
的採購價,利潤爲銷售汽油的收入與購買原油 A 的支出之差。這裏的難點在於原油 A 的
採購價與購買量的關係比較複雜,是分段函數關係,能否及如何用線性規劃、整數規劃
模型加以處理是關鍵所在。
(2)模型建立
設原油 A 的購買量爲 x(單位:噸)。根據題目所給數據,採購的支出c(x) 可表示
爲如下的分段線性函數(以下價格以千元/噸爲單位):
在這裏插入圖片描述 (5)
設原油 A 用於生產甲、乙兩種汽油的數量分別爲 x11和 x 12,原油 B 用於生產甲、乙兩種汽油的數量分別爲 x21 和 x22 ,則總的收入爲 4.8( x11 + x 21) +5.6(x12 + x22 ) (千元)。於是本例的目標函數(利潤)爲
max z=4.8( x11 + x 21) +5.6(x12 + x22 ) — c(x) (6)
約束條件包括加工兩種汽油用的原油 A 、原油 B 庫存量的限制,原油 A 購買量的限制,以及兩種汽油含原油 A 的比例限制,它們表示爲
x 11+ x12 ≤ 500 + x (7)
x 21+ x22 ≤ 1000 (8)
x ≤ 1500 (9)
x11 / (x11 + x21) >= 0.5 (10)
x12 / (x12 + x22) >=0.6 (11)
x11 , x12, x21 , x22 , x>=0 (12)
由於(5)式中的c(x) 不是線性函數,(5)~(12)給出的是一個非線性規劃,而且,對於這樣用分段函數定義的c(x) ,一般的非線性規劃軟件也難以輸入和求解。

6.3 求解模型
下面介紹 3 種解法
(1)解法一
一個自然的想法是將原油 A 的採購量 x 分解爲三個量,即用 x1 , x2 , x3 分別表示以價 格 10 千元 / 噸 、 8 千 元 / 噸 、 6 千 元 / 噸採購的原油 A 的噸數,總支出爲 c(x) = 10 x1 +8 x2 + 6 x3 ,且
x = x1 + x2 + x3 (13)
這時目標函數(6)變爲線性函數:
max z=4.8( x11 + x21) + 5.6(x12 + x22 ) -(10 x1 + 8 x2 + 6 x3 ) (14)
應該注意到,只有當以 10 千元/噸的價格購買 x1 =500(噸)時,才能以 8 千元/噸的價格購買 x2( >0) ,這個條件可以表示爲
( 500- x1 ) x2 = 0 (15)
同理,只有當以 8 千元/噸的價格購買 x2 = 500(噸)時,才能以 6 千元/噸的價格購買
x3 (>0) ,於是
(x2 − 500)x3 = 0 (16)
此外, x1 , x2 , x3 的取值範圍是
0 ≤ x1 , x2 , x3 ≤ 500 (17)
由於有非線性約束(15)、(16),因而(7)~(17)構成非線性規劃模型。
model:
sets:
var1/1…4/:y; !這裏y(1)=x11,y(2)=x21,y(3)=x12,y(4)=x22;
var2/1…3/:x,c;
endsets
max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))[email protected](var2:cx);
y(1)+y(3)<@sum(var2:x)+500;
y(2)+y(4)<1000;
0.5
(y(1)-y(2))>0;
0.4y(3)-0.6y(4)>0;
(x(1)-500)*x(2)=0;
(x(2)-500)*x(3)=0;
@for(var2:@bnd(0,x,500));
data:
c=10 8 6;
enddata
end

最優解:購買 1000 噸原油 A ,與庫存的 500 噸原油 A 和1000 噸原油 B 一起,共生產 2500 噸汽油乙,利潤爲 5000(千元)。