中農(nóng)大水資源和環(huán)境模型與優(yōu)化課件第2講 LINGO軟件與優(yōu)化建模_第1頁(yè)
中農(nóng)大水資源和環(huán)境模型與優(yōu)化課件第2講 LINGO軟件與優(yōu)化建模_第2頁(yè)
中農(nóng)大水資源和環(huán)境模型與優(yōu)化課件第2講 LINGO軟件與優(yōu)化建模_第3頁(yè)
中農(nóng)大水資源和環(huán)境模型與優(yōu)化課件第2講 LINGO軟件與優(yōu)化建模_第4頁(yè)
中農(nóng)大水資源和環(huán)境模型與優(yōu)化課件第2講 LINGO軟件與優(yōu)化建模_第5頁(yè)
已閱讀5頁(yè),還剩138頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第2講LINGO軟件與優(yōu)化建模LINGO快速入門(mén)LINGO中的集模型的數(shù)據(jù)部分LINGO函數(shù)窗口菜單例子本講內(nèi)容2美國(guó)芝加哥(Chicago)大學(xué)的LinusSchrage教授于1980年前后開(kāi)發(fā),后來(lái)成立LINDO系統(tǒng)公司(LINDOSystemsInc.),網(wǎng)址:

LINDO:LinearINteractiveandDiscreteOptimizer(V6.1)LINGO:LinearINteractiveGeneralOptimizer(V8.0)LINDOAPI:LINDOApplicationProgrammingInterface(V2.0)What’sBest!:(SpreadSheete.g.EXCEL)(V7.0)演示(試用)版、學(xué)生版、高級(jí)版、超級(jí)版、工業(yè)版、擴(kuò)展版…(求解問(wèn)題規(guī)模和選件不同)LINDO公司軟件產(chǎn)品簡(jiǎn)要介紹3LINGO模型的優(yōu)點(diǎn)包含了LINDO的全部功能提供了靈活的編程語(yǔ)言(矩陣生成器)LINGO模型的構(gòu)成:4個(gè)段目標(biāo)與約束段集合段(SETSENDSETS)數(shù)據(jù)段(DATAENDDATA)初始段(INITENDINIT)LINGO軟件簡(jiǎn)介4

LPQPNLPIP全局優(yōu)化(選)

ILPIQPINLP

LINGO軟件的求解過(guò)程5LINGO預(yù)處理程序線性優(yōu)化求解程序非線性優(yōu)化求解程序分枝定界管理程序1.確定常數(shù)2.識(shí)別類型1.單純形算法2.內(nèi)點(diǎn)算法(選)1、順序線性規(guī)劃法(SLP)2、廣義既約梯度法(GRG)(選)

3、多點(diǎn)搜索(Multistart)(選)LINGO軟件的主要特色兩種命令模式Windows模式:通過(guò)下拉式菜單命令驅(qū)動(dòng)LINGO運(yùn)行(多數(shù)菜單命令有快捷鍵,常用的菜單命令有快捷按鈕),圖形界面,使用方便;命令行模式:僅在命令窗口(CommandWindow)下操作,通過(guò)輸入行命令驅(qū)動(dòng)LINGO運(yùn)行。6從LINDO到LINGO如今LINGO功能增強(qiáng),性能穩(wěn)定,解答結(jié)果可靠。與LINDO相比,LINGO軟件主要具有兩大優(yōu)點(diǎn):除具有LINDO的全部功能外,還可用于求解非線性規(guī)劃問(wèn)題,包括非線性整數(shù)規(guī)劃問(wèn)題;內(nèi)置建模語(yǔ)言,允許以簡(jiǎn)練、直觀的方式描述較大規(guī)模的優(yōu)化問(wèn)題,所需的數(shù)據(jù)可以以一定格式保存在獨(dú)立的文件中。7LINGO軟件的主窗口(用戶界面),所有其他窗口都在這個(gè)窗口之內(nèi)。模型窗口(ModelWindow)用于輸入LINGO優(yōu)化模型狀態(tài)行(最左邊顯示“Ready”,表示“準(zhǔn)備就緒”)當(dāng)前時(shí)間當(dāng)前光標(biāo)的位置LINGO的界面8LINGO是用來(lái)求解線性和非線性優(yōu)化問(wèn)題的簡(jiǎn)易工具。LINGO內(nèi)置了一種建立最優(yōu)化模型的語(yǔ)言,可以簡(jiǎn)便地表達(dá)大規(guī)模問(wèn)題,利用LINGO高效的求解器可快速求解并分析結(jié)果。當(dāng)你在windows下開(kāi)始運(yùn)行LINGO系統(tǒng)時(shí),會(huì)得到類似下面的一個(gè)窗口:File|Open(F3)打開(kāi)文件File|Print(F7)打印文件Edit|Copy(Ctrl+C)復(fù)制Edit|Undo(Ctrl+Z)取消操作Edit|Find(Ctrl+F)查找LINGO|Solution(Alt+O)顯示解答Edit|MatchParenthesis(Ctrl+P)匹配括號(hào)LINGO|Options(Ctrl+I)選項(xiàng)設(shè)置Help|Contents(F1)在線幫助File|New(F2)新建文件File|Save(F4)保存文件Edit|Cut(Ctrl+X)剪切Edit|Paste(Ctrl+V)粘貼Window|CloseAll(Alt+X)關(guān)閉所有窗口Edit|Redo(Ctrl+Y)恢復(fù)操作Edit|GoToLine(Ctrl+T)定位某行LINGO|Solve(Ctrl+S)求解模型LINGO|Picture(Ctrl+K)模型圖示W(wǎng)indow|SendtoBack(Ctrl+B)窗口后置Window|Tile(Alt+T)

平鋪窗口上下文相關(guān)的幫助工具欄9除“LG4”文件外,另外幾種格式的文件都是普通的文本文件,可以用任何文本編輯器打開(kāi)和編輯。.LG4:LINGO格式的模型文件,保存了模型窗口中所能夠看到的所有文本和其他對(duì)象及其格式信息;.LNG:文本格式的模型文件,不保存模型中的格式信息(如字體、顏色、嵌入對(duì)象等);.LDT:LINGO數(shù)據(jù)文件;.LTF:LINGO命令腳本文件;.LGR:LINGO報(bào)告文件;.LTX:LINDO格式的模型文件;.MPS:示MPS(數(shù)學(xué)規(guī)劃系統(tǒng))格式的模型文件。LINGO的文件類型10Variables(變量數(shù)量)變量總數(shù)(Total)非線性變量數(shù)(Nonlinear)整數(shù)變量數(shù)(Integer)。Constraints(約束數(shù)量)約束總數(shù)(Total)非線性約束個(gè)數(shù)(Nonlinear)Nonzeros(非零系數(shù)數(shù)量)總數(shù)(Total)非線性項(xiàng)系數(shù)個(gè)數(shù)(Nonlinear)GeneratorMemoryUsed(K)(內(nèi)存使用量)ElapsedRuntime(hh:mm:ss)(求解花費(fèi)的時(shí)間)運(yùn)行狀態(tài)窗口11求解器(求解程序)狀態(tài)框當(dāng)前模型的類型:LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I開(kāi)頭表示IP,以PI開(kāi)頭表示PIP)當(dāng)前解的狀態(tài):"GlobalOptimum","LocalOptimum","Feasible","Infeasible“(不可行),"Unbounded“(無(wú)界),"Interrupted“(中斷),"Undetermined“(未確定)解的目標(biāo)函數(shù)值當(dāng)前約束不滿足的總量(不是不滿足的約束的個(gè)數(shù)):實(shí)數(shù)(即使該值=0,當(dāng)前解也可能不可行,因?yàn)檫@個(gè)量中沒(méi)有考慮用上下界命令形式給出的約束)目前為止的迭代次數(shù)運(yùn)行狀態(tài)窗口12擴(kuò)展的求解器(求解程序)狀態(tài)框目前為止找到的可行解的最佳目標(biāo)函數(shù)值目標(biāo)函數(shù)值的界特殊求解程序當(dāng)前運(yùn)行步數(shù):分枝數(shù)(對(duì)B-and-B程序);子問(wèn)題數(shù)(對(duì)Global程序);初始點(diǎn)數(shù)(對(duì)Multistart程序)有效步數(shù)運(yùn)行狀態(tài)窗口13使用的特殊求解程序:B-and-B(分枝定界算法)Global(全局最優(yōu)求解程序)Multistart(用多個(gè)初始點(diǎn)求解的程序)注:凡是可以從一個(gè)約束直接解出變量取值時(shí),這個(gè)變量就不認(rèn)為是決策變量而是固定變量,不列入統(tǒng)計(jì)中;只含有固定變量的約束也不列入約束統(tǒng)計(jì)中。外層是主框架窗口,包含了所有菜單命令和工具條,其它所有的窗口將被包含在主窗口之下。在主窗口內(nèi)的標(biāo)題為L(zhǎng)INGOModel–LINGO1的窗口是LINGO的默認(rèn)模型窗口,建立的模型都要在該窗口內(nèi)編碼實(shí)現(xiàn)。下面舉兩個(gè)例子。例1.1如何在LINGO中求解如下的LP問(wèn)題:一個(gè)簡(jiǎn)單的LINGO程序14在模型窗口中輸入如下代碼:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后點(diǎn)擊工具條上的按鈕或者Ctrl+U即可。一個(gè)簡(jiǎn)單的LINGO程序15最小值=800最優(yōu)解X1=250,x2=100程序語(yǔ)句輸入的備注LINGO總是根據(jù)“MAX=”或“MIN=”尋找目標(biāo)函數(shù),而除注釋語(yǔ)句和TITLE語(yǔ)句外的其他語(yǔ)句都是約束條件,因此語(yǔ)句的順序并不重要。限定變量取整數(shù)值的語(yǔ)句為“@GIN(X1)”和“@GIN(X2)”,不可以寫(xiě)成“@GIN(2)”,否則LINGO將把這個(gè)模型看成沒(méi)有整數(shù)變量。LINGO中函數(shù)一律需要以“@”開(kāi)頭,其中整型變量函數(shù)(@BIN、@GIN)和上下界限定函數(shù)(@FREE、@BND(L,X,U))。而且0/1變量函數(shù)是@BIN函數(shù)。16通過(guò)菜單“WINDOW|StatusWindow”看到狀態(tài)窗口,可看到最佳目標(biāo)值“BestObj”與問(wèn)題的上界“ObjBound”已經(jīng)是一樣的,當(dāng)前解的最大利潤(rùn)與這兩個(gè)值非常接近,是計(jì)算誤差引起的。如果采用全局最優(yōu)求解程序(后面介紹),可以驗(yàn)證它就是全局最優(yōu)解。輸出結(jié)果備注LINGO是將它作為PINLP(純整數(shù)非線性規(guī)劃)來(lái)求解,因此找到的是局部最優(yōu)解。17LINGO的基本用法的幾點(diǎn)注意事項(xiàng)LINGO中不區(qū)分大小寫(xiě)字母;變量和行名可以超過(guò)8個(gè)字符,但不能超過(guò)32個(gè)字符,且必須以字母開(kāi)頭。用LINGO解優(yōu)化模型時(shí)已假定所有變量非負(fù)(除非用限定變量取值范圍的函數(shù)@free或@BND另行說(shuō)明)。變量可以放在約束條件的右端(同時(shí)數(shù)字也可放在約束條件的左端)。但為了提高LINGO求解時(shí)的效率,應(yīng)盡可能采用線性表達(dá)式定義目標(biāo)和約束(如果可能的話)。語(yǔ)句是組成LINGO模型的基本單位,每個(gè)語(yǔ)句都以分號(hào)結(jié)尾,編寫(xiě)程序時(shí)應(yīng)注意模型的可讀性。例如:一行只寫(xiě)一個(gè)語(yǔ)句,按照語(yǔ)句之間的嵌套關(guān)系對(duì)語(yǔ)句安排適當(dāng)?shù)目s進(jìn),增強(qiáng)層次感。以感嘆號(hào)開(kāi)始的是說(shuō)明語(yǔ)句(說(shuō)明語(yǔ)句也需要以分號(hào)結(jié)束))。18LINGO快速入門(mén)LINGO中的集模型的數(shù)據(jù)部分LINGO函數(shù)窗口菜單例子本節(jié)內(nèi)容19對(duì)實(shí)際問(wèn)題建模的時(shí)候,總會(huì)遇到一群或多群相聯(lián)系的對(duì)象,比如工廠、消費(fèi)者群體、交通工具和雇工等等。LINGO允許把這些相聯(lián)系的對(duì)象聚合成集(sets)。一旦把對(duì)象聚合成集,就可以利用集來(lái)最大限度的發(fā)揮LINGO建模語(yǔ)言的優(yōu)勢(shì)?,F(xiàn)在我們將深入介紹如何創(chuàng)建集,并用數(shù)據(jù)初始化集的屬性。學(xué)完本節(jié)后,你對(duì)基于建模技術(shù)的集如何引入模型會(huì)有一個(gè)基本的理解。為什么使用集集是LINGO建模語(yǔ)言的基礎(chǔ),是程序設(shè)計(jì)最強(qiáng)有力的基本構(gòu)件。借助于集,能夠用一個(gè)單一的、長(zhǎng)的、簡(jiǎn)明的復(fù)合公式表示一系列相似的約束,從而可以快速方便地表達(dá)規(guī)模較大的模型。LINGO中的集20集是一群相聯(lián)系的對(duì)象,這些對(duì)象也稱為集的成員。一個(gè)集可能是一系列產(chǎn)品、卡車或雇員。每個(gè)集成員可能有一個(gè)或多個(gè)與之有關(guān)聯(lián)的特征,我們把這些特征稱為屬性。屬性值可以預(yù)先給定,也可以是未知的,有待于LINGO求解。例如,產(chǎn)品集中的每個(gè)產(chǎn)品可以有一個(gè)價(jià)格屬性;卡車集中的每輛卡車可以有一個(gè)牽引力屬性;雇員集中的每位雇員可以有一個(gè)薪水屬性,也可以有一個(gè)生日屬性等等。LINGO有兩種類型的集:原始集(primitive

set)和派生集(derivedset)。原始集是由一些最基本的對(duì)象組成的。派生集是用一個(gè)或多個(gè)其它集來(lái)定義的,也就是說(shuō),它的成員來(lái)自于其它已存在的集。LINGO中的集21模型的集部分集部分是LINGO模型的一個(gè)可選部分。在LINGO模型中使用集之前,必須在集部分事先定義。集部分以關(guān)鍵字“sets:”開(kāi)始,以“endsets”結(jié)束。一個(gè)模型可以沒(méi)有集部分,或有一個(gè)簡(jiǎn)單的集部分,或有多個(gè)集部分。一個(gè)集部分可以放置于模型的任何地方,但是一個(gè)集及其屬性在模型約束中被引用之前必須定義了它們。定義原始集為了定義一個(gè)原始集,必須詳細(xì)聲明:集的名字可選,集的成員可選,集成員的屬性定義一個(gè)原始集,用下面的語(yǔ)法:setname[/member_list/][:attribute_list];注意:用“[]”表示該部分內(nèi)容可選。下同,不再贅述。LINGO中的集22用DEM,RP,OP,INV分別表示需求量、正常生產(chǎn)的產(chǎn)量、加班生產(chǎn)的產(chǎn)量、庫(kù)存量,則DEM,RP,OP,INV對(duì)每個(gè)季度都應(yīng)該有一個(gè)對(duì)應(yīng)的值,也就說(shuō)他們都應(yīng)該是一個(gè)由4個(gè)元素組成的數(shù)組,其中DEM是已知的,而RP,OP,INV是未知數(shù)。例SAILCO公司需要決定下四個(gè)季度的帆船生產(chǎn)量。下四個(gè)季度的帆船需求量分別是40條,60條,75條,25條,這些需求必須按時(shí)滿足。每個(gè)季度正常的生產(chǎn)能力是40條帆船,每條船的生產(chǎn)費(fèi)用為400美元。如果加班生產(chǎn),每條船的生產(chǎn)費(fèi)用為450美元。每個(gè)季度末,每條船的庫(kù)存費(fèi)用為20美元。假定生產(chǎn)提前期為0,初始庫(kù)存為10條船。如何安排生產(chǎn)可使總費(fèi)用最?。縇INGO中的集23問(wèn)題的模型(可以看出是LP模型)目標(biāo)函數(shù)是所有費(fèi)用的和

約束條件主要有:1)能力限制:2)產(chǎn)品數(shù)量的平衡方程:3)非負(fù)約束LINGO中的集24注:LINDO中沒(méi)有數(shù)組,只能對(duì)每個(gè)季度分別定義變量,如正常產(chǎn)量就要有RP1,RP2,RP3,RP44個(gè)變量等。寫(xiě)起來(lái)就比較麻煩,尤其是更多(如1000個(gè)季度)的時(shí)候。記四個(gè)季度組成的集合QUARTERS={1,2,3,4},它們就是上面數(shù)組的下標(biāo)集合,而數(shù)組DEM,RP,OP,INV對(duì)集合QUARTERS中的每個(gè)元素1,2,3,4分別對(duì)應(yīng)于一個(gè)值。LINGO正是充分利用了這種數(shù)組及其下標(biāo)的關(guān)系,引入了“集合”及其“屬性”的概念,把QUARTERS={1,2,3,4}稱為集合,把DEM,RP,OP,INV稱為該集合的屬性(即定義在該集合上的屬性)。LINGO中的集25QUARTERS集合的屬性DEMRPOPINVQUARTERS集合2341LINGO中的集26集合QUARTERS的元素1234定義在集合QUARTERS上的屬性DEMDEM(1)DEM(2)DEM(3)DEM(4)RPRP(1)RP(2)RP(3)RP(4)OPOP(1)OP(2)OP(3)OP(4)INVINV(1)INV(2)INV(3)INV(4)LINGO中的集集合元素及集合的屬性確定的所有變量27LP模型在LINGO中的一個(gè)典型輸入方式以“MODEL:”開(kāi)始以“END”結(jié)束集合定義部分從(“SETS:”到“ENDSETS”):定義集合及其屬性數(shù)據(jù)定義部分從(“DATA:”到“ENDDATA”)給出優(yōu)化目標(biāo)和約束LINGO中的集28@SUM(集合(下標(biāo)):關(guān)于集合的屬性的表達(dá)式)對(duì)語(yǔ)句中冒號(hào)“:”后面的表達(dá)式,按照“:”前面的集合指定的下標(biāo)(元素)進(jìn)行求和。本例中目標(biāo)函數(shù)也可以等價(jià)地寫(xiě)成@SUM(QUARTERS(i):400*RP(i)+450*OP(i)+20*INV(i)),“@SUM”相當(dāng)于求和符號(hào)“∑”,由于本例中目標(biāo)函數(shù)對(duì)集合QUARTERS的所有元素(下標(biāo))都要求和,所以可以將下標(biāo)i省去。目標(biāo)函數(shù)的定義方式29循環(huán)函數(shù)@FOR(集合(下標(biāo)):關(guān)于集合的屬性的約束關(guān)系式)對(duì)冒號(hào)“:”前面的集合的每個(gè)元素(下標(biāo)),冒號(hào)“:”后面的約束關(guān)系式都要成立本例中,每個(gè)季度正常的生產(chǎn)能力是40條帆船,這正是語(yǔ)句“@FOR(QUARTERS(I):RP(I)<40);”的含義。由于對(duì)所有元素(下標(biāo)I),約束的形式是一樣的,所以也可以像上面定義目標(biāo)函數(shù)時(shí)一樣,將下標(biāo)i省去,這個(gè)語(yǔ)句可以簡(jiǎn)化成“@FOR(QUARTERS:RP<40);”。約束的定義方式30本例中,對(duì)于產(chǎn)品數(shù)量的平衡方程,由于下標(biāo)i=1時(shí)的約束關(guān)系式與i=2,3,4時(shí)有所區(qū)別,所以不能省略下標(biāo)“i”。實(shí)際上,i=1時(shí)要用到變量INV(0),但定義的屬性變量中INV不包含INV(0)(INV(0)=10是一個(gè)已知的)。為了區(qū)別i=1和i=2,3,4,把i=1時(shí)的約束關(guān)系式單獨(dú)寫(xiě)出,即“INV(1)=10+RP(1)+OP(1)-DEM(1);”;而對(duì)i=2,3,4對(duì)應(yīng)的約束,對(duì)下標(biāo)集合的元素(下標(biāo)i)增加了一個(gè)邏輯關(guān)系式“i#GT#1”(這個(gè)限制條件與集合之間有一個(gè)豎線“|”分開(kāi),稱為過(guò)濾條件)。限制條件“i#GT#1”是一個(gè)邏輯表達(dá)式,意思就是i>1;“#GT#”是邏輯運(yùn)算符號(hào),意思是“大于(GreaterThan的字首字母縮寫(xiě))”。約束的定義方式31全局最優(yōu)解RP=(40,40,40,25),OP=(0,10,35,0)最小成本=78450問(wèn)題的求解32注:由于輸入中沒(méi)有給出行名,所以行名是系統(tǒng)自動(dòng)按照行號(hào)1-9生成的。選擇菜單命令“LINGO|Generate|Displymodel(Ctrl+G)”,可以得到展開(kāi)形式的模型(如圖),可以看到完整的模型,也能確定行號(hào)(行號(hào)放在方括號(hào)“[]”中,且數(shù)字前面帶有下劃線“_”)。最好在輸入模型時(shí)用戶主動(dòng)設(shè)定約束的行名(即約束名),使程序清晰些。單一約束的行名設(shè)置方法就是將行名放在方括號(hào)“[]”中,置于約束之前。后面將結(jié)合具體例子介紹在使用集合的情況下如何設(shè)置行名。問(wèn)題的求解33一般來(lái)說(shuō),LINGO中建立的優(yōu)化模型可以由個(gè)四部分組成,或稱為四“段”(SECTION):(1)集合段(SETS):以“SETS:”開(kāi)始,“ENDSETS”結(jié)束,定義必要的集合變量(SET)及其元素(MEMBER,含義類似于數(shù)組的下標(biāo))和屬性(ATTRIBUTE,含義類似于數(shù)組)。如上例中定義了集合quarters(含義是季節(jié)),它包含四個(gè)元素即四個(gè)季節(jié)指標(biāo)(1,2,3,4),每個(gè)季節(jié)都有需求(DEM)、正常生產(chǎn)量(RP)、加班生產(chǎn)量(OP)、庫(kù)存量(INV)等屬性(相當(dāng)于數(shù)組,數(shù)組下標(biāo)由quarters元素決定)。一旦這樣的定義建立起來(lái),如果quarters的數(shù)量不是4而是1000,只需擴(kuò)展其元素為1,2,...,1000,每個(gè)季節(jié)仍然都有DEM,RP,OP,INV這樣的屬性(這些量的具體數(shù)值如果是常量,則可在數(shù)據(jù)段輸入;如果是未知數(shù),則可在初始段輸入初值)。當(dāng)quarters的數(shù)量不是4而是1000時(shí),沒(méi)有必要把1,2,...,1000全部一個(gè)一個(gè)列出來(lái),而是可以如下定義quarters集合:“quarters/1..1000/:DEM,RP,OP,INV;”,“1..1000”的意思就是從1到1000的所有整數(shù)。小結(jié):LINGO模型最基本的組成要素34(2)目標(biāo)與約束段:目標(biāo)函數(shù)、約束條件等,沒(méi)有段的開(kāi)始和結(jié)束標(biāo)記,因此實(shí)際上就是除其它四個(gè)段(都有明確的段標(biāo)記)外的LINGO模型。這里一般要用到LINGO的內(nèi)部函數(shù),尤其是與集合相關(guān)的求和函數(shù)@SUM和循環(huán)函數(shù)@FOR等。上例中定義的目標(biāo)函數(shù)與quarters的元素?cái)?shù)目是4或1000并無(wú)具體的關(guān)系。約束的表示也類似。小結(jié):LINGO模型最基本的組成要素35(3)數(shù)據(jù)段(DATA):以“DATA:”開(kāi)始,“ENDDATA”結(jié)束,對(duì)集合的屬性(數(shù)組)輸入必要的常數(shù)數(shù)據(jù)。格式為:“attribute(屬性)=value_list(常數(shù)列表);”常數(shù)列表(value_list)中數(shù)據(jù)之間可以用逗號(hào)“,”分開(kāi),也可以用空格分開(kāi)(回車等價(jià)于一個(gè)空格),如上面對(duì)DEM的賦值也可以寫(xiě)成“DEM=40607525;”。在LINGO模型中,如果想在運(yùn)行時(shí)才對(duì)參數(shù)賦值,可以在數(shù)據(jù)段使用輸入語(yǔ)句。但這僅能用于對(duì)單個(gè)變量賦值,輸入語(yǔ)句格式為:“變量名=?;”。例如,上例中如果需要在求解模型時(shí)才給出初始庫(kù)存量(記為A),則可以在模型中數(shù)據(jù)段寫(xiě)上語(yǔ)句:”A=?;”在求解時(shí)LINDO系統(tǒng)給出提示界面,等待用戶輸入變量A的數(shù)值。當(dāng)然,此時(shí)的約束語(yǔ)句INV(1)=10+RP(1)+OP(1)-DEM(1);也應(yīng)該改寫(xiě)成INV(1)=A+RP(1)+OP(1)-DEM(1);這樣,模型就可以計(jì)算任意初始庫(kù)存量(而不僅僅只能計(jì)算初始庫(kù)存量為10)的情況了。小結(jié):LINGO模型最基本的組成要素36(4)初始段(INIT):以“INIT:”開(kāi)始,“ENDINIT”結(jié)束,對(duì)集合的屬性(數(shù)組)定義初值(因?yàn)榍蠼馑惴ㄒ话闶堑惴ǎ杂脩羧绻芙o出一個(gè)比較好的迭代初值,對(duì)提高算法的計(jì)算效果是有益的)。如果有一個(gè)接近最優(yōu)解的初值,對(duì)LINGO求解模型是有幫助的。定義初值的格式為:“attribute(屬性)=value_list(常數(shù)列表);”這與數(shù)據(jù)段中的用法是類似的。上例中沒(méi)有初始化部分,我們將在下一個(gè)例子中舉例說(shuō)明。小結(jié):LINGO模型最基本的組成要素37例3.4建筑工地的位置(用平面坐標(biāo)a,b表示,距離單位:公里)及水泥日用量d(噸)下表給出。有兩個(gè)臨時(shí)料場(chǎng)位于P(5,1),Q(2,7),日儲(chǔ)量各有20噸。從A,B兩料場(chǎng)分別向各工地運(yùn)送多少噸水泥,使總的噸公里數(shù)最小。兩個(gè)新的料場(chǎng)應(yīng)建在何處,節(jié)省的噸公里數(shù)有多大?123456a1.258.750.55.7537.25b1.250.754.7556.57.75d3547611基本集合與派生集合38記工地的位置為,水泥日用量為;料場(chǎng)位置為,日儲(chǔ)量為;從料場(chǎng)

向工地的運(yùn)送量為

。使用現(xiàn)有臨時(shí)料場(chǎng)時(shí),決策變量只有(非負(fù)),所以這是LP模型;當(dāng)為新建料場(chǎng)選址時(shí)決策變量為和,由于目標(biāo)函數(shù)對(duì)是非線性的,所以在新建料場(chǎng)時(shí)是NLP模型。先解NLP模型,而把現(xiàn)有臨時(shí)料場(chǎng)的位置作為初始解告訴LINGO。建立模型39利用集合的概念,可以定義需求點(diǎn)DEMAND和供應(yīng)點(diǎn)SUPPLY兩個(gè)集合,分別有6個(gè)和2個(gè)元素(下標(biāo))。但決策變量(運(yùn)送量)與集合DEMAND和集合SUPPLY都有關(guān)系的。該如何定義這樣的屬性?集合的屬性相當(dāng)于以集合的元素為下標(biāo)的數(shù)組。這里的相當(dāng)于二維數(shù)組。它的兩個(gè)下標(biāo)分別來(lái)自集合DEMAND和SUPPLY,因此可以定義一個(gè)由二元對(duì)組成的新的集合,然后將定義成這個(gè)新集合的屬性。本例中集合的概念40包含了兩個(gè)基本集合構(gòu)成的所有二元有序?qū)Φ呐缮戏Q為稠密集合(簡(jiǎn)稱稠集)。有時(shí)候,在實(shí)際問(wèn)題中,一些屬性(數(shù)組)只在笛卡兒積的一個(gè)真子集合上定義,這種派生集合稱為稀疏集合(簡(jiǎn)稱疏集)。例(最短路問(wèn)題)在縱橫交錯(cuò)的公路網(wǎng)中,貨車司機(jī)希望找到一條從一個(gè)城市到另一個(gè)城市的最短路.下圖表示的是公路網(wǎng),節(jié)點(diǎn)表示貨車可以??康某鞘?弧上的權(quán)表示兩個(gè)城市之間的距離(百公里).那么,貨車從城市S出發(fā)到達(dá)城市T,如何選擇行駛路線,使所經(jīng)過(guò)的路程最短?STA1

A2

A3

B1

B2

C1

C2

633665874678956稠密集合與稀疏集合41假設(shè)從S到T的最優(yōu)行駛路線P經(jīng)過(guò)城市C1,則P中從S到C1的子路也一定是從S到C1的最優(yōu)行駛路線;

假設(shè)P經(jīng)過(guò)城市C2,則P中從S到C2的子路也一定是從S到C2的最優(yōu)行駛路線.因此,為得到從S到T的最優(yōu)行駛路線,只需要先求出從S到Ck(k=1,2)的最優(yōu)行駛路線,就可以方便地得到從S到T的最優(yōu)行駛路線.同樣,為了求出從S到Ck(k=1,2)的最優(yōu)行駛路線,只需要先求出從S到Bj(j=1,2)的最優(yōu)行駛路線;為了求出從S到Bj(j=1,2)的最優(yōu)行駛路線,只需要先求出從S到Ai(i=1,2,3)的最優(yōu)行駛路線.而S到Ai(i=1,2,3)的最優(yōu)行駛路線是很容易得到的(實(shí)際上,此例中S到Ai(i=1,2,3)只有唯一的道路)分析42STA1

A2

A3

B1

B2

C1

C2

633665874678956此例中可把從S到T的行駛過(guò)程分成4個(gè)階段,即S→Ai

(i=1,2或3),Ai

→Bj(j=1或2),Bj→Ck(k=1或2),Ck→T.記d(Y,X)為城市Y與城市X之間的直接距離(若這兩個(gè)城市之間沒(méi)有道路直接相連,則可以認(rèn)為直接距離為∞),用L(X)表示城市S到城市X的最優(yōu)行駛路線的路長(zhǎng):分析43STA1

A2

A3

B1

B2

C1

C2

633665874678956所以,從S到T的最優(yōu)行駛路線的路長(zhǎng)為20.進(jìn)一步分析以上求解過(guò)程,可以得到從S到T的最優(yōu)行駛路線為S→A3→B2→C1→T這種計(jì)算方法在數(shù)學(xué)上稱為動(dòng)態(tài)規(guī)劃(DynamicProgramming)本例的計(jì)算44STA1

A2

A3

B1

B2

C1

C2

633665874678956“CITIES”(城市):一個(gè)基本集合(元素通過(guò)枚舉給出)L:CITIES對(duì)應(yīng)的屬性變量(我們要求的最短路長(zhǎng))“ROADS”(道路):由CITIES導(dǎo)出的一個(gè)派生集合(請(qǐng)?zhí)貏e注意其用法),由于只有一部分城市之間有道路相連,所以不應(yīng)該把它定義成稠密集合,將其元素通過(guò)枚舉給出,這就是一個(gè)稀疏集合。D:稀疏集合ROADS對(duì)應(yīng)的屬性變量(給定的距離)本例的LINGO求解45從模型中還可以看出:這個(gè)LINGO程序可以沒(méi)有目標(biāo)函數(shù),這在LINGO中,可以用來(lái)找可行解(解方程組和不等式組)。在數(shù)據(jù)段對(duì)L進(jìn)行賦值,只有L(S)=0已知,后面的值為空(但位置必須留出來(lái),即逗號(hào)“,”一個(gè)也不能少,否則會(huì)出錯(cuò))。如果這個(gè)語(yǔ)句直接寫(xiě)成“L=0;”,語(yǔ)法上看也是對(duì)的,但其含義是L所有元素的取值全部為0,所以也會(huì)與題意不符。本例的LINGO求解46雖然集合CITIES中的元素不是數(shù)字,但當(dāng)它以CITIES(I)的形式出現(xiàn)在循環(huán)中時(shí),引用下標(biāo)I卻實(shí)際上仍是正整數(shù),也就是說(shuō)I指的正是元素在集合中的位置(順序),一般稱為元素的索引(INDEX)。在@for循環(huán)中的過(guò)濾條件里用了一個(gè)函數(shù)“@index”,其作用是返回一個(gè)元素在集合中的索引值,這里@index(S)=1(即元素S在集合中的索引值為1),所以邏輯關(guān)系式“I#GT#@index(S)”可以直接等價(jià)地寫(xiě)成“I#GT#1”。這里@index(S)實(shí)際上還是@index(CITIES,S)的簡(jiǎn)寫(xiě),即返回S在集合CITIES中的索引值。本例的LINGO求解47從S到T的最優(yōu)行駛路線的路長(zhǎng)為20(進(jìn)一步分析,可以得到最優(yōu)行駛路線為S→A3→B2→C1→T)。本例中定義稀疏集合ROADS的方法是將其元素通過(guò)枚舉給出,有時(shí)如果元素比較多,用起來(lái)不方便。另一種定義稀疏集合的方法是“元素過(guò)濾”法,能夠從笛卡兒積中系統(tǒng)地過(guò)濾下來(lái)一些真正的元素。本例的LINGO求解結(jié)果48基本集合的定義格式為(方括號(hào)“[]”中的內(nèi)容是可選項(xiàng),可以沒(méi)有):setname[/member_list/][:attribute_list];其中setname為定義的集合名,member_list為元素列表,attribute_list為屬性列表。元素列表可以采用顯式列舉法(即直接將所有元素全部列出,元素之間用逗號(hào)或空格分開(kāi)),也可以采用隱式列舉法。隱式列舉法可以有幾種不同格式,類型隱式列舉格式示例示例集合表示的元素?cái)?shù)字型1..n1..51,2,3,4,5字符-數(shù)字型stringM..stringNCar101..car208Car101,car102,…,car208日期(星期)型dayM..dayNMON..FRIMON,TUE,WED,THU,FRI月份型monthM..monthNOCT..JANOCT,NOV,DEC,JAN年份-月份型monthYearM..monthYearNOCT2001..JAN2002OCT2001,NOV2001,DEC2001,JAN2002基本集合的定義語(yǔ)法49

元素列表和屬性列表都是可選的。當(dāng)屬性列表不在集合定義中出現(xiàn)時(shí),這樣的集合往往只是為了將來(lái)在程序中作為一個(gè)循環(huán)變量來(lái)使用,或者作為構(gòu)造更復(fù)雜的派生集合的父集合使用(匹配問(wèn)題中的集合STUDENTS沒(méi)有屬性列表)。而當(dāng)元素列表不在基本集合的定義中出現(xiàn)時(shí),則必須在程序的數(shù)據(jù)段以賦值語(yǔ)句的方式直接給出元素列表。例如,前例中SAILCO公司決定四個(gè)季度的帆船生產(chǎn)量模型的集合段和數(shù)據(jù)段可以分別改為:SETS:QUARTERS:DEM,RP,OP,INV;!注意沒(méi)有給出集合的元素列表;ENDSETSDATA:QUARTERSDEM=140260375425;!注意LINGO按列賦值的特點(diǎn);ENDDATA基本集合的定義語(yǔ)法50派生集合的定義格式為(方括號(hào)“[]”中的內(nèi)容是可選項(xiàng),可以沒(méi)有):setname(parent_set_list)[/member_list/][:attribute_list];與基本集合的定義相比較多了一個(gè)parent_set_list(父集合列表)。父集合列表中的集合(如set1,set2,…,等)稱為派生集合setname的父集合,它們本身也可以是派生集合。當(dāng)元素列表(member_list)不在集合定義中出現(xiàn)時(shí),還可以在程序的數(shù)據(jù)段以賦值語(yǔ)句的方式給出元素列表;若在程序的數(shù)據(jù)段也不以賦值語(yǔ)句的方式給出元素列表,則認(rèn)為定義的是稠密集合,即父集合中所有元素的有序組合(笛卡兒積)都是setname的元素。當(dāng)元素列表在集合定義中出現(xiàn)時(shí),又有“元素列表法”(直接列出元素)和“元素過(guò)濾法”(利用過(guò)濾條件)兩種不同方式。派生集合的定義語(yǔ)法51集合的不同類型及其關(guān)系集合的使用小結(jié)集合派生集合稀疏集合稠密集合基本集合元素過(guò)濾法

直接列舉法

隱式列舉法

元素列表法52LINGO快速入門(mén)LINGO中的集模型的數(shù)據(jù)部分LINGO函數(shù)窗口菜單例子本節(jié)內(nèi)容53在處理模型的數(shù)據(jù)時(shí),需要為集指派一些成員并且在LINGO求解模型之前為集的某些屬性指定值。為此,LINGO為用戶提供了兩個(gè)可選部分:輸入集成員和數(shù)據(jù)的數(shù)據(jù)部分(DataSection)和為決策變量設(shè)置初始值的初始部分(InitSection)。模型的數(shù)據(jù)部分?jǐn)?shù)據(jù)部分提供了模型相對(duì)靜止部分和數(shù)據(jù)分離的可能性。顯然,這對(duì)模型的維護(hù)和維數(shù)的縮放非常便利。數(shù)據(jù)部分以關(guān)鍵字“data:”開(kāi)始,以關(guān)鍵字“enddata”結(jié)束。在這里,可以指定集成員、集的屬性。模型的數(shù)據(jù)部分54其語(yǔ)法如下:object_list=value_list;對(duì)象列(object_list)包含要指定值的屬性名、要設(shè)置集成員的集名,用逗號(hào)或空格隔開(kāi)。一個(gè)對(duì)象列中至多有一個(gè)集名,而屬性名可以有任意多。如果對(duì)象列中有多個(gè)屬性名,那么它們的類型必須一致。如果對(duì)象列中有一個(gè)集名,那么對(duì)象列中所有的屬性的類型就是這個(gè)集。數(shù)值列(value_list)包含要分配給對(duì)象列中的對(duì)象的值,用逗號(hào)或空格隔開(kāi)。注意屬性值的個(gè)數(shù)必須等于集成員的個(gè)數(shù)??聪旅娴睦?。例3.1sets:set1/A,B,C/:X,Y;endsetsdata:X=1,2,3;Y=4,5,6;enddata在集set1中定義了兩個(gè)屬性X和Y。X的三個(gè)值是1、2和3,Y的三個(gè)值是4、5和6。也可采用如下例子中的復(fù)合數(shù)據(jù)聲明(datastatement)實(shí)現(xiàn)同樣的功能。

模型的數(shù)據(jù)部分55例3.2sets:set1/A,B,C/:X,Y;endsetsdata:X,Y=142536;Enddata看到這個(gè)例子,可能會(huì)認(rèn)為X被指定了1、4和2三個(gè)值,因?yàn)樗鼈兪菙?shù)值列中前三個(gè),而正確的答案是1、2和3。假設(shè)對(duì)象列有n個(gè)對(duì)象,LINGO在為對(duì)象指定值時(shí),首先在n個(gè)對(duì)象的第1個(gè)索引處依次分配數(shù)值列中的前n個(gè)對(duì)象,然后在n個(gè)對(duì)象的第2個(gè)索引處依次分配數(shù)值列中緊接著的n個(gè)對(duì)象,……,以此類推。模型的數(shù)據(jù)部分56參數(shù)在數(shù)據(jù)部分也可以指定一些標(biāo)量變量(scalarvariables)。當(dāng)一個(gè)標(biāo)量變量在數(shù)據(jù)部分確定時(shí),稱之為參數(shù)??匆焕?,假設(shè)模型中用利率8.5%作為一個(gè)參數(shù),就可以象下面一樣輸入一個(gè)利率作為參數(shù)。例3.3data:interest_rate=.085;enddata也可以同時(shí)指定多個(gè)參數(shù)。例3.4data:interest_rate,inflation_rate=.085.03;enddata模型的數(shù)據(jù)部分57實(shí)時(shí)數(shù)據(jù)處理在某些情況,對(duì)于模型中的某些數(shù)據(jù)并不是定值。譬如模型中有一個(gè)通貨膨脹率的參數(shù),我們想在2%至6%范圍內(nèi),對(duì)不同的值求解模型,來(lái)觀察模型的結(jié)果對(duì)通貨膨脹的依賴有多么敏感。我們把這種情況稱為實(shí)時(shí)數(shù)據(jù)處理(whatifanalysis)。LINGO有一個(gè)特征可方便地做到這件事。在本該放數(shù)的地方輸入一個(gè)問(wèn)號(hào)(?)。例3.5data:

interest_rate,inflation_rate=.085?;enddata模型的數(shù)據(jù)部分58每一次求解模型時(shí),LINGO都會(huì)提示為參數(shù)inflation_rate輸入一個(gè)值。在WINDOWS操作系統(tǒng)下,將會(huì)接收到一個(gè)類似下面的對(duì)話框:直接輸入一個(gè)值再點(diǎn)擊OK按鈕,LINGO就會(huì)把輸入的值指定給inflation_rate,然后繼續(xù)求解模型。除了參數(shù)之外,也可以實(shí)時(shí)輸入集的屬性值,但不允許實(shí)時(shí)輸入集成員名。模型的數(shù)據(jù)部分59指定屬性為一個(gè)值可以在數(shù)據(jù)聲明的右邊輸入一個(gè)值來(lái)把所有的成員的該屬性指定為一個(gè)值。看下面的例子。例3.6sets:days/MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata:needs=20;enddataLINGO將用20指定days集的所有成員的needs屬性。對(duì)于多個(gè)屬性的情形,見(jiàn)下例。例3.7sets:days/MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata:needscost=20100;enddata

模型的數(shù)據(jù)部分60數(shù)據(jù)部分的未知數(shù)值有時(shí)只想為一個(gè)集的部分成員的某個(gè)屬性指定值,而讓其余成員的該屬性保持未知,以便讓LINGO去求出它們的最優(yōu)值。在數(shù)據(jù)聲明中輸入兩個(gè)相連的逗號(hào)表示該位置對(duì)應(yīng)的集成員的屬性值未知。兩個(gè)逗號(hào)間可以有空格。例3.8sets:years/1..5/:capacity;endsetsdata:capacity=,34,20,,;enddata屬性capacity的第2個(gè)和第3個(gè)值分別為34和20,其余的未知。

模型的數(shù)據(jù)部分61模型的初始部分初始部分是LINGO提供的另一個(gè)可選部分。在初始部分中,可以輸入初始聲明(initializationstatement),和數(shù)據(jù)部分中的數(shù)據(jù)聲明相同。對(duì)實(shí)際問(wèn)題的建模時(shí),初始部分并不起到描述模型的作用,在初始部分輸入的值僅被LINGO求解器當(dāng)作初始點(diǎn)來(lái)用,并且僅僅對(duì)非線性模型有用。和數(shù)據(jù)部分指定變量的值不同,LINGO求解器可以自由改變初始部分初始化的變量的值。一個(gè)初始部分以“init:”開(kāi)始,以“endinit”結(jié)束。初始部分的初始聲明規(guī)則和數(shù)據(jù)部分的數(shù)據(jù)聲明規(guī)則相同。也就是說(shuō),我們可以在聲明的左邊同時(shí)初始化多個(gè)集屬性,可以把集屬性初始化為一個(gè)值,可以用問(wèn)號(hào)實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)處理,還可以用逗號(hào)指定未知數(shù)值。模型的數(shù)據(jù)部分62LINGO快速入門(mén)LINGO中的集模型的數(shù)據(jù)部分LINGO函數(shù)窗口菜單例子本節(jié)內(nèi)容63基本運(yùn)算符:包括算術(shù)運(yùn)算符、邏輯運(yùn)算符和關(guān)系運(yùn)算符數(shù)學(xué)函數(shù):三角函數(shù)和常規(guī)的數(shù)學(xué)函數(shù)金融函數(shù):LINGO提供的兩種金融函數(shù)概率函數(shù):LINGO提供了大量概率相關(guān)的函數(shù)變量界定函數(shù):這類函數(shù)用來(lái)定義變量的取值范圍集操作函數(shù):這類函數(shù)為對(duì)集的操作提供幫助集循環(huán)函數(shù):遍歷集的元素,執(zhí)行一定的操作的函數(shù)數(shù)據(jù)輸入輸出函數(shù):這類函數(shù)允許模型和外部數(shù)據(jù)源相聯(lián)系,進(jìn)行數(shù)據(jù)的輸入輸出輔助函數(shù):各種雜類函數(shù)LINGO函數(shù)64

4.1基本運(yùn)算符這些運(yùn)算符是非常基本的,甚至可以不認(rèn)為它們是一類函數(shù)。事實(shí)上,在LINGO中它們是非常重要的。4.1.1算術(shù)運(yùn)算符算術(shù)運(yùn)算符是針對(duì)數(shù)值進(jìn)行操作的。LINGO提供了5種二元運(yùn)算符:^乘方﹡乘/除﹢加﹣減LINGO唯一的一元算術(shù)運(yùn)算符是取反函數(shù)“﹣”。

這些運(yùn)算符的優(yōu)先級(jí)由高到底為:高﹣(取反)^

﹡/低﹢﹣運(yùn)算符的運(yùn)算次序?yàn)閺淖蟮接野磧?yōu)先級(jí)高低來(lái)執(zhí)行。運(yùn)算的次序可以用圓括號(hào)“()”來(lái)改變。例4.1算術(shù)運(yùn)算符示例。2﹣5/3,(2﹢4)/5等等。

LINGO函數(shù)654.1.2邏輯運(yùn)算符在LINGO中,邏輯運(yùn)算符主要用于集循環(huán)函數(shù)的條件表達(dá)式中,來(lái)控制在函數(shù)中哪些集成員被包含,哪些被排斥。在創(chuàng)建稀疏集時(shí)用在成員資格過(guò)濾器中。LINGO具有9種邏輯運(yùn)算符:#not#否定該操作數(shù)的邏輯值,#not#是一個(gè)一元運(yùn)算符#eq#若兩個(gè)運(yùn)算數(shù)相等,則為true;否則為flase#ne#若兩個(gè)運(yùn)算符不相等,則為true;否則為flase#gt#若左邊的運(yùn)算符嚴(yán)格大于右邊的運(yùn)算符,則為true;否則為flase#ge#若左邊的運(yùn)算符大于或等于右邊的運(yùn)算符,則為true;否則為flaseLINGO函數(shù)66

#lt#若左邊的運(yùn)算符嚴(yán)格小于右邊的運(yùn)算符,則為true;否則為flase#le#若左邊的運(yùn)算符小于或等于右邊的運(yùn)算符,則為true;否則為flase#and#僅當(dāng)兩個(gè)參數(shù)都為true時(shí),結(jié)果為true;否則為flase#or#僅當(dāng)兩個(gè)參數(shù)都為false時(shí),結(jié)果為false;否則為true這些運(yùn)算符的優(yōu)先級(jí)由高到低為:高#not##eq##ne##gt##ge##lt##le#低#and##or#例4.2邏輯運(yùn)算符示例2#gt#3#and#4#gt#2,其結(jié)果為假(0)。LINGO函數(shù)67

4.1.3關(guān)系運(yùn)算符在LINGO中,關(guān)系運(yùn)算符主要是被用在模型中,來(lái)指定一個(gè)表達(dá)式的左邊是否等于、小于等于、或者大于等于右邊,形成模型的一個(gè)約束條件。關(guān)系運(yùn)算符與邏輯運(yùn)算符#eq#、#le#、#ge#截然不同,前者是模型中該關(guān)系運(yùn)算符所指定關(guān)系的為真描述,而后者僅僅判斷一個(gè)該關(guān)系是否被滿足:滿足為真,不滿足為假。LINGO函數(shù)68

LINGO有三種關(guān)系運(yùn)算符:“=”、“<=”和“>=”。LINGO中還能用“<”表示小于等于關(guān)系,“>”表示大于等于關(guān)系。LINGO并不支持嚴(yán)格小于和嚴(yán)格大于關(guān)系運(yùn)算符。然而,如果需要嚴(yán)格小于和嚴(yán)格大于關(guān)系,比如讓A嚴(yán)格小于B:A<B,那么可以把它變成如下的小于等于表達(dá)式:A+ε<=B,這里ε是一個(gè)小的正數(shù),它的值依賴于模型中A小于B多少才算不等。

下面給出以上三類操作符的優(yōu)先級(jí):高#not#﹣(取反)^

﹡/﹢﹣#eq##ne##gt##ge##lt##le##and##or#低<==>=LINGO函數(shù)69

4.2數(shù)學(xué)函數(shù)LINGO提供了大量的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù):@abs(x)返回x的絕對(duì)值@sin(x)返回x的正弦值,x采用弧度制@cos(x)返回x的余弦值@tan(x)返回x的正切值@exp(x)返回常數(shù)e的x次方@log(x)返回x的自然對(duì)數(shù)@lgm(x)返回x的gamma函數(shù)的自然對(duì)數(shù)@sign(x)如果x<0返回-1;否則,返回1@floor(x)返回x的整數(shù)部分。當(dāng)x>=0時(shí),返回不超過(guò)x的最大整數(shù);當(dāng)x<0時(shí),返回不低于x的最大整數(shù)。@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值LINGO函數(shù)70

4.3變量界定函數(shù)變量界定函數(shù)實(shí)現(xiàn)對(duì)變量取值范圍的附加限制,共4種:@bin(x)限制x為0或1@bnd(L,x,U)限制L≤x≤U@free(x)取消對(duì)變量x的默認(rèn)下界為0的限制,即x可以取任意實(shí)數(shù)@gin(x)限制x為整數(shù)在默認(rèn)情況下,LINGO規(guī)定變量是非負(fù)的,也就是說(shuō)下界為0,上界為+∞。@free取消了默認(rèn)的下界為0的限制,使變量也可以取負(fù)值。@bnd用于設(shè)定一個(gè)變量的上下界,它也可以取消默認(rèn)下界為0的約束。LINGO函數(shù)71例4.3給定一個(gè)直角三角形,求包含該三角形的最小正方形。解:如圖所示。ABCDDAEabx求最小的正方形就相當(dāng)于求如下的最優(yōu)化問(wèn)題:LINGO代碼如下:model:sets:object/1..3/:f;endsetsdata:a,b=3,4;!兩個(gè)直角邊長(zhǎng),修改很方便;enddataf(1)=a*@sin(x);f(2)=b*@cos(x);f(3)=a*@cos(x)+b*@sin(x);min=@smax(f(1),f(2),f(3));@bnd(0,x,1.57);endLINGO函數(shù)724.3金融函數(shù)目前LINGO提供了兩個(gè)金融函數(shù)。1.@fpa(I,n)返回如下情形的凈現(xiàn)值:?jiǎn)挝粫r(shí)段利率為I,連續(xù)n個(gè)時(shí)段支付,每個(gè)時(shí)段支付單位費(fèi)用。若每個(gè)時(shí)段支付x單位的費(fèi)用,則凈現(xiàn)值可用x乘以@fpa(I,n)算得。@fpa的計(jì)算公式為。凈現(xiàn)值就是在一定時(shí)期內(nèi)為了獲得一定收益在該時(shí)期初所支付的實(shí)際費(fèi)用。例4.4貸款買房問(wèn)題貸款金額50000元,貸款年利率5.31%,采取分期付款方式(每年年末還固定金額,直至還清)。問(wèn)擬貸款10年,每年需償還多少元?LINGO代碼如下:50000=x*@fpa(.0531,10);答案是x=6573.069元。2.@fpl(I,n)返回如下情形的凈現(xiàn)值:?jiǎn)挝粫r(shí)段利率為I,第n個(gè)時(shí)段支付單位費(fèi)用。@fpl(I,n)的計(jì)算公式為細(xì)心的讀者可以發(fā)現(xiàn)這兩個(gè)函數(shù)間的關(guān)系:LINGO函數(shù)734.6集操作函數(shù)LINGO提供了幾個(gè)函數(shù)幫助處理集。1.@in(set_name,primitive_index_1[,primitive_index_2,…])如果元素在指定集中,返回1;否則返回0。例4.7全集為I,B是I的一個(gè)子集,C是B的補(bǔ)集。sets:I/x1..x4/;B(I)/x2/;C(I)|#not#@in(B,&1):;Endsets2.@index([set_name,]primitive_set_element)該函數(shù)返回在集set_name中原始集成員primitive_set_element的索引。如果set_name被忽略,那么LINGO將返回與primitive_set_element匹配的第一個(gè)原始集成員的索引。如果找不到,則產(chǎn)生一個(gè)錯(cuò)誤。LINGO函數(shù)74例4.8如何確定集成員(B,Y)屬于派生集S3。sets:S1/ABC/;S2/XYZ/;S3(S1,S2)/AX,AZ,BY,CX/;endsetsX=@in(S3,@index(S1,B),@index(S2,Y));看下面的例子,表明有時(shí)為@index指定集是必要的。例4.9sets:girls/debble,sue,alice/;boys/bob,joe,sue,fred/;endsetsI1=@index(sue);I2=@index(boys,sue);I1的值是2,I2的值是3。我們建議在使用@index函數(shù)時(shí)最好指定集。LINGO函數(shù)753.@size(set_name)該函數(shù)返回集set_name的成員個(gè)數(shù)。在模型中明確給出集大小時(shí)最好使用該函數(shù)。它的使用使模型更加數(shù)據(jù)中立,集大小改變時(shí)也更易維護(hù)。

LINGO函數(shù)76

4.7集循環(huán)函數(shù)集循環(huán)函數(shù)遍歷整個(gè)集進(jìn)行操作。其語(yǔ)法為@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);@function相應(yīng)于下面羅列的四個(gè)集循環(huán)函數(shù)之一;setname是要遍歷的集;set_index_list是集索引列表;conditional_qualifier是用來(lái)限制集循環(huán)函數(shù)的范圍,當(dāng)集循環(huán)函數(shù)遍歷集的每個(gè)成員時(shí),LINGO都要對(duì)conditional_qualifier進(jìn)行評(píng)價(jià),若結(jié)果為真,則對(duì)該成員執(zhí)行@function操作,否則跳過(guò),繼續(xù)執(zhí)行下一次循環(huán)。expression_list是被應(yīng)用到每個(gè)集成員的表達(dá)式列表,當(dāng)用的是@for函數(shù)時(shí),expression_list可以包含多個(gè)表達(dá)式,其間用逗號(hào)隔開(kāi)。這些表達(dá)式將被作為約束加到模型中。當(dāng)使用其余的三個(gè)集循環(huán)函數(shù)時(shí),expression_list只能有一個(gè)表達(dá)式。如果省略set_index_list,那么在expression_list中引用的所有屬性的類型都是setname集。LINGO函數(shù)771.@for該函數(shù)用來(lái)產(chǎn)生對(duì)集成員的約束?;诮UZ(yǔ)言的標(biāo)量需要顯式輸入每個(gè)約束,不過(guò)@for函數(shù)允許只輸入一個(gè)約束,然后LINGO自動(dòng)產(chǎn)生每個(gè)集成員的約束。例4.10產(chǎn)生序列{1,4,9,16,25}model:sets:number/1..5/:x;endsets@for(number(I):x(I)=I^2);endLINGO函數(shù)78

2.@sum該函數(shù)返回遍歷指定的集成員的一個(gè)表達(dá)式的和。例4.11求向量[5,1,3,4,6,10]前5個(gè)數(shù)的和。model:data:N=6;enddatasets:number/1..N/:x;endsetsdata:x=5134610;enddatas=@sum(number(I)|I#le#5:x);end

LINGO函數(shù)793.@min和@max返回指定的集成員的一個(gè)表達(dá)式的最小值或最大值。例4.12求向量[5,1,3,4,6,10]前5個(gè)數(shù)的最小值,后3個(gè)數(shù)的最大值。model:data:N=6;enddatasets:number/1..N/:x;endsetsdata:x=5134610;enddataminv=@min(number(I)|I#le#5:x);maxv=@max(number(I)|I#ge#N-2:x);endLINGO函數(shù)80下面看一個(gè)稍微復(fù)雜一點(diǎn)兒的例子。例4.13職員時(shí)序安排模型一項(xiàng)工作一周7天都需要有人(比如護(hù)士工作),每天(周一至周日)所需的最少職員數(shù)為20、16、13、16、19、14和12,并要求每個(gè)職員一周連續(xù)工作5天,試求每周所需最少職員數(shù),并給出安排。注意這里我們考慮穩(wěn)定后的情況。model:sets:days/mon..sun/:required,start;endsetsdata:!每天所需的最少職員數(shù);required=20161316191412;enddata!最小化每周所需職員數(shù);min=@sum(days:start);@for(days(J):@sum(days(I)|I#le#5:start(@wrap(J+I+2,7)))>=required(J));endLINGO函數(shù)81計(jì)算的部分結(jié)果為Globaloptimalsolutionfoundatiteration:0Objectivevalue:22.00000

VariableValueReducedCostREQUIRED(MON)20.000000.000000REQUIRED(TUE)16.000000.000000REQUIRED(WED)13.000000.000000REQUIRED(THU)16.000000.000000REQUIRED(FRI)19.000000.000000REQUIRED(SAT)14.000000.000000REQUIRED(SUN)12.000000.000000START(MON)8.0000000.000000START(TUE)2.0000000.000000START(WED)0.0000000.3333333START(THU)6.0000000.000000START(FRI)3.0000000.000000START(SAT)3.0000000.000000START(SUN)0.0000000.000000從而解決方案是:每周最少需要22個(gè)職員,周一安排8人,周二安排2人,周三無(wú)需安排人,周四安排6人,周五和周六都安排3人,周日無(wú)需安排人。LINGO函數(shù)823.@ole函數(shù)@OLE是從EXCEL中引入或輸出數(shù)據(jù)的接口函數(shù),它是基于傳輸?shù)腛LE技術(shù)。OLE傳輸直接在內(nèi)存中傳輸數(shù)據(jù),并不借助于中間文件。當(dāng)使用@OLE時(shí),LINGO先裝載EXCEL,再通知EXCEL裝載指定的電子數(shù)據(jù)表,最后從電子數(shù)據(jù)表中獲得Ranges。為了使用OLE函數(shù),必須有EXCEL5及其以上版本。OLE函數(shù)可在數(shù)據(jù)部分和初始部分引入數(shù)據(jù)。@OLE可以同時(shí)讀集成員和集屬性,集成員最好用文本格式,集屬性最好用數(shù)值格式。原始集每個(gè)集成員需要一個(gè)單元(cell),而對(duì)于n元的派生集每個(gè)集成員需要n個(gè)單元,這里第一行的n個(gè)單元對(duì)應(yīng)派生集的第一個(gè)集成員,第二行的n個(gè)單元對(duì)應(yīng)派生集的第二個(gè)集成員,依此類推。@OLE只能讀一維或二維的Ranges(在單個(gè)的EXCEL工作表(sheet)中),但不能讀間斷的或三維的Ranges。Ranges是自左而右、自上而下來(lái)讀。

LINGO函數(shù)83例4.16sets:PRODUCT;!產(chǎn)品;MACHINE;!機(jī)器;WEEK;!周;ALLOWED(PRODUCT,MACHINE,WEEK):x,y;!允許組合及屬性;endsetsdata:rate=0.01;PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;enddata代替在代碼文本的數(shù)據(jù)部分顯式輸入形式,我們把相關(guān)數(shù)據(jù)全部放在如下電子數(shù)據(jù)表中來(lái)輸入。下面是D:\IMPORT.XLS的圖表。LINGO函數(shù)84除了輸入數(shù)據(jù)之外,我們也必須定義Ranges名:PRODUCT,MACHINE,WEEK,ALLOWED,x,y.明確的,我們需要定義如下的Ranges名:NameRangePRODUCTB3:B4MACHINEC3:C4WEEKD3:D5ALLOWEDB8:D10XF8:F10YG8:G10rateC13為了在EXCEL中定義Ranges名:①按鼠標(biāo)左鍵拖曳選擇Range,②釋放鼠標(biāo)按鈕,③選擇“插入|名稱|定義”,④輸入希望的名字,⑤點(diǎn)擊“確定”按鈕。LINGO函數(shù)85我們?cè)谀P偷臄?shù)據(jù)部分用如下代碼從EXECL中引入數(shù)據(jù):PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;等價(jià)的描述為PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS',PRODUCT,MACHINE,WEEK,ALLOWED,x,y);@OLE('D:\IMPORT.XLS',rate)=rate;這一等價(jià)描述使得變量名和Ranges不同亦可。

LINGO函數(shù)86

4.9輔助函數(shù)1.@if(logical_condition,true_result,false_result)@if函數(shù)將評(píng)價(jià)一個(gè)邏輯表達(dá)式logical_condition,如果為真,返回true_result,否則返回false_result。例4.18求解最優(yōu)化問(wèn)題LINGO函數(shù)87其LINGO代碼如下:model:min=fx+fy;fx=@if(x#gt#0,100,0)+2*x;fy=@if(y#gt#0,60,0)+3*y;x+y>=30;end

LINGO函數(shù)882.@warn(’text’,logical_condition)如果邏輯條件logical_condition為真,則產(chǎn)生一個(gè)內(nèi)容為’text’的信息框。例4.19示例。model:x=1;@warn('x是正數(shù)',x#gt#0);end

LINGO函數(shù)89LINGO快速入門(mén)LINGO中的集模型的數(shù)據(jù)部分LINGO函數(shù)窗口菜單例子本節(jié)內(nèi)容905.1文件菜單(FileMenu)5.2編輯菜單(EditMenu)

5.3LINGO菜單1.求解模型(Slove)從LINGO菜單中選用“求解”命令、單擊“Slove”按鈕或按Ctrl+S組合鍵可以將當(dāng)前模型送入內(nèi)存求解。2.求解結(jié)果...(Solution...)從LINGO菜單中選用“Solution...”命令、單擊“Solution...”按鈕或直接按Ctrl+O組合鍵可以打開(kāi)求解結(jié)果的對(duì)話框。這里可以指定查看當(dāng)前內(nèi)存中求解結(jié)果的那些內(nèi)容。3.查看...(Look...)從LINGO菜單中選用“Look...”命令或直接按Ctrl+L組合鍵可以查看全部的或選中的模型文本內(nèi)容。LINGOWINDOWS命令LINGOWINDOWS命令914.靈敏性分析(Range,Ctrl+R)用該命令產(chǎn)生當(dāng)前模型的靈敏性分析報(bào)告:研究當(dāng)目標(biāo)函數(shù)的費(fèi)用系數(shù)和約束右端項(xiàng)在什么范圍(此時(shí)假定其它系數(shù)不變)時(shí),最優(yōu)基保持不變。靈敏性分析是在求解模型時(shí)作出的,因此在求解模型時(shí)靈敏性分析是激活狀態(tài),但是默認(rèn)是不激活的。為了激活靈敏性分析,運(yùn)行LINGO|Options…,選擇GeneralSolverTab,在DualComputations列表框中,選擇PricesandRanges選項(xiàng)。靈敏性分析耗費(fèi)相當(dāng)多的求解時(shí)間,因此當(dāng)速度很關(guān)鍵時(shí),就沒(méi)有必要激活它。LINGOWINDOWS命令92狀態(tài)窗口(LINDOSolverStatus)93當(dāng)前狀態(tài):已達(dá)最優(yōu)解迭代次數(shù):18次約束不滿足的“量”(不是“約束個(gè)數(shù)”):0當(dāng)前的目標(biāo)值:94最好的整數(shù)解:94整數(shù)規(guī)劃的界:93.5分枝數(shù):1所用時(shí)間:0.00秒(太快了,還不到0.005秒)刷新本界面的間隔:1(秒)選項(xiàng)設(shè)置94選項(xiàng)設(shè)置95

Preprocess:預(yù)處理(生成割平面);

PreferredBranch:優(yōu)先的分枝方式:“Default”(缺省方式)、“Up”(向上取整優(yōu)先)、“Down”(向下取整優(yōu)先);

IPOptimalityTol:IP最優(yōu)值允許的誤差上限(一個(gè)百分?jǐn)?shù),如5%即0.05);

IPObjectiveHurdle:IP目標(biāo)函數(shù)的籬笆值,即只尋找比這個(gè)值更優(yōu)最優(yōu)解(如當(dāng)知道當(dāng)前模型的某個(gè)整數(shù)可行解時(shí),就可以設(shè)置這個(gè)值);

IPVarFixingTol:固定一個(gè)整數(shù)變量取值所依據(jù)的一個(gè)上限(如果一個(gè)整數(shù)變量的判別數(shù)(REDUCEDCOST)的值很大,超過(guò)該上限,則以后求解中把該整數(shù)變量固定下來(lái))。NonzeroLimit:非零系數(shù)的個(gè)數(shù)上限;IterationL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論