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

下載本文檔

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

文檔簡介

第2講LINGO軟件與優(yōu)化建模LINGO快速入門LINGO中的集模型的數(shù)據(jù)部分LINGO函數(shù)窗口菜單例子本講內(nèi)容2美國芝加哥(Chicago)大學(xué)的LinusSchrage教授于1980年前后開發(fā),后來成立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é)生版、高級版、超級版、工業(yè)版、擴展版…(求解問題規(guī)模和選件不同)LINDO公司軟件產(chǎn)品簡要介紹3LINGO模型的優(yōu)點包含了LINDO的全部功能提供了靈活的編程語言(矩陣生成器)LINGO模型的構(gòu)成:4個段目標(biāo)與約束段集合段(SETSENDSETS)數(shù)據(jù)段(DATAENDDATA)初始段(INITENDINIT)LINGO軟件簡介4

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

ILPIQPINLP

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

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

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

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

向工地的運送量為

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

A2

A3

B1

B2

C1

C2

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

假設(shè)P經(jīng)過城市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)行駛路線是很容易得到的(實際上,此例中S到Ai(i=1,2,3)只有唯一的道路)分析42STA1

A2

A3

B1

B2

C1

C2

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

(i=1,2或3),Ai

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

A2

A3

B1

B2

C1

C2

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

A2

A3

B1

B2

C1

C2

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

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

直接列舉法

隱式列舉法

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

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

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

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

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

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

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

﹡/低﹢﹣運算符的運算次序為從左到右按優(yōu)先級高低來執(zhí)行。運算的次序可以用圓括號“()”來改變。例4.1算術(shù)運算符示例。2﹣5/3,(2﹢4)/5等等。

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

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

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

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

下面給出以上三類操作符的優(yōu)先級:高#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的絕對值@sin(x)返回x的正弦值,x采用弧度制@cos(x)返回x的余弦值@tan(x)返回x的正切值@exp(x)返回常數(shù)e的x次方@log(x)返回x的自然對數(shù)@lgm(x)返回x的gamma函數(shù)的自然對數(shù)@sign(x)如果x<0返回-1;否則,返回1@floor(x)返回x的整數(shù)部分。當(dāng)x>=0時,返回不超過x的最大整數(shù);當(dāng)x<0時,返回不低于x的最大整數(shù)。@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值LINGO函數(shù)70

4.3變量界定函數(shù)變量界定函數(shù)實現(xiàn)對變量取值范圍的附加限制,共4種:@bin(x)限制x為0或1@bnd(L,x,U)限制L≤x≤U@free(x)取消對變量x的默認(rèn)下界為0的限制,即x可以取任意實數(shù)@gin(x)限制x為整數(shù)在默認(rèn)情況下,LINGO規(guī)定變量是非負(fù)的,也就是說下界為0,上界為+∞。@free取消了默認(rèn)的下界為0的限制,使變量也可以取負(fù)值。@bnd用于設(shè)定一個變量的上下界,它也可以取消默認(rèn)下界為0的約束。LINGO函數(shù)71例4.3給定一個直角三角形,求包含該三角形的最小正方形。解:如圖所示。ABCDDAEabx求最小的正方形就相當(dāng)于求如下的最優(yōu)化問題:LINGO代碼如下:model:sets:object/1..3/:f;endsetsdata:a,b=3,4;!兩個直角邊長,修改很方便;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提供了兩個金融函數(shù)。1.@fpa(I,n)返回如下情形的凈現(xiàn)值:單位時段利率為I,連續(xù)n個時段支付,每個時段支付單位費用。若每個時段支付x單位的費用,則凈現(xiàn)值可用x乘以@fpa(I,n)算得。@fpa的計算公式為。凈現(xiàn)值就是在一定時期內(nèi)為了獲得一定收益在該時期初所支付的實際費用。例4.4貸款買房問題貸款金額50000元,貸款年利率5.31%,采取分期付款方式(每年年末還固定金額,直至還清)。問擬貸款10年,每年需償還多少元?LINGO代碼如下:50000=x*@fpa(.0531,10);答案是x=6573.069元。2.@fpl(I,n)返回如下情形的凈現(xiàn)值:單位時段利率為I,第n個時段支付單位費用。@fpl(I,n)的計算公式為細心的讀者可以發(fā)現(xiàn)這兩個函數(shù)間的關(guān)系:LINGO函數(shù)734.6集操作函數(shù)LINGO提供了幾個函數(shù)幫助處理集。1.@in(set_name,primitive_index_1[,primitive_index_2,…])如果元素在指定集中,返回1;否則返回0。例4.7全集為I,B是I的一個子集,C是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匹配的第一個原始集成員的索引。如果找不到,則產(chǎn)生一個錯誤。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));看下面的例子,表明有時為@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ù)時最好指定集。LINGO函數(shù)753.@size(set_name)該函數(shù)返回集set_name的成員個數(shù)。在模型中明確給出集大小時最好使用該函數(shù)。它的使用使模型更加數(shù)據(jù)中立,集大小改變時也更易維護。

LINGO函數(shù)76

