MATLAB求解線性規(guī)劃(含整數(shù)規(guī)劃和0-1規(guī)劃)問題

原文章:MATLAB求解線性規(guī)劃(含整數(shù)規(guī)劃和0-1規(guī)劃)問題
博主:一尺丈量

最有用的方法:
matlab官方文檔,搜索linprog函數(shù)和intlinprog函數(shù)赵抢。
https://www.mathworks.com/products/matlab.html

@[TOC]

線性規(guī)劃簡(jiǎn)介

線性規(guī)劃是數(shù)學(xué)規(guī)劃中的一類最簡(jiǎn)單規(guī)劃問題牲芋,常見的線性規(guī)劃是一個(gè)有約束的,變量范圍為有理數(shù)的線性規(guī)劃。如:

對(duì)于這類線性規(guī)劃問題庶柿,數(shù)學(xué)理論已經(jīng)較為完善看铆,可以有多種方法求解此類問題。但寫這篇文章的目的并不是為了介紹數(shù)學(xué)理論剩彬,我們這里主要講解如果利用工具求解這一類線性規(guī)劃問題酷麦。

最著名,同時(shí)也是最強(qiáng)大的數(shù)學(xué)最優(yōu)化軟件是LINGO/LINDO軟件包喉恋,它能夠求解多種的數(shù)學(xué)規(guī)劃問題沃饶,同時(shí)還提供了多種的分析能力母廷。但LINGO軟件并不容易上手,同時(shí)糊肤,應(yīng)用LINGO的場(chǎng)合一般是大規(guī)模的線性規(guī)劃問題琴昆,小小的線性規(guī)劃完全可以不使用它。一個(gè)更受科研人員歡迎的數(shù)學(xué)軟件是MATLAB轩褐,它以功能強(qiáng)大而稱著椎咧,并有數(shù)學(xué)軟件中的“航空母艦”之稱。我們這里就是要學(xué)習(xí)使用MATLAB軟件求解線性規(guī)劃(含整數(shù)規(guī)劃和0-1規(guī)劃)問題把介。

為了使得不熟悉MATLAB的人員也能夠使用MATLAB進(jìn)行線性規(guī)劃問題求解勤讽,本文將對(duì)MATALB中使用到的函數(shù)和過程以及結(jié)果進(jìn)行詳細(xì)的分析,最后會(huì)對(duì)每一個(gè)問題都給出一個(gè)可以完全“套用”的MATLAB程序拗踢。

我們首先從上面的線性規(guī)劃問題開始脚牍,為了便于表達(dá),將上面的式子寫成矩陣形式:


于是約束就表達(dá)為了一個(gè)不等式巢墅。

用linprog函數(shù)解決線性規(guī)劃

求解MATLAB線性規(guī)劃時(shí)诸狭,最常用的函數(shù)是linprog函數(shù),下面來介紹一下這個(gè)函數(shù)的使用君纫。

打開MATLAB幫助文檔(PS:幫助文檔的內(nèi)容是最全的驯遇,只要你的英文過了專業(yè)8級(jí)),可以看到linprog函數(shù)求解的是具有如下標(biāo)準(zhǔn)形式的線性規(guī)劃:

公式中各符號(hào)的意義是自明的蓄髓,在這里簡(jiǎn)單介紹下叉庐,首先MATLAB中求解的是目標(biāo)函數(shù)是最小值的問題,但如果我們的目標(biāo)函數(shù)是求最大值会喝,可以通過對(duì)目標(biāo)函數(shù)中每一項(xiàng)中乘以-1陡叠,將求最大值問題轉(zhuǎn)化為求最小值問題;A肢执,b分別為不等式約束中的系數(shù)矩陣枉阵。Aeq和beq分別為等式約束中的系數(shù)矩陣,lb预茄,和ub分別為每個(gè)變量的上下區(qū)間兴溜;最后f為目標(biāo)函數(shù)中各變量的系數(shù)矩陣。

現(xiàn)在耻陕,是時(shí)候動(dòng)動(dòng)手昵慌,使用MATLAB編寫代碼求解這個(gè)線性規(guī)劃了。MATLAB代碼如下所示:

f=[-7,-12];
A=[9 4;4 5;3 10];
b=[300;200;300];
lb=zeros(2,1);% 生成一個(gè)2行1列的全0矩陣,很顯示淮蜈,上面例子中的x,y的最小值為0
[x,fval]=linprog(f,A,b,[],[],lb,[])

我們來解釋下linprog函數(shù)中每參數(shù)的意義,linprog中的一個(gè)原型如下:

[x,fval,exitflag] = linprog(f,A,b,Aeq,beq,lb,ub)

這7個(gè)參數(shù)的意義和上面f已卷、A梧田、b的意義是一樣的。f為目標(biāo)函數(shù)的系數(shù)矩陣,A為線性規(guī)劃不等式約束的變量系數(shù)矩陣裁眯,b為不等式約束的資源數(shù)(如上面的[300;200;300])鹉梨,這是一個(gè)N行1列的矩陣,N為變量的個(gè)數(shù)穿稳。Aeq和beq是相應(yīng)等式約束的變量系數(shù)矩陣和資源數(shù)(很明顯存皂,上面的例子中并沒有等式約束)。lb和ub分別為保變量的上下區(qū)間逢艘。在上面的例子中旦袋,x和y和最小值都為0但都無最大值約束。而linprog的返回值x為求得的各變量的值它改,這是一個(gè)向量疤孕,fval為最優(yōu)化的值,一般是一個(gè)標(biāo)量央拖,exitflag意為函數(shù)的退出標(biāo)志祭阀。

上面所示的代碼[x,fval]=linprog(f,A,b,[],[],lb,[])中,[]代表不存在或空鲜戒,因?yàn)樵谏厦娴睦又胁淮嬖诘仁郊s束专控,所以Aeq和beq的位置為[]。而ub也為空遏餐,是因?yàn)樽兞繘]有最大值約束伦腐。

運(yùn)行上面的程序,行到結(jié)果為:

x =

  20.0000

  24.0000

fval =

  -428.0000

解釋為:

當(dāng)x=20,y=24時(shí)境输,可以求得最優(yōu)化的值蔗牡,最大值為428(因?yàn)檫@里的求目標(biāo)最大值,但MATLAB只能求目標(biāo)函數(shù)最小值嗅剖,所以對(duì)目標(biāo)函數(shù)進(jìn)行了乘-1處理辩越,所以也要對(duì)最后的結(jié)果乘以-1才是目標(biāo)函數(shù)所求).

用intlinprog函數(shù)解決整數(shù)規(guī)劃

上面解決了簡(jiǎn)單的線性規(guī)劃問題的求解,線性規(guī)范有兩種比較特殊的情況信粮,即整數(shù)規(guī)劃和0-1整數(shù)規(guī)劃黔攒。在之前(不知MATLAB幾之前……),MATLAB是不能直接求解這兩種規(guī)劃的强缘,bintprog函數(shù)可以用來求0-1整數(shù)規(guī)劃督惰,但求解過程比較麻煩,而且最新版的MATLAB已經(jīng)遺棄了這個(gè)函數(shù)旅掂,同時(shí)提供了一個(gè)比較新的赏胚、專用于求解整數(shù)規(guī)劃和0-1整數(shù)規(guī)劃的函數(shù)——intlinprog。intlinprog的一個(gè)原型為:

[x,fval,exitflag]= intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

該函數(shù)的使用和linprog函數(shù)的使用十分相似商虐,其僅僅在linprog函數(shù)的基礎(chǔ)上多了一個(gè)參數(shù)——intcon觉阅。我們來通過下面的例子來學(xué)習(xí)該參數(shù)的意義崖疤。

在這里例子中,變量的取值范圍不再是有理數(shù)集典勇,而是整數(shù)集劫哼。求解此規(guī)劃問題的MATLAB程序如下:

f_13=[-1,-1];
ic_13=[1,2];
A_13=[-4,2;4,2;0,-2];
b_13=[-1;11;-1];
lb_13=zeros(2,1);
[x_13,fval_13,flag_13]=intlinprog(f_13,ic_13,A_13,b_13,[],[],lb_13,[])

