現在有一個廠家打算用集裝箱托運甲乙兩種貨物,每箱的體積、重量、可 獲利潤以及托運所受限制如下表所示:
其中,貨物甲每箱 5 立方米,重 200 斤,托運一箱可獲利 2 千元,也就是 20 個百元;
貨物乙每箱 4 立方米,重 500 斤,托運一箱可獲利 1 千元,也就是 10 個百元;
由於集裝箱的大小及承載量有限,只能托運不大於 24 立方米且重量不超過 13 個百斤的貨物。
問兩種貨物各托運多少箱,可使獲得利潤為最大?
顯然這是一個最優化問題,目的是獲取最大利潤。決策變量是托運甲、乙 兩種貨物的箱數,為此,我們設甲乙兩種貨物分別托運x1
箱和x2
箱,於是目標就 是求𝑥1
和𝑥2
,使得20x1
+ 10x2
最大。
注意到托運限制體積是 24 立方米,因此5x1
+ 4x2
≤ 24;
托運限制重量是 13,所以2x1
+ 5x2
≤ 13
此外,我們還需要注意到托運的箱數必須非負;不僅如此,由於本題托運貨 物按箱計算,所以x1
和x2
還必須為整數。
因此本題的數學模型是:目標函數20𝑥1
+ 10𝑥2
取最大值,並且它受到 4 個約 束條件的限制
這個模型和的線性規划非常像,唯一的區別是增加了對自變量是 整數的限制,這類規划問題屬於整數規划。
決策變量(全部或部分)限制為整數的規划稱為整數規划。整數規划的英文 翻譯是 integer program, 簡稱 IP。
若在線性模型中,變量限制為整數,則稱為整數線性規划,即 ILP。目前所 流行的求解整數規划的方法往往只適用於整數線性規划。
整數規划又分以下四類:
- 純整數規划:所有決策變量均要求為整數
- 混合整數規划:部分決策變量要求為整數
- 純 0-1 規划:所有決策變量均要求為 0 或者 1
- 混合 0-1 規划:部分決策變量要求為 0 或者 1
整數規划與線性規划不同這處在於增加了整數約束。如果不考慮整數約束, 那么對應的線性規划稱為整數規划的線性松弛模型。
Matlab 在求解整數規划時,調用函數 intlinprog ()
, 其具體格式為:
[x,favl]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
該函數的使用和 linprog 函數的使用十分相似,區別在於,intlinprog ()函數在 linprog 函數的基礎上多了一個參數——intcon。
intcon 的意義為整數約束變量的位置,這個位置是按照目標函數和約束條件 中變量位置來排列的。
以引例來說,它的數學模型是:
M文檔如下:
c=[-20,-10];
intcon=[1,2];
A=[5,4;2,5];
b=[24;13];
vlb=zeros(2,1);
[x,fval]=intlinprog(c,intcon,A,b,[],[],vlb,[])
在程序的第二行中,語句 intcon=[1,2]表明𝑥1
和𝑥2
都為整數。
得到結果如下:
x =
3.9205
0.2291
26.0000
fval =
2.0584
也就是托運 4 箱 A 貨物和 1 箱 B 貨物,可以獲得最大利潤,最大利潤為 90 個百 元單位,即 9000 元。
接下來我們通過一個例子來看看混合整數規划問題的求法。
超市里有 3 種食品,玉米,牛奶和面包,單價,所含的維他命 A 和卡路里 的信息如下。
問題是買多少份的玉米,牛奶,面包,使得總價格最低,而維他命 A 的總攝取 量不小於 500 但不大於 50000,卡路里的總攝取量不小於 2000 但不大於 2250, 面包的份數必須是整數。
模型如下:
編程如下:
c=[0.18,0.23,0.05];
intcon=3; % intcon=3 代表𝑥3是整數。
A=[107,500,0;72,1212,65;
-107,-500,0;-72,-121,-65];
b=[5000;2250;-500;-2000];
vlb=zeros(3,1);
[x,fval]=intlinprog(c,intcon,A,b,[],[],vlb,[])
結果如下:
x =
3.9205
0.2291
26.0000
fval =
2.0584