4.7集循環(huán)函數(shù)集循環(huán)函數(shù)遍歷整個集進行操作。其語法為@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);@function相應(yīng)于下面羅列的四個集循環(huán)函數(shù)之一;setname是要遍歷的集;set_index_list是集索引列表;conditional_qualifier是用來限制集循環(huán)函數(shù)的范圍,當(dāng)集循環(huán)函數(shù)遍歷集的每個成員時,LINGO都要對conditional_qualifier進行評價,若結(jié)果為真,則對該成員執(zhí)行@function操作,否則跳過,繼續(xù)執(zhí)行下一次循環(huán)。expression_list是被應(yīng)用到每個集成員的表達式列表,當(dāng)用的是@for函數(shù)時,expression_list可以包含多個表達式,其間用逗號隔開。這些表達式將被作為約束加到模型中。當(dāng)使用其余的三個集循環(huán)函數(shù)時,expression_list只能有一個表達式。如果省略set_index_list,那么在expression_list中引用的所有屬性的類型都是setname集。LINGO函數(shù)771.@for該函數(shù)用來產(chǎn)生對集成員的約束。基于建模語言的標(biāo)量需要顯式輸入每個約束,不過@for函數(shù)允許只輸入一個約束,然后LINGO自動產(chǎn)生每個集成員的約束。例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ù)返回遍歷指定的集成員的一個表達式的和。例4.11求向量[5,1,3,4,6,10]前5個數(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返回指定的集成員的一個表達式的最小值或最大值。例4.12求向量[5,1,3,4,6,10]前5個數(shù)的最小值,后3個數(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下面看一個稍微復(fù)雜一點兒的例子。例4.13職員時序安排模型一項工作一周7天都需要有人(比如護士工作),每天(周一至周日)所需的最少職員數(shù)為20、16、13、16、19、14和12,并要求每個職員一周連續(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計算的部分結(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個職員,周一安排8人,周二安排2人,周三無需安排人,周四安排6人,周五和周六都安排3人,周日無需安排人。LINGO函數(shù)823.@ole函數(shù)@OLE是從EXCEL中引入或輸出數(shù)據(jù)的接口函數(shù),它是基于傳輸?shù)腛LE技術(shù)。OLE傳輸直接在內(nèi)存中傳輸數(shù)據(jù),并不借助于中間文件。當(dāng)使用@OLE時,LINGO先裝載EXCEL,再通知EXCEL裝載指定的電子數(shù)據(jù)表,最后從電子數(shù)據(jù)表中獲得Ranges。為了使用OLE函數(shù),必須有EXCEL5及其以上版本。OLE函數(shù)可在數(shù)據(jù)部分和初始部分引入數(shù)據(jù)。@OLE可以同時讀集成員和集屬性,集成員最好用文本格式,集屬性最好用數(shù)值格式。原始集每個集成員需要一個單元(cell),而對于n元的派生集每個集成員需要n個單元,這里第一行的n個單元對應(yīng)派生集的第一個集成員,第二行的n個單元對應(yīng)派生集的第二個集成員,依此類推。@OLE只能讀一維或二維的Ranges(在單個的EXCEL工作表(sheet)中),但不能讀間斷的或三維的Ranges。Ranges是自左而右、自上而下來讀。

LINGO函數(shù)83例4.16sets:PRODUCT;!產(chǎn)品;MACHINE;!機器;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ù)表中來輸入。下面是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)按鈕,③選擇“插入|名稱|定義”,④輸入希望的名字,⑤點擊“確定”按鈕。LINGO函數(shù)85我們在模型的數(shù)據(jù)部分用如下代碼從EXECL中引入數(shù)據(jù):PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;等價的描述為PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS',PRODUCT,MACHINE,WEEK,ALLOWED,x,y);@OLE('D:\IMPORT.XLS',rate)=rate;這一等價描述使得變量名和Ranges不同亦可。

LINGO函數(shù)86

4.9輔助函數(shù)1.@if(logical_condition,true_result,false_result)@if函數(shù)將評價一個邏輯表達式logical_condition,如果為真,返回true_result,否則返回false_result。例4.18求解最優(yōu)化問題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)生一個內(nèi)容為’text’的信息框。例4.19示例。model:x=1;@warn('x是正數(shù)',x#gt#0);end

LINGO函數(shù)89LINGO快速入門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組合鍵可以打開求解結(jié)果的對話框。這里可以指定查看當(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)前模型的靈敏性分析報告:研究當(dāng)目標(biāo)函數(shù)的費用系數(shù)和約束右端項在什么范圍(此時假定其它系數(shù)不變)時,最優(yōu)基保持不變。靈敏性分析是在求解模型時作出的,因此在求解模型時靈敏性分析是激活狀態(tài),但是默認(rèn)是不激活的。為了激活靈敏性分析,運行LINGO|Options…,選擇GeneralSolverTab,在DualComputations列表框中,選擇PricesandRanges選項。靈敏性分析耗費相當(dāng)多的求解時間,因此當(dāng)速度很關(guān)鍵時,就沒有必要激活它。LINGOWINDOWS命令92狀態(tài)窗口(LINDOSolverStatus)93當(dāng)前狀態(tài):已達最優(yōu)解迭代次數(shù):18次約束不滿足的“量”(不是“約束個數(shù)”):0當(dāng)前的目標(biāo)值:94最好的整數(shù)解:94整數(shù)規(guī)劃的界:93.5分枝數(shù):1所用時間:0.00秒(太快了,還不到0.005秒)刷新本界面的間隔:1(秒)選項設(shè)置94選項設(shè)置95

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論