在函數(shù)intlinprog中,intcon的意義為整數(shù)約束變量的位置割笙。如上例中权烧,因?yàn)閤1和x2都要是整數(shù),intcon參數(shù)位置ic_13的值為[1,2]伤溉。這個(gè)位置是按照目標(biāo)函數(shù)和約束條件中變量位置來排列的般码。如果上式中僅有x2為整數(shù)約束,那么ic_13的值應(yīng)該為2谈火。

需要說明的是侈询,intlinprog函數(shù)在比較舊版本是不支持的(筆者使用的是MATLAB2014B),如果你發(fā)現(xiàn)你現(xiàn)在的MATLAB沒有intlinprog函數(shù)糯耍,請(qǐng)不要吃驚扔字,因?yàn)橐恢币詠恚琈ATLAB都是無法直接求解整數(shù)規(guī)劃的温技,但今時(shí)已經(jīng)不同往日了革为。

0-1規(guī)劃

現(xiàn)在又有了一個(gè)新問題,我們解決了在MATLAB上求解一般的整數(shù)規(guī)劃問題舵鳞,但要是遇到0-1整數(shù)規(guī)劃問題呢震檩?到這里,我們只要轉(zhuǎn)換一下思維蜓堕,就可以利用MATLAB求解0-1整數(shù)規(guī)劃了抛虏,這里先賣個(gè)關(guān)子,請(qǐng)大家看下面的例子是怎么用MATLAB求解0-1整數(shù)規(guī)劃的套才。

MATLAB程序如下:

f_12=[7 5 9 6 3];
ic_12=[1,2,3,4,5];
A_12=[56,20,54,42,15;1,4,1,0,0;-1,-2,0,-1,-2];
b_12=[100;4;-2];
lb_12=zeros(5,1);
ub_12=ones(5,1);
[x_12,fval_12,flag_12]=intlinprog(f_12,ic_12,A_12,b_12,[],[],lb_12,ub_12)

有木有發(fā)現(xiàn)在迂猴,與上面整數(shù)規(guī)劃不同的地方只有一個(gè),就是多了ub_12=ones(5,1)背伴,也就是說求解0-1整數(shù)規(guī)劃只要在求解整數(shù)規(guī)劃的基礎(chǔ)上加上一個(gè)對(duì)變量最大值約束為1就行了沸毁,有木有恍然大悟的感覺?傻寂?息尺?

后面兩個(gè)程序并沒有給出程序運(yùn)行的結(jié)果,因?yàn)楣P者堅(jiān)信學(xué)習(xí)最好的方式就是“動(dòng)手”疾掰。_

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搂誉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子静檬,更是在濱河造成了極大的恐慌炭懊,老刑警劉巖浪汪,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凛虽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)广恢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門凯旋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钉迷,你說我怎么就攤上這事至非。” “怎么了糠聪?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荒椭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我舰蟆,道長(zhǎng)趣惠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任身害,我火速辦了婚禮味悄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塌鸯。我一直安慰自己侍瑟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布丙猬。 她就那樣靜靜地躺著涨颜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧球。 梳的紋絲不亂的頭發(fā)上庭瑰,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音袜腥,去河邊找鬼见擦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛羹令,可吹牛的內(nèi)容都是我干的鲤屡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼福侈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酒来!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肪凛,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤堰汉,失蹤者是張志新(化名)和其女友劉穎辽社,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘鸭,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滴铅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了就乓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片功戚。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡打颤,死狀恐怖霜定,靈堂內(nèi)的尸體忽然破棺而出巡球,到底是詐尸還是另有隱情,我是刑警寧澤邦投,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布伤锚,位于F島的核電站,受9級(jí)特大地震影響志衣,放射性物質(zhì)發(fā)生泄漏屯援。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一蠢涝、第九天 我趴在偏房一處隱蔽的房頂上張望玄呛。 院中可真熱鬧,春花似錦和二、人聲如沸徘铝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惕它。三九已至,卻和暖如春废登,著一層夾襖步出監(jiān)牢的瞬間淹魄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工堡距, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甲锡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓羽戒,卻偏偏與公主長(zhǎng)得像缤沦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子易稠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353