整數線性規划


現在有一個廠家打算用集裝箱托運甲乙兩種貨物,每箱的體積、重量、可 獲利潤以及托運所受限制如下表所示:

其中,貨物甲每箱 5 立方米,重 200 斤,托運一箱可獲利 2 千元,也就是 20 個百元;

貨物乙每箱 4 立方米,重 500 斤,托運一箱可獲利 1 千元,也就是 10 個百元;

由於集裝箱的大小及承載量有限,只能托運不大於 24 立方米且重量不超過 13 個百斤的貨物。

問兩種貨物各托運多少箱,可使獲得利潤為最大?

顯然這是一個最優化問題,目的是獲取最大利潤。決策變量是托運甲、乙 兩種貨物的箱數,為此,我們設甲乙兩種貨物分別托運x1箱和x2箱,於是目標就 是求𝑥1𝑥2,使得20x1 + 10x2最大。

注意到托運限制體積是 24 立方米,因此5x1 + 4x2 ≤ 24;

托運限制重量是 13,所以2x1 + 5x2 ≤ 13

此外,我們還需要注意到托運的箱數必須非負;不僅如此,由於本題托運貨 物按箱計算,所以x1x2還必須為整數。

因此本題的數學模型是:目標函數20𝑥1 + 10𝑥2取最大值,並且它受到 4 個約 束條件的限制

\[max\quad z=20x_1+10x_2\\ s.t. \begin{cases} 5x_1+4x_2\le 24\\ 2x_1+5x_2\le 13\\ x_1,x_2\ge 0,x_1,x_2\in Z \end{cases} \]

這個模型和的線性規划非常像,唯一的區別是增加了對自變量是 整數的限制,這類規划問題屬於整數規划。

決策變量(全部或部分)限制為整數的規划稱為整數規划。整數規划的英文 翻譯是 integer program, 簡稱 IP。

若在線性模型中,變量限制為整數,則稱為整數線性規划,即 ILP。目前所 流行的求解整數規划的方法往往只適用於整數線性規划。

整數規划又分以下四類:

  1. 純整數規划:所有決策變量均要求為整數
  2. 混合整數規划:部分決策變量要求為整數
  3. 純 0-1 規划:所有決策變量均要求為 0 或者 1
  4. 混合 0-1 規划:部分決策變量要求為 0 或者 1

整數規划與線性規划不同這處在於增加了整數約束。如果不考慮整數約束, 那么對應的線性規划稱為整數規划的線性松弛模型。

Matlab 在求解整數規划時,調用函數 intlinprog (), 其具體格式為:

[x,favl]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)

該函數的使用和 linprog 函數的使用十分相似,區別在於,intlinprog ()函數在 linprog 函數的基礎上多了一個參數——intcon。

intcon 的意義為整數約束變量的位置,這個位置是按照目標函數和約束條件 中變量位置來排列的。

以引例來說,它的數學模型是:

\[max\quad z=20x_1+10x_2\\ s.t. \begin{cases} 5x_1+4x_2\le 24\\ 2x_1+5x_2\le 13\\ x_1,x_2\ge 0,x_1,x_2\in Z \end{cases} \]

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, 面包的份數必須是整數。

模型如下:

\[min \quad z=0.18x_1+0.23x_2+0.05x_3\\ s.t.\begin{cases} 500\le 107x_1+500x_2\le 50000\\ 2000\le 72 x_1+121x_2+65x_3\le 2250\\ x_1,x_2,x_3\ge 0,x_1\in Z \end{cases} \]

編程如下:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM