0-1型整数规划—MATLAB数学建模
0-1型整數規劃
1.介紹:0-1型整數規劃是整數規劃中的特殊情況,通過引入0-1變量xjx_jxj?來描述約束條件,一般用于指派選擇問題這一類的具有相互排斥的約束條件的規劃問題,其中xjx_jxj?取1表示起作用或者被選擇,取0反之。
比如有兩種運輸方式可供選擇,但只能選其一。車運輸約束條件為5x1+4x2≤245x_1+4x_2\leq 245x1?+4x2?≤24,船運輸的約束條件為7x1+3x2≤457x_1+3x_2\leq 457x1?+3x2?≤45。這兩種約束條件是互相排斥的,所以我們引入一個0-1變量:
y={1,采取船運,0,采取車運.y=\begin{cases} 1,采取船運,\\ 0,采取車運. \end{cases} y={1,采取船運,0,采取車運.?
那么就可以改寫約束條件為:
{5x1+4x2≤24+yM,7x1+3x2≤45+(1?y)M,y=0或1.式中M為充分大的數\begin{cases} 5x_1+4x_2\leq 24 +yM,\\ 7x_1+3x_2\leq 45 + (1-y)M,\\ y=0或1. \end{cases}\\ 式中M為充分大的數 ??????5x1?+4x2?≤24+yM,7x1?+3x2?≤45+(1?y)M,y=0或1.?式中M為充分大的數
而如果有m個互相排斥的約束條件:ai1x1+?+ainxn≤bi,i=1,2,?,m。a_{i1}x_1 + \cdots+a_{in}x_n\leq b_i,i=1,2,\cdots,m。ai1?x1?+?+ain?xn?≤bi?,i=1,2,?,m。
那么將引入m個0-1變量:
yi={1,第i個約束起作用,0,第i個約束不起作用.y_i=\begin{cases} 1,第i個約束起作用,\\ 0,第i個約束不起作用. \end{cases} yi?={1,第i個約束起作用,0,第i個約束不起作用.?
則可以得出:
ai1x1+?+ainxn≤bi+(1?yi)M,i=1,2,?,m,y1+?+ym=1,a_{i1}x_1+\cdots+a_{in}x_n\leq b_i+(1-y_i)M,i=1,2,\cdots,m,\\ y_1+\cdots+y_m=1, ai1?x1?+?+ain?xn?≤bi?+(1?yi?)M,i=1,2,?,m,y1?+?+ym?=1,
這樣就實現了多取一的情況,有點像學數電里的選擇器。
某工廠為了生產某種產品,有幾種不同的生產方式可供選擇,如選定的生產方式投資高(選購自動化程度高的設備),由于產量大,因而分配到每件產品的變動成本就降低;反之,如選定的生產方式投資低,將來分配到每件產品的變動成本可能增加。所以必須全面考慮。設有三種方式可供選擇,令
? j=1,2,3分別表示三種方式;xj表示采用第j種方式時的產量;cj表示采用第j種方式時每件產品的變動成本;kj表示采用第j種方式時的固定成本j=1,2,3分別表示三種方式;\\x_j表示采用第j種方式時的產量;\\c_j表示采用第j種方式時每件產品的變動成本;\\k_j表示采用第j種方式時的固定成本j=1,2,3分別表示三種方式;xj?表示采用第j種方式時的產量;cj?表示采用第j種方式時每件產品的變動成本;kj?表示采用第j種方式時的固定成本
所以采用各種生產方式的總成本分別為:
Pj={kj+cjxj,當xj>0,0,當xj=0,j=1,2,3P_j=\begin{cases} k_j+c_jx_j,當x_j>0,\\ 0,當x_j=0,j=1,2,3 \end{cases} Pj?={kj?+cj?xj?,當xj?>0,0,當xj?=0,j=1,2,3?
再引入0-1變量yjy_jyj?:
yj={1,當采用第j種生產方式,即xj>0時0,當不采用第j種生產方式,即xj=0時y_j=\begin{cases} 1,當采用第j種生產方式,即x_j>0時\\ 0,當不采用第j種生產方式,即x_j=0時 \end{cases} yj?={1,當采用第j種生產方式,即xj?>0時0,當不采用第j種生產方式,即xj?=0時?
于是目標函數可以表示為:
minz=(k1y1+c1x1)+(k2x2+c2x2)+(k3y3+c3x3)s.t.yjε≤xjM,j=1,2,3,式中:ε為充分小的常數;M為充分大的常數min\quad z=(k_1y_1+c_1x_1)+(k_2x_2+c_2x_2)+(k_3y_3+c_3x_3)\\ s.t.\quad y_j\varepsilon\leq x_jM,j=1,2,3,\\ 式中:\varepsilon為充分小的常數;M為充分大的常數 minz=(k1?y1?+c1?x1?)+(k2?x2?+c2?x2?)+(k3?y3?+c3?x3?)s.t.yj?ε≤xj?M,j=1,2,3,式中:ε為充分小的常數;M為充分大的常數
PS:其實可以理解取了充分大充分小的常數之后,這個約束條件便會失去約束作用,自然不被選擇。比如小于充分大后,其最大值就等于沒有設限
擬分配n人去做n項工作,每人做且僅做一項工作,若分配第i人去做第j項工作,需花費cijc_{ij}cij?單位時間,問應如何分配工作才能使工人花費的總時間最少?給出指派問題的系數矩陣C=(cijc_{ij}cij?)
引入0-1變量
xij={1,第i人做第j項工作0,第i人不做第j項工作x_{ij}=\begin{cases} 1,第i人做第j項工作\\ 0,第i人不做第j項工作\end{cases} xij?={1,第i人做第j項工作0,第i人不做第j項工作?
所以可得出模型為:
min∑i?1n∑j=1ncijxij,s.t.{∑j=1nxij=1,∑i=1nxij=1,xij=0或1min\quad \sum_{i-1}^n\sum_{j=1}^nc_{ij}x_{ij},\\ s.t.\begin{cases}\sum_{j=1}^nx_{ij}=1,\\ \sum_{i=1}^nx_{ij}=1,\\ x_{ij}=0或1\end{cases} mini?1∑n?j=1∑n?cij?xij?,s.t.??????∑j=1n?xij?=1,∑i=1n?xij?=1,xij?=0或1?
例1.投資問題:有600萬元投資5個項目,如下表:
| 一 | 210 | 160 | 1.項目一、二、三中選一項 |
| 二 | 300 | 210 | 2.項目三、四中選一項 |
| 三 | 150 | 60 | 3.項目五以項目一為先驗條件 |
| 四 | 130 | 80 | |
| 五 | 260 | 180 |
即可求得模型:
maxz=160x1+210x2+60x3+80x4+180x5s.t.{210x1+300x2+150x3+130x4+260x5≤600,x1+x2+x3=1,x3+x4=1,x5≤x1x1,x2,x3,x4,x5=0或1max\quad z=160x_1+210x_2+60x_3+80x_4+180x_5\\ s.t.\begin{cases} 210x_1+300x_2+150x_3+130x_4+260x_5\leq 600,\\ x_1+x_2+x_3=1,\\ x_3+x_4=1,\\ x_5\leq x_1\\ x_1,x_2,x_3,x_4,x_5=0或1 \end{cases} maxz=160x1?+210x2?+60x3?+80x4?+180x5?s.t.????????????????210x1?+300x2?+150x3?+130x4?+260x5?≤600,x1?+x2?+x3?=1,x3?+x4?=1,x5?≤x1?x1?,x2?,x3?,x4?,x5?=0或1?
非標準型的指派模型
1.如果是最大化指派問題,則需要先把指派矩陣中的最大值m-cijc_{ij}cij??形成新的指派系數?。
2.如果人數和工作數不等,則哪個少就增加哪個的虛擬對象,并設代價為0
3.如果一個人可做多分工作,則多創造幾個相同的人
4.某工作不能某人做,則將代價設置為足夠大
匈牙利算法第一步:從指派矩陣c中的每一行減去當前行的最小元素,再從每一列減去當前列的最小元素
第二步:進行試指派,尋求最優解。從只有一個0的行(列)開始,標記當前0,劃去當前0所在的列(行)的所有0,反復進行直到盡可能多的0被標記。若仍有未被標記或者劃掉的0,且同行(列)至少有兩個0,則從0最少的行(列)開始,比較這與行所有0元素的列中0元素的數量,標記該行0元素最少的列對應的0,劃掉同行同列的0,直到所有0都被標記或者劃掉,若標記0的數目等于階數,則找到了最優解,否則進行第三步,但是第三步老折騰了,所以如果需要進行第三步,建議放棄改用MATLAB求解。
整數線性規劃的MATLAB求解Matlab求解混合整數線性規劃的命令為:
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)標準數學模型如下:
minfTx,s.t.{x(intcon)為整數Ax≤b,Aeq≤beq,lb≤x≤ub.其中intcon的意義為整數約束變量的位置,基本上有n個決策變量則取[1,2,?,n]minf^Tx,\\ s.t.\begin{cases}x(intcon)為整數\\ Ax\leq b,\\ Aeq\leq beq,\\ lb\leq x\leq ub. \end{cases}\\ 其中intcon的意義為整數約束變量的位置,基本上有n個決策變量則取[1,2,\cdots,n] minfTx,s.t.??????????x(intcon)為整數Ax≤b,Aeq≤beq,lb≤x≤ub.?其中intcon的意義為整數約束變量的位置,基本上有n個決策變量則取[1,2,?,n]
例2.求解下列指派問題,已知指派矩陣為:
[3821038729764275842359106910]\begin{bmatrix} 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 \end{bmatrix} ???????38689?874410?22226?109739?375510????????
解:這里需要把二維決策變量xij(i,j=1,?,5)x_{ij}(i,j=1,\cdots,5)xij?(i,j=1,?,5)變為一維決策變量yk(k=1,?,25)y_k(k=1,\cdots,25)yk?(k=1,?,25)
然后依據[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)抽取參數:
c=[3821038729764275842359106910]intcon=[1,2,?,25]Aeq=[0?25行?0??10列???0?0]beq=[1,?10列?,1]Tlb為25行1列的0ub為25行1列的1c=\begin{bmatrix} 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 \end{bmatrix}\\ intcon=[1,2,\cdots,25]\\ Aeq=\begin{bmatrix} 0&\cdots25行\cdots&0\\ \cdot&&\cdot\\ 10列&&\cdot\\ \cdot&&\cdot\\ 0&\cdots&0 \end{bmatrix}\\ beq=[1,\cdots10列\cdots,1]^T\\ lb為25行1列的0\\ ub為25行1列的1c=???????38689?874410?22226?109739?375510????????intcon=[1,2,?,25]Aeq=???????0?10列?0??25行???0???0????????beq=[1,?10列?,1]Tlb為25行1列的0ub為25行1列的1
轉化為代碼如下:
結果如下圖:
總結
以上是生活随笔為你收集整理的0-1型整数规划—MATLAB数学建模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言的菜鸟教程
- 下一篇: 数学分析:据理说明为什么每一个含有第一类