0-1型整数规划—MATLAB数学建模
0-1型整數(shù)規(guī)劃
1.介紹:0-1型整數(shù)規(guī)劃是整數(shù)規(guī)劃中的特殊情況,通過引入0-1變量xjx_jxj?來描述約束條件,一般用于指派選擇問題這一類的具有相互排斥的約束條件的規(guī)劃問題,其中xjx_jxj?取1表示起作用或者被選擇,取0反之。
比如有兩種運輸方式可供選擇,但只能選其一。車運輸約束條件為5x1+4x2≤245x_1+4x_2\leq 245x1?+4x2?≤24,船運輸?shù)募s束條件為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為充分大的數(shù)\begin{cases} 5x_1+4x_2\leq 24 +yM,\\ 7x_1+3x_2\leq 45 + (1-y)M,\\ y=0或1. \end{cases}\\ 式中M為充分大的數(shù) ??????5x1?+4x2?≤24+yM,7x1?+3x2?≤45+(1?y)M,y=0或1.?式中M為充分大的數(shù)
而如果有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,
這樣就實現(xiàn)了多取一的情況,有點像學(xué)數(shù)電里的選擇器。
某工廠為了生產(chǎn)某種產(chǎn)品,有幾種不同的生產(chǎn)方式可供選擇,如選定的生產(chǎn)方式投資高(選購自動化程度高的設(shè)備),由于產(chǎn)量大,因而分配到每件產(chǎn)品的變動成本就降低;反之,如選定的生產(chǎn)方式投資低,將來分配到每件產(chǎn)品的變動成本可能增加。所以必須全面考慮。設(shè)有三種方式可供選擇,令
? j=1,2,3分別表示三種方式;xj表示采用第j種方式時的產(chǎn)量;cj表示采用第j種方式時每件產(chǎn)品的變動成本;kj表示采用第j種方式時的固定成本j=1,2,3分別表示三種方式;\\x_j表示采用第j種方式時的產(chǎn)量;\\c_j表示采用第j種方式時每件產(chǎn)品的變動成本;\\k_j表示采用第j種方式時的固定成本j=1,2,3分別表示三種方式;xj?表示采用第j種方式時的產(chǎn)量;cj?表示采用第j種方式時每件產(chǎn)品的變動成本;kj?表示采用第j種方式時的固定成本
所以采用各種生產(chǎn)方式的總成本分別為:
Pj={kj+cjxj,當(dāng)xj>0,0,當(dāng)xj=0,j=1,2,3P_j=\begin{cases} k_j+c_jx_j,當(dāng)x_j>0,\\ 0,當(dāng)x_j=0,j=1,2,3 \end{cases} Pj?={kj?+cj?xj?,當(dāng)xj?>0,0,當(dāng)xj?=0,j=1,2,3?
再引入0-1變量yjy_jyj?:
yj={1,當(dāng)采用第j種生產(chǎn)方式,即xj>0時0,當(dāng)不采用第j種生產(chǎn)方式,即xj=0時y_j=\begin{cases} 1,當(dāng)采用第j種生產(chǎn)方式,即x_j>0時\\ 0,當(dāng)不采用第j種生產(chǎn)方式,即x_j=0時 \end{cases} yj?={1,當(dāng)采用第j種生產(chǎn)方式,即xj?>0時0,當(dāng)不采用第j種生產(chǎn)方式,即xj?=0時?
于是目標(biāo)函數(shù)可以表示為:
minz=(k1y1+c1x1)+(k2x2+c2x2)+(k3y3+c3x3)s.t.yjε≤xjM,j=1,2,3,式中:ε為充分小的常數(shù);M為充分大的常數(shù)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為充分小的常數(shù);M為充分大的常數(shù) minz=(k1?y1?+c1?x1?)+(k2?x2?+c2?x2?)+(k3?y3?+c3?x3?)s.t.yj?ε≤xj?M,j=1,2,3,式中:ε為充分小的常數(shù);M為充分大的常數(shù)
PS:其實可以理解取了充分大充分小的常數(shù)之后,這個約束條件便會失去約束作用,自然不被選擇。比如小于充分大后,其最大值就等于沒有設(shè)限
擬分配n人去做n項工作,每人做且僅做一項工作,若分配第i人去做第j項工作,需花費cijc_{ij}cij?單位時間,問應(yīng)如何分配工作才能使工人花費的總時間最少?給出指派問題的系數(shù)矩陣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?
非標(biāo)準(zhǔn)型的指派模型
1.如果是最大化指派問題,則需要先把指派矩陣中的最大值m-cijc_{ij}cij??形成新的指派系數(shù)?。
2.如果人數(shù)和工作數(shù)不等,則哪個少就增加哪個的虛擬對象,并設(shè)代價為0
3.如果一個人可做多分工作,則多創(chuàng)造幾個相同的人
4.某工作不能某人做,則將代價設(shè)置為足夠大
匈牙利算法第一步:從指派矩陣c中的每一行減去當(dāng)前行的最小元素,再從每一列減去當(dāng)前列的最小元素
第二步:進行試指派,尋求最優(yōu)解。從只有一個0的行(列)開始,標(biāo)記當(dāng)前0,劃去當(dāng)前0所在的列(行)的所有0,反復(fù)進行直到盡可能多的0被標(biāo)記。若仍有未被標(biāo)記或者劃掉的0,且同行(列)至少有兩個0,則從0最少的行(列)開始,比較這與行所有0元素的列中0元素的數(shù)量,標(biāo)記該行0元素最少的列對應(yīng)的0,劃掉同行同列的0,直到所有0都被標(biāo)記或者劃掉,若標(biāo)記0的數(shù)目等于階數(shù),則找到了最優(yōu)解,否則進行第三步,但是第三步老折騰了,所以如果需要進行第三步,建議放棄改用MATLAB求解。
整數(shù)線性規(guī)劃的MATLAB求解Matlab求解混合整數(shù)線性規(guī)劃的命令為:
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)標(biāo)準(zhǔn)數(shù)學(xué)模型如下:
minfTx,s.t.{x(intcon)為整數(shù)Ax≤b,Aeq≤beq,lb≤x≤ub.其中intcon的意義為整數(shù)約束變量的位置,基本上有n個決策變量則取[1,2,?,n]minf^Tx,\\ s.t.\begin{cases}x(intcon)為整數(shù)\\ Ax\leq b,\\ Aeq\leq beq,\\ lb\leq x\leq ub. \end{cases}\\ 其中intcon的意義為整數(shù)約束變量的位置,基本上有n個決策變量則取[1,2,\cdots,n] minfTx,s.t.??????????x(intcon)為整數(shù)Ax≤b,Aeq≤beq,lb≤x≤ub.?其中intcon的意義為整數(shù)約束變量的位置,基本上有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)變?yōu)橐痪S決策變量yk(k=1,?,25)y_k(k=1,\cdots,25)yk?(k=1,?,25)
然后依據(jù)[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)抽取參數(shù):
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行\(zhòng)cdots&0\\ \cdot&&\cdot\\ 10列&&\cdot\\ \cdot&&\cdot\\ 0&\cdots&0 \end{bmatrix}\\ beq=[1,\cdots10列\(zhòng)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
轉(zhuǎn)化為代碼如下:
結(jié)果如下圖:
總結(jié)
以上是生活随笔為你收集整理的0-1型整数规划—MATLAB数学建模的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言的菜鸟教程
- 下一篇: Linux 目录管理类命令