資源描述:
《MATLAB求解線性規(guī)劃(含整數(shù)規(guī)劃和01規(guī)劃)問題.pdf》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、MATLAB求解線性規(guī)劃(含整數(shù)規(guī)劃和0-1規(guī)劃)問題線性規(guī)劃是數(shù)學規(guī)劃中的一類最簡單規(guī)劃問題,常見的線性規(guī)劃是一個有約束的,變量范圍為有理數(shù)的線性規(guī)劃。如:maxzx??y712?9xy??4300??4xy??5200s.t??3xy??10300??xy,0?對于這類線性規(guī)劃問題,數(shù)學理論已經(jīng)較為完善,可以有多種方法求解此類問題。但寫這篇文章的目的并不是為了介紹數(shù)學理論,我們這里主要講解如果利用工具求解這一類線性規(guī)劃問題。最著名,同時也是最強大的數(shù)學最優(yōu)化軟件是LINGO/LINDO軟件包,它能夠求解
2、多種的數(shù)學規(guī)劃問題,同時還提供了多種的分析能力。但LINGO軟件并不容易上手,同時,應(yīng)用LINGO的場合一般是大規(guī)模的線性規(guī)劃問題,小小的線性規(guī)劃完全可以不使用它。一個更受科研人員歡迎的數(shù)學軟件是MATLAB,它以功能強大而稱著,并有數(shù)學軟件中的“航空母艦”之稱。我們這里就是要學習使用MATLAB軟件求解線性規(guī)劃(含整數(shù)規(guī)劃和0-1規(guī)劃)問題。為了使得不熟悉MATLAB的人員也能夠使用MATLAB進行線性規(guī)劃問題求解,本文將對MATALB中使用到的函數(shù)和過程以及結(jié)果進行詳細的分析,最后會對每一個問題都給出一
3、個可以完全“套用”的MATLAB程序。我們首先從上面的線性規(guī)劃問題開始,為了便于表達,將上面的式子寫成矩陣形式:maxz??7x12y??94??300??????x???45????200s.t???????y??????310??300???xy,0?于是約束就表達為了一個Axb?不等式。求解MATLAB線性規(guī)劃時,最常用的函數(shù)是linprog函數(shù),下面來介紹一下這個函數(shù)的使用。打開MATLAB幫助文檔(PS:幫助文檔的內(nèi)容是最全的,只要你的英文過了專業(yè)8級),可以看到linprog函數(shù)求解的是具有如下
4、標準形式的線性規(guī)劃:Tminfxx?AX?b?stAeqX.??beq??lb??xub公式中各符號的意義是自明的,在這里簡單介紹下,首先MATLAB中求解的是目標函數(shù)是最小值的問題,但如果我們的目標函數(shù)是求最大值,可以通過對目標函數(shù)中每一項中乘以-1,將求最大值問題轉(zhuǎn)化為求最小值問題;A,b分別為不等式約束中的系數(shù)矩陣。Aeq和beq分別為等式約束中的系數(shù)矩陣,lb,和ub分別為每個變量的上下區(qū)間;最后f為目標函數(shù)中各變量的系數(shù)矩陣。現(xiàn)在,是時候動動手,使用MATLAB編寫代碼求解這個線性規(guī)劃了。MATL
5、AB代碼如下所示:f=[-7,-12];A=[94;45;310];b=[300;200;300];lb=zeros(2,1);%生成一個2行1列的全1矩陣[x,fval]=linprog(f,A,b,[],[],lb,[])我們來解釋下linprog函數(shù)中每參數(shù)的意義,linprog中的一個原型如下:[x,fval,exitflag]=linprog(f,A,b,Aeq,beq,lb,ub)這7個參數(shù)的意義和上面f、A、b的意義是一樣的。f為目標函數(shù)的系數(shù)矩陣,A為線性規(guī)劃不等式約束的變量系數(shù)矩陣,b為不
6、等式約束的資源數(shù)(如上面的[300;200;300]),這是一個N行1列的矩陣,N為變量的個數(shù)。Aeq和beq是相應(yīng)等式約束的變量系數(shù)矩陣和資源數(shù)(很明顯,上面的例子中并沒有等式約束)。lb和ub分別為保變量的上下區(qū)間。在上面的例子中,x和y和最小值都為0但都無最大值約束。而linprog的返回值x為求得的各變量的值,這是一個向量,fval為最優(yōu)化的值,一般是一個標量,exitflag意為函數(shù)的退出標志。上面所示的代碼[x,fval]=linprog(f,A,b,[],[],lb,[])中,[]代表不存在或
7、空,因為在上面的例子中不存在等式約束,所以Aeq和beq的位置為[]。而ub也為空,是因為變量沒有最大值約束。運行上面的程序,行到結(jié)果為:x=20.000024.0000fval=-428.0000解釋為:當x=20,y=24時,可以求得最優(yōu)化的值,最大值為428(因為這里的求目標最大值,但MATLAB只能求目標函數(shù)最小值,所以對目標函數(shù)進行了乘-1處理,所以也要對最后的結(jié)果乘以-1才是目標函數(shù)所求).上面解決了簡單的線性規(guī)劃問題的求解,線性規(guī)范有兩種比較特殊的情況,即整數(shù)規(guī)劃和0-1整數(shù)規(guī)劃。在之前(不知
8、MATLAB幾之前……),MATLAB是不能直接求解這兩種規(guī)劃的,bintprog函數(shù)可以用來求0-1整數(shù)規(guī)劃,但求解過程比較麻煩,而且最新版的MATLAB已經(jīng)遺棄了這個函數(shù),同時提供了一個比較新的、專用于求解整數(shù)規(guī)劃和0-1整數(shù)規(guī)劃的函數(shù)——intlinprog。intlinprog的一個原型為:[x,fval,exitflag]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)該函