




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、LINGO軟件的基本使用方法,內容提要,LINGO入門 2.在LINGO中使用集合 3. 運算符和函數 4. LINGO的主要菜單命令 5. LINGO命令窗口,1. LINGO入門,LINGO入門 2.在LINGO中使用集合 3. 運算符和函數 4. LINGO的主要菜單命令 5. LINGO命令窗口,安裝文件20M多一點,需要接受安裝協議、選擇安裝目錄(缺省C:LINGO9)。,LINGO軟件的安裝,安裝過程: 與LINDO for Windows類似.,安裝完成前,在出現的對話框(如圖)中選擇缺省的建模(即編程)語言,系統(tǒng)推薦的是采用LINGO。安裝后可通過“LINGO|Options|
2、File Format”命令修改缺省的建模(即編程)語言。,第一次運行時提示輸入授權密碼,如圖:,LINGO軟件的主要特色,兩種命令模式,Windows模式: 通過下拉式菜單命令驅動LINGO運行(多數菜單命令有快捷鍵,常用的菜單命令有快捷按鈕),圖形界面,使用方便;,命令行 模式:僅在命令窗口(Command Window)下操作,通過輸入行命令驅動LINGO運行 。,(這里主要介紹這種模式),從LINDO 到 LINGO,LINGO 9.0功能增強,性能穩(wěn)定,解答結果可靠。與LINDO相比,LINGO 軟件主要具有兩大優(yōu)點:,內置建模語言,允許以簡練、直觀的方式描述較大規(guī)模的優(yōu)化問題,所需
3、的數據可以以一定格式保存在獨立的文件中。,除具有LINDO的全部功能外,還可用于求解非線性規(guī)劃問題,包括非線性整數規(guī)劃問題;,在LINGO中使用LINDO模型,LINGO的界面,LINGO軟件的主窗口(用戶界面),所有其他窗口都在這個窗口之內。,模型窗口(Model Window),用于輸入LINGO優(yōu)化模型(即LINGO程序)。,狀態(tài)行(最左邊顯示“Ready”,表示 “準備就緒”),當前時間,當前光標的位置,LINGO的文件類型,.LG4:LINGO格式的模型文件,保存了模型窗口中所能夠看到的所有文本和其他對象及其格式信息; .LNG:文本格式的模型文件,不保存模型中的格式信息(如字體、顏
4、色、嵌入對象等); .LDT:LINGO數據文件; .LTF:LINGO命令腳本文件; .LGR:LINGO報告文件; .LTX: LINDO格式的模型文件; .MPS:示MPS(數學規(guī)劃系統(tǒng))格式的模型文件。,除“LG4”文件外,另外幾種格式的文件都是普通的文本文件,可以用任何文本編輯器打開和編輯。,在LINGO中使用LINDO模型, 選擇菜單命令“File|Open(F3)”,可以看到 “打開文件”對話框。 (如圖),在LINGO中可以直接使用LINDO語法編寫的優(yōu)化模型(即優(yōu)化程序)。作為一個最簡單的例子,在名為EXAM0201.LTX的模型文件中保存了一個LINDO模型,我們現在看看如
5、何用LINGO把它打開。,在LINGO中使用LINDO模型, 打開“EXAM0201.LTX”文件 (如下圖), 選擇“LINGO|Solve (Ctrl+S)”來運行這個程序(運行狀態(tài)窗口如右圖), 運行程序的LINGO報告窗口(如下圖),在LINGO中使用LINDO模型,注:LINGO不詢問是否進行敏感性分析,敏感性分析需要將來通過修改系統(tǒng)選項啟動敏感性分析后,再調用“REPORT|RANGE”菜單命令來實現。現在同樣可以把模型和結果報告保存在文件中。,運行狀態(tài)窗口,Variables(變量數量): 變量總數(Total)、 非線性變量數(Nonlinear)、 整數變量數(Integer
6、)。,Constraints(約束數量): 約束總數(Total)、 非線性約束個數(Nonlinear)。,Nonzeros(非零系數數量): 總數(Total)、 非線性項系數個數(Nonlinear)。,Generator Memory Used (K) (內存使用量),Elapsed Runtime (hh:mm:ss)(求解花費的時間),運行狀態(tài)窗口,求解器(求解程序)狀態(tài)框,當前模型的類型 :LP,QP,ILP,IQP,PILP, PIQP,NLP,INLP,PINLP (以I開頭表示IP,以PI開頭表示PIP),當前解的狀態(tài) : Global Optimum, Local Opt
7、imum, Feasible, Infeasible“(不可行), Unbounded“(無界), Interrupted“(中斷), Undetermined“(未確定),解的目標函數值,當前約束不滿足的總量(不是不滿足的約束的個數):實數(即使該值=0,當前解也可能不可行,因為這個量中沒有考慮用上下界命令形式給出的約束),目前為止的迭代次數,運行狀態(tài)窗口,擴展的求解器(求解程序)狀態(tài)框,使用的特殊求解程序 : B-and-B (分枝定界算法) Global (全局最優(yōu)求解程序) Multistart(用多個初始點求解的程序),目前為止找到的可行解的最佳目標函數值,目標函數值的界,特殊求解程
8、序當前運行步數: 分枝數(對B-and-B程序); 子問題數(對Global程序); 初始點數(對Multistart程序),有效步數,注:凡是可以從一個約束直接解出變量取值時,這個變量就不認為是決策變量而是固定變量,不列入統(tǒng)計中;只含有固定變量的約束也不列入約束統(tǒng)計中。,運行狀態(tài)窗口,LINGO早期版本對LINDO的兼容問題,在LINGO 9.0以前的版本中不能直接用File|Open命令打開LINDO模型,但由FILE | IMPORT LINDO FILE (F12)命令可以直接把LINDO的模型文件轉化成LINGO模型。運行后屏幕上會顯示一個標準的“打開文件”的對話框,打開EXAM02
9、01.LTX,在LINGO主窗口中又打開了命令窗口(Command Window)顯示原始文件,名為“exam0201”的模型窗口顯示的是等價的LINGO模型。當前光標位于命令窗口。,從LINDO模型到LINGO模型的實質性轉化工作主要在于以下幾個方面(這也是LINGO模型的最基本特征): 將目標函數的表示方式從“MAX”變成了“MAX=”; “ST”(SubjectTo)在LINGO模型中不需要,被刪除; 在系數與變量之間增加運算符“*”(即乘號不能省略); 每行(目標、約束和說明語句)后面增加一個分號“;”; 約束的名字被放到 “ ”中,不放在右半括號“)”前; LINGO中模型以“MOD
10、EL:”開始,以“END” 結束。對簡單的模型,這兩個語句也可以省略。,LINGO早期版本對LINDO的兼容問題,一個簡單的LINGO程序,例 直接用LINGO來解如下二次規(guī)劃問題:,輸入窗口如下:,程序語句輸入的備注:,LINGO總是根據“MAX=”或“MIN=”尋找目標函數,而除注釋語句和TITLE語句外的其他語句都是約束條件,因此語句的順序并不重要 。 限定變量取整數值的語句為“GIN(X1)”和“GIN(X2)”,不可以寫成“GIN(2)”,否則LINGO將把這個模型看成沒有整數變量。 LINGO中函數一律需要以“”開頭,其中整型變量函數(BIN、GIN)和上下界限定函數(FREE、S
11、UB、SLB)與LINDO中的命令類似。而且0/1變量函數是BIN函數。,輸出結果:,運行菜單命令“LINGO|Solve”,最優(yōu)整數解 X=(35,65),最大利潤=11077.5,輸出結果備注:,通過菜單 “WINDOW| Status Window”看到狀態(tài)窗口,可看到最佳目標值“Best Obj”與問題的上界“Obj Bound”已經是一樣的,當前解的最大利潤與這兩個值非常接近,是計算誤差引起的。如果采用全局最優(yōu)求解程序(后面介紹),可以驗證它就是全局最優(yōu)解。,LINGO是將它作為PINLP(純整數非線性規(guī)劃)來求解,因此找到的是局部最優(yōu)解。,一個簡單的LINGO程序,LINGO的基本
12、用法的幾點注意事項,LINGO中不區(qū)分大小寫字母;變量和行名可以超過8個字符,但不能超過32個字符,且必須以字母開頭。 用LINGO解優(yōu)化模型時已假定所有變量非負(除非用限定變量取值范圍的函數free或sub或slb另行說明)。 變量可以放在約束條件的右端(同時數字也可放在約束條件的左端)。但為了提高LINGO求解時的效率,應盡可能采用線性表達式定義目標和約束(如果可能的話)。 語句是組成LINGO模型的基本單位,每個語句都以分號結尾,編寫程序時應注意模型的可讀性。例如:一行只寫一個語句,按照語句之間的嵌套關系對語句安排適當的縮進,增強層次感。 以感嘆號開始的是說明語句(說明語句也需要以分號結
13、束))。,2.在LINGO中使用集合,LINGO入門 2.在LINGO中使用集合 3. 運算符和函數 4. LINGO的主要菜單命令 5. LINGO命令窗口 6.習題,集合的基本用法和LINGO模型的基本要素,理解LINGO建模語言最重要的是理解集合(Set)及其屬性(Attribute)的概念。,例 SAILCO公司需要決定下四個季度的帆船生產量。下四個季度的帆船需求量分別是40條,60條,75條,25條,這些需求必須按時滿足。每個季度正常的生產能力是40條帆船,每條船的生產費用為400美元。如果加班生產,每條船的生產費用為450美元。每個季度末,每條船的庫存費用為20美元。假定生產提前期
14、為0,初始庫存為10條船。如何安排生產可使總費用最?。?用DEM,RP,OP,INV分別表示需求量、正常生產的產量、加班生產的產量、庫存量,則DEM,RP,OP,INV對每個季度都應該有一個對應的值,也就說他們都應該是一個由4個元素組成的數組,其中DEM是已知的,而RP,OP,INV是未知數。,問題的模型(可以看出是LP模型 ),目標函數是所有費用的和,約束條件主要有兩個:,1)能力限制:,2)產品數量的平衡方程:,加上變量的非負約束,注:LINDO中沒有數組,只能對每個季度分別定義變量,如正常產量就要有RP1,RP2,RP3,RP4 4個變量等。寫起來就比較麻煩,尤其是更多(如1000個季度
15、)的時候。 記四個季度組成的集合QUARTERS=1,2,3,4,它們就是上面數組的下標集合,而數組DEM,RP,OP, INV對集合QUARTERS中的每個元素1,2,3,4分別對應于一個值。LINGO正是充分利用了這種數組及其下標的關系,引入了“集合”及其“屬性”的概念,把QUARTERS=1,2,3,4稱為集合,把DEM,RP,OP, INV稱為該集合的屬性(即定義在該集合上的屬性)。,集合及其屬性,集合元素及集合的屬性確定的所有變量,LINGO中定義集合及其屬性,LP模型在LINGO中的一個典型輸入方式,以“MODEL:”開始,以“END”結束,給出優(yōu)化目標和約束,目標函數的定義方式,
16、SUM(集合(下標):關于集合的屬性的表達式),對語句中冒號“:”后面的表達式,按照“:”前面的集合指定的下標(元素)進行求和。,本例中目標函數也可以等價地寫成 SUM(QUARTERS(i): 400*RP(i) +450*OP(i) +20*INV(i) ), “SUM”相當于求和符號“”, “QUARTERS(i)”相當于“iQUARTERS”的含義。 由于本例中目標函數對集合QUARTERS的所有元素(下標) 都要求和,所以可以將下標i省去。,約束的定義方式,循環(huán)函數 FOR(集合(下標):關于集合的屬性的約束關系式),對冒號“:”前面的集合的每個元素(下標),冒號“:”后面的約束關系
17、式都要成立,本例中,每個季度正常的生產能力是40條帆船,這正是語句“FOR(QUARTERS(I):RP(I)40);”的含義。 由于對所有元素(下標I),約束的形式是一樣的,所以也可以像上面定義目標函數時一樣,將下標i省去, 這個語句可以簡化成“FOR(QUARTERS:RP40);” 。,本例中,對于產品數量的平衡方程,由于下標i=1時的約束關系式與i=2,3,4時有所區(qū)別,所以不能省略下標“i”。實際上,i=1時要用到變量INV(0),但定義的屬性變量中INV不包含INV(0)(INV(0)=10是一個已知的)。 為了區(qū)別i=1和i=2,3,4,把i=1時的約束關系式單獨寫出,即“INV
18、(1)=10+RP(1)+OP(1)-DEM(1);” ; 而對i=2,3,4對應的約束,對下標集合的元素(下標i)增加了一個邏輯關系式“i#GT#1”(這個限制條件與集合之間有一個豎線“|”分開,稱為過濾條件)。 限制條件“i#GT#1”是一個邏輯表達式,意思就是i1;“#GT#”是邏輯運算符號,意思是“大于(Greater Than的字首字母縮寫)” 。,約束的定義方式,問題的求解:運行菜單命令“LINGO|Solve”,最小成本=78450,注:由于輸入中沒有給出行名,所以行名是系統(tǒng)自動按照行號1-9生成的。 選擇菜單命令“LINGO|Generate|Disply model(Ctrl
19、+G)”,可以得到展開形式的模型(如圖),可以看到完整的模型,也能確定行號(行號放在方括號“ ”中,且數字前面帶有下劃線“_”)。 最好在輸入模型時用戶主動設定約束的行名(即約束名),使程序清晰些。單一約束的行名設置方法就是將行名放在方括號“ ”中,置于約束之前。 后面將結合具體例子介紹在使用集合的情況下如何設置行名。,小結:LINGO模型最基本的組成要素,一般來說, LINGO中建立的優(yōu)化模型可以由五個部分組成,或稱為五“段”(SECTION):,(1)集合段(SETS):以“ SETS:” 開始, “ENDSETS”結束,定義必要的集合變量(SET)及其元素(MEMBER,含義類似于數組的
20、下標)和屬性(ATTRIBUTE,含義類似于數組)。,如上例中定義了集合quarters(含義是季節(jié)),它包含四個元素即四個季節(jié)指標(1,2,3,4),每個季節(jié)都有需求(DEM)、正常生產量(RP)、加班生產量(OP)、庫存量(INV)等屬性(相當于數組,數組下標由quarters元素決定)。一旦這樣的定義建立起來,如果quarters的數量不是4而是1000,只需擴展其元素為1,2,.,1000,每個季節(jié)仍然都有DEM,RP,OP,INV這樣的屬性(這些量的具體數值如果是常量,則可在數據段輸入;如果是未知數,則可在初始段輸入初值)。當quarters的數量不是4而是1000時,沒有必要把1,
21、2,.,1000全部一個一個列出來,而是可以如下定義quarters集合:“quarters/1.1000/:DEM,RP,OP,INV;” ,“1.1000”的意思就是從1到1000的所有整數。,(2)目標與約束段:目標函數、約束條件等,沒有段的開始和結束標記,因此實際上就是除其它四個段(都有明確的段標記)外的LINGO模型。 這里一般要用到LINGO的內部函數,尤其是與集合相關的求和函數SUM和循環(huán)函數FOR等。 上例中定義的目標函數與quarters的元素數目是 4或 1000并無具體的關系。約束的表示也類似。,(3)數據段(DATA):以 “DATA:” 開始, “ENDDATA”結束
22、,對集合的屬性(數組)輸入必要的常數數據。 格式為:“attribute(屬性) = value_list(常數列表);” 常數列表(value_list)中數據之間可以用逗號“,”分開,也可以用空格分開(回車等價于一個空格),如上面對DEM的賦值也可以寫成“DEM=40 60 75 25;”。,在LINGO模型中,如果想在運行時才對參數賦值,可以在數據段使用輸入語句。但這僅能用于對單個變量賦值,輸入語句格式為:“變量名 = ?;”。例如,上例中如果需要在求解模型時才給出初始庫存量(記為A),則可以在模型中數據段寫上語句:”A = ?;” 在求解時LINDO系統(tǒng)給出提示界面,等待用戶輸入變量A
23、的數值。當然,此時的約束語句 INV(1)=10+RP(1)+OP(1)-DEM(1); 也應該改寫成 INV(1)=A+RP(1)+OP(1)-DEM(1); 這樣,模型就可以計算任意初始庫存量(而不僅僅只能計算初始庫存量為10)的情況了。,(4)初始段(INIT):以“INIT: ”開始, “ENDINIT”結束,對集合的屬性(數組)定義初值(因為求解算法一般是迭代算法,所以用戶如果能給出一個比較好的迭代初值,對提高算法的計算效果是有益的)。 如果有一個接近最優(yōu)解的初值,對LINGO求解模型是有幫助的。定義初值的格式為: “attribute(屬性) = value_list(常數列表);
24、” 這與數據段中的用法是類似的。 上例中沒有初始化部分,我們將在下一個例子中舉例說明。,(5)計算段(CALC):以“CALC: ”開始, “ENDCALC”結束,對一些原始數據進行計算處理。 在實際問題中,輸入的數據通常是原始數據,不一定能在模型中直接使用,可以在這個段對這些原始數據進行一定的“預處理”,得到模型中真正需要的數據。,例如上例,如果希望得到全年的總需求和季度平均需求,可以增加這個段: CALC: T_DEM = SUM(quarters: DEM); !總需求; A_DEM = T_DEM / size(quarters); !平均需求; ENDCALC 在計算段中也可以使用集
25、合函數(其中函數size(quarters)表示集合quarters的元素個數,這里也就是4)。這時,變量T_DEM的值就是總需求,A_DEM的值就是平均需求(如果需要的話,這兩個變量就可以在程序的其它地方作為常數使用了)。 注:上面的兩個語句不能交換順序,因為計算A_DEM必須要用到T_DEM的值。此外,在計算段中只能直接使用賦值語句,而不能包含需要經過解方程或經過求解優(yōu)化問題以后才能決定的變量。,基本集合與派生集合,例 建筑工地的位置(用平面坐標a, b表示,距離單位:公里)及水泥日用量d(噸)下表給出。有兩個臨時料場位于P (5,1), Q (2, 7),日儲量各有20噸。從A, B兩料
26、場分別向各工地運送多少噸水泥,使總的噸公里數最小。兩個新的料場應建在何處,節(jié)省的噸公里數有多大?,建立模型,記工地的位置為 ,水泥日用量為 ;料場位置為 ,日儲量為 ;從料場 向工地 的運送量為 。,使用現有臨時料場時,決策變量只有 (非負),所以這是LP模型;當為新建料場選址時決策變量為 和 ,由于目標函數 對 是非線性的,所以在新建料場時是NLP模型。先解NLP模型,而把現有臨時料場的位置作為初始解告訴LINGO。,本例中集合的概念,利用集合的概念,可以定義需求點DEMAND和供應點SUPPLY兩個集合,分別有6個和2個元素(下標)。但決策變量(運送量) 與集合DEMAND和集合SUPPL
27、Y都有關系的。該如何定義這樣的屬性?,集合的屬性相當于以集合的元素為下標的數組。這里的 相當于二維數組。它的兩個下標分別來自集合DEMAND和SUPPLY,因此可以定義一個由二元對組成的新的集合,然后將 定義成這個新集合的屬性。,輸入程序,定義了三個集合,其中LINK在前兩個集合DEMAND 和SUPPLY的基礎上定義,表示集合LINK中的元素就是集合DEMAND 和SUPPLY的元素組合成的有序二元組, 從數學上看LINK是DEMAND 和SUPPLY的笛卡兒積,也就是說 LINK=(S,T)|SDEMAND,TSUPPLY 因此,其屬性C也就是一個6*2的矩陣(或者說是含有12個元素的二維
28、數組)。,LINGO建模語言也稱為矩陣生成器(MATRIX GENERATOR)。類似DEMAND 和SUPPLY直接把元素列舉出來的集合,稱為基本集合(primary set),而把LINK這種基于其它集合而派生出來的二維或多維集合稱為派生集合(derived set)。由于是DEMAND 和SUPPLY生成了派生集合LINK,所以DEMAND 和SUPPLY 稱為LINK的父集合。,輸入程序,初始段,INGO對數據是按列賦值的 語句的實際賦值順序是X=(5,2), Y=(1,7), 而不是X=(5,1), Y=(2,7) 等價寫法: “X=5,2; Y=1,7;”,同理,數據段中對常數數組
29、A,B的賦值語句也可以寫成 A, B=1.25 1.25 8.75 0.75 0.5 4.75 5.75 5 3 6.5 7.25 7.75;,輸入程序,解答:運行菜單命令“LINGO|Solve”,局部最優(yōu)解X(1)=7.249997, X(2)=5.695940,Y(1)=7.749998, Y(2)=4.928524,C(略), 最小運量=89.8835(噸公里)。,問題:最小運量89.8835是不是全局最優(yōu),是用“LINGO|Options”菜單命令打開選項對話框,在“Global Solver”選項卡上選擇“Use Global Solver”, 激活全局最優(yōu)求解程序。,問題:最小運
30、量89.8835是不是全局最優(yōu),此時目標函數值的下界(Obj Bound=85.2638)與目前得到的最好的可行解的目標函數值(Best Obj=85.2661)相差已經非常小,可以認為已經得到了全局最優(yōu)解。,計算結果,工地與料場示意圖 : “*”表示料場,“+”表示工地,可以認為是模型的最后結果,附注:如果要把料廠P(5, 1), Q (2, 7)的位置看成是已知并且固定的,這時是LP模型。只需要把初始段的“X Y =5,1,2,7;”語句移到數據段就可以了。此時,運行結果告訴我們得到全局最優(yōu)解(變量C的取值這里略去),最小運量136.2275(噸公里)。,稠密集合與稀疏集合,包含了兩個基本
31、集合構成的所有二元有序對的派生集合稱為稠密集合(簡稱稠集)。有時候,在實際問題中,一些屬性(數組) 只在笛卡兒積的一個真子集合上定義,這種派生集合稱為稀疏集合(簡稱疏集)。,例 (最短路問題) 在縱橫交錯的公路網中,貨車司機希望找到一條從一個城市到另一個城市的最短路. 下圖表示的是公路網, 節(jié)點表示貨車可以??康某鞘?弧上的權表示兩個城市之間的距離(百公里). 那么,貨車從城市S出發(fā)到達城市T,如何選擇行駛路線,使所經過的路程最短?,分析,假設從S到T的最優(yōu)行駛路線 P 經過城市C1, 則P中從S到C1的子路也一定是從S到C1的最優(yōu)行駛路線; 假設 P 經過城市C2, 則P中從S到C2的子路也
32、一定是從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)只有唯一的道路),分析,此例中可把從S到T的行駛過程分成4個階段,即 SAi (i=1,2或3), Ai Bj
33、(j=1或2), Bj Ck(k=1或2), Ck T. 記d(Y,X)為城市Y與城市X之間的直接距離(若這兩個城市之間沒有道路直接相連,則可以認為直接距離為),用L(X)表示城市S到城市X的最優(yōu)行駛路線的路長:,本例的計算,所以, 從S到T的最優(yōu)行駛路線的路長為20. 進一步分析以上求解過程, 可以得到從S到T的最優(yōu)行駛路線為 S A3 B2 C1 T.,這種計算方法在數學上稱為動態(tài)規(guī)劃(Dynamic Programming),本例的LINGO求解,“CITIES”(城市):一個基本集合(元素通過枚舉給出),L:CITIES對應的屬性變量(我們要求的最短路長),“ROADS”(道路):由C
34、ITIES導出的一個派生集合(請?zhí)貏e注意其用法),由于只有一部分城市之間有道路相連,所以不應該把它定義成稠密集合,將其元素通過枚舉給出,這就是一個稀疏集合。,D:稀疏集合ROADS對應的屬性變量(給定的距離),本例的LINGO求解,從模型中還可以看出:這個LINGO程序可以沒有目標函數,這在LINGO中,可以用來找可行解(解方程組和不等式組)。,在數據段對L進行賦值,只有L(S)=0已知,后面的值為空(但位置必須留出來,即逗號“,”一個也不能少,否則會出錯)。如果這個語句直接寫成“L=0;”,語法上看也是對的,但其含義是L所有元素的取值全部為0,所以也會與題意不符。,本例的LINGO求解,雖然
35、集合CITIES中的元素不是數字,但當它以CITIES(I)的形式出現在循環(huán)中時,引用下標I卻實際上仍是正整數,也就是說I指的正是元素在集合中的位置(順序),一般稱為元素的索引(INDEX)。,在for循環(huán)中的過濾條件里用了一個函數“index”, 其作用是返回一個元素在集合中的索引值,這里index(S)=1(即元素S在集合中的索引值為1),所以邏輯關系式“I#GT#index(S)”可以可以直接等價地寫成“I#GT#1” 。這里index(S)實際上還是index(CITIES,S)的簡寫,即返回S在集合CITIES中的索引值。,本例的LINGO求解結果,從S到T的最優(yōu)行駛路線的路長為20
36、(進一步分析,可以得到最優(yōu)行駛路線為S A3 B2 C1 T)。,本例中定義稀疏集合ROADS的方法是將其元素通過枚舉給出,有時如果元素比較多,用起來不方便。另一種定義稀疏集合的方法是“元素過濾”法,能夠從笛卡兒積中系統(tǒng)地過濾下來一些真正的元素。,例 某班8名同學準備分成4個調查隊(每隊兩人)前往4個地區(qū)進行社會調查。這8名同學兩兩之間組隊的效率如下表所示(由于對稱性,只列出了嚴格上三角部分),問如何組隊可以使總效率最高?,分析,這是一個匹配(MATCHING)問題。把上表的效率矩陣記為BENEFIT(由于對稱性,這個矩陣只有嚴格上三角部分共28個數取非零值)。 用MATCH(Si,Sj)=1
37、表示同學Si,Sj組成一隊 ,而MATCH(Si,Sj)=0表示Si,Sj不組隊。由于對稱性,只需考慮ij共28個0-1變量(而不是全部32個變量)。 顯然,目標函數正好是BENEFIT(Si,Sj)*MATCH(Si,Sj)對I,j之和。 約束條件是每個同學只能(而且必須在)某一組,即對于任意i有:只要屬性MATCH的某個下標為i就加起來,此和應該等于1。,由上面的分析,因此,完整的數學模型如下(顯然,這是一個0-1線性規(guī)劃):,問題的LINGO求解,“S1.S8”等價于寫成“S1 S2 S3 S4 S5 S6 S7 S8”, 它沒有相關的屬性列表,只用于表示是一個下標集合,在派生集合PAI
38、RS定義中增加了過濾條件 “ 其中setname為定義的集合名,member_list為元素列表,attribute_list為屬性列表。元素列表可以采用顯式列舉法(即直接將所有元素全部列出,元素之間用逗號或空格分開),也可以采用隱式列舉法。隱式列舉法可以有幾種不同格式,,元素列表和屬性列表都是可選的。 當屬性列表不在集合定義中出現時,這樣的集合往往只是為了將來在程序中作為一個循環(huán)變量來使用,或者作為構造更復雜的派生集合的父集合使用(匹配問題中的集合STUDENTS沒有屬性列表)。 而當元素列表不在基本集合的定義中出現時,則必須在程序的數據段以賦值語句的方式直接給出元素列表。 例如,前例中SA
39、ILCO公司決定四個季度的帆船生產量模型的集合段和數據段可以分別改為: SETS: QUARTERS:DEM,RP,OP,INV; !注意沒有給出集合的元素列表; ENDSETS DATA: QUARTERS DEM=1 40 2 60 3 75 4 25; !注意LINGO按列賦值的特點; ENDDATA,基本集合的定義語法,帆船生產量模型的源程序,匹配問題的源程序,派生集合的定義語法,派生集合的定義格式為(方括號“ ”中的內容是可選項, 可以沒有): setname(parent_set_list) /member_list/ : attribute_list; 與基本集合的定義相比較多了
40、一個parent_set_list(父集合列表)。 父集合列表中的集合(如 set1,set2,等)稱為派生集合setname的父集合,它們本身也可以是派生集合。 當元素列表(member_list)不在集合定義中出現時,還可以在程序的數據段以賦值語句的方式給出元素列表; 若在程序的數據段也不以賦值語句的方式給出元素列表,則認為定義的是稠密集合,即父集合中所有元素的有序組合(笛卡兒積)都是setname的元素。 當元素列表在集合定義中出現時,又有“元素列表法”(直接列出元素)和“元素過濾法”(利用過濾條件)兩種不同方式。,3.運算符和函數,LINGO入門 2.在LINGO中使用集合 3. 運算
41、符和函數 4. LINGO的主要菜單命令 5. LINGO命令窗口,運算符及其優(yōu)先級,算術運算符,加、減、乘、除、乘方等數學運算(即數與數之間的運算,運算結果也是數)。 LINGO中的算術運算符有以下5種: +(加法), (減法或負號), *(乘法), /(除法), (求冪)。,邏輯運算符,運算結果只有“真”(TRUE)和“假”(FALSE)兩個值(稱為“邏輯值”),LINGO中用數字1代表TRUE,其他值(典型的值是0)都是FALSE。 在LINGO中,邏輯運算(表達式)通常作為過濾條件使用,邏輯運算符有9種,可以分成兩類: #AND#(與),#OR#(或),#NOT#(非):邏輯值之間的運
42、算,它們操作的對象本身已經是邏輯值或邏輯表達式,計算結果也是邏輯值。 #EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):是“數與數之間”的比較,也就是它們操作的對象本身必須是兩個數, 計算得到的結果是邏輯值。,關系運算符,表示是“數與數之間”的大小關系,在LINGO中用來表示優(yōu)化模型的約束條件。LINGO中關系運算符有3種: (即=,大于等于) (在優(yōu)化模型中約束一般沒有嚴格小于、嚴格大于關系),運算符的優(yōu)先級,基本的數學函數,在LINGO中建立優(yōu)化模型時可以引用大量的內部函數,這些函數以” 打頭。LINGO中包括相當豐富的數
43、學函數,這些函數的用法非常簡單,下面一一列出。,ABS(X):絕對值函數,返回X的絕對值。 COS(X):余弦函數,返回X的余弦值(X的單位是弧度)。 EXP(X):指數函數,返回,FLOOR(X):取整函數,返回X的整數部分(向最靠近0的方向取整)。 LGM(X) :返回X的伽瑪(gamma)函數的自然對數值(當X為整數時LGM(X) = LOG(X-1)?。划擷不為整數時,采用線性插值得到結果)。 LOG(X):自然對數函數,返回X的自然對數值。,的值(其中e=2.718281.)。,基本的數學函數,MOD(X,Y):模函數,返回X對Y取模的結果,即X除以Y的余數,這里X和Y應該是整數。
44、POW(X,Y):指數函數,返回XY的值。 SIGN(X):符號函數,返回X的符號值(X = 0時返回+1)。 SIN(X):正弦函數,返回X的正弦值(X的單位是弧度)。 SMAX(list):最大值函數,返回一列數(list)的最大值。 SMIN(list):最小值函數,返回一列數(list)的最小值。 SQR(X):平方函數,返回X的平方(即X*X)的值。 SQRT(X):開平方函數,返回X的正的平方根的值。 TAN(X):正切函數,返回X的正切值(X的單位是弧度)。,集合循環(huán)函數,集合上的元素(下標)進行循環(huán)操作的函數, 一般用法如下: function(setname ( set_in
45、dex_list) | condition : expression_list); 其中:,function 集合函數名,FOR、MAX、MIN、PROD、SUM之一; Setname 集合名; set_index_list 集合索引列表(不需使用索引時可以省略); Condition 用邏輯表達式描述的過濾條件(通常含有索引,無條件時可以省略); expression_list 一個表達式(對FOR函數,可以是一組表達式。,集合循環(huán)函數,五個集合函數名的含義: FOR(集合元素的循環(huán)函數): 對集合setname的每個元素獨立地生成表達式,表達式由expression_list描述(通常是優(yōu)
46、化問題的約束)。 MAX(集合屬性的最大值函數):返回集合setname上的表達式的最大值。 MIN(集合屬性的最小值函數):返回集合setname上的表達式的最小值。 PROD(集合屬性的乘積函數): 返回集合setname上的表達式的積。 SUM(集合屬性的求和函數):返回集合setname上的表達式的和。,集合操作函數,INDEX( set_name, primitive_set_element) 給出元素primitive_set_element在集合set_name中的索引值(即按定義集合時元素出現順序的位置編號)。省略set_name,LINGO按模型中定義的集合順序找到第一個含有
47、該元素的集合,并返回索引值。如果沒有找到該元素,則出錯。 注: Set_name的索引值是正整數且只能位于1和元素個數之間。例:定義一個女孩姓名集合(GIRLS)和男孩姓名集合(BOYS) : SETS: GIRLS /DEBBIE, SUE, ALICE/; BOYS /BOB, JOE, SUE, FRED/; ENDSETS 都有SUE, GIRLS在BOYS前定義,調用INDEX(SUE)將返2,相當于INDEX(GIRLS,SUE) 。要找男孩中名為SUE的小孩的索引,應該使用INDEX(BOYS, SUE),返3。,集合操作函數,IN( set_name, primitive_in
48、dex_1 , primitive_index_2 .) 判斷一個集合中是否含有某個索引值。如果集合set_name中包含由索引primitive_index_1 , primitive_index_2 .所對應元素,則返回1(邏輯值“真”),否則返回0(邏輯值“假”)。索引用“ ENDSETS,如果集合C是由集合A,B派生的,例如: SETS: A / 1.3/:; B / X Y Z/:; C( A, B) / 1,X 1,Z 2,Y 3,X/:; ENDSETS 判斷C中是否包含元素(2,Y),則可以利用以下語句: X = IN( C, INDEX( A, 2), INDEX( B, Y
49、); 對本例,結果是X=1(真)。 注:X既是集合B的元素,又對X賦值1,在LINGO中這種表達是允許的,因為前者是集合的元素,后者是變量,邏輯上沒有關系(除了同名外),所以不會出現混淆。,集合操作函數,IN( set_name, primitive_index_1 , primitive_index_2 .),WRAP(I,N) 此函數對N1無定義 當I位于區(qū)間1, N內時直接返回I;一般地,返回 J = I - K *N , 其中J位于區(qū)間1, N , K為整數。即 WRAP(I,N)= MOD(I,N)。 但當MOD(I,N)=0時WRAP(I,N)=N. 此函數可以用來防止集合的索引值
50、越界。 用戶在編寫LINGO程序時,應注意避免LINGO模型求解時出現集合的索引值越界的錯誤。,集合操作函數,SIZE (set_name) 返回數據集set_name中包含元素的個數。,變量定界函數,對變量的取值范圍附加限制,共有以下四種: BND(L, X, U) :限制L = X = U。 注意LINGO中沒有與LINDO命令SLB、SUB類似的函數SLB和SUB BIN(X) :限制X為0或1。注意LINDO中的命令是INT,但LINGO中這個函數的名字卻不是INT(X) FREE(X):取消對X的符號限制(即可取負數、0或正數) GIN(X):限制X為整數,財務會計函數,用于計算凈現
51、值,包括以下兩個函數: FPA(I,N) 返回如下情形下總的凈現值:單位時段利率為I,連續(xù)N個時段支付,每個時段支付單位費用。根據復利的計算公式,很容易知道 FPA(I,N) = 。 FPL(I,N) 返回如下情形下總的凈現值:單位時段利率為I,第N個時段支付單位費用。根據復利的計算公式,很容易知道 FPL(I,N) 。,概率相關函數,PSN(X):標準正態(tài)分布函數,即返回標準正態(tài)分布的分布函數在X點的取值。 PSL(X):標準正態(tài)線性損失函數,即返回 MAX(0, Z-X)的期望值, 其中 Z為標準正態(tài)隨機變量。 PPS(A,X):Poisson分布函數,即返回均值為A的Poisson分布的
52、分布函數在X點的取值(當X不是整數時,采用線性插值進行計算)。 PPL(A,X):Poisson分布的線性損失函數,即返回 MAX(0, Z-X)的期望值, 其中 Z為均值為A的Poisson隨機變量。 PBN(P,N,X):二項分布函數,即返回參數為(N,P)的二項分布的分布函數在X點的取值(當N和(或)X不是整數時,采用線性插值進行計算) 。,PHG(POP,G,N,X):超幾何(Hypergeometric)分布的分布函數。也就是說,返回如下概率:當總共有POP個球,其中G個是白球時,那么隨機地從中取出N個球,白球不超過X個的概率。當POP,G,N和(或)X不是整數時,采用線性插值進行計
53、算。 PEL(A,X) :當到達負荷(強度)為A,服務系統(tǒng)有X個服務器且不允許排隊時的Erlang損失概率。 PEB(A,X):當到達負荷(強度)為A,服務系統(tǒng)有X個服務器且允許無窮排隊時的Erlang繁忙概率。 PFS(A,X,C) :當負荷上限為A,顧客數為C,并行服務器數量為X時,有限源的Poisson服務系統(tǒng)的等待或返修顧客數的期望值。(A是顧客數乘以平均服務時間,再除以平均返修時間。當C和(或)X不是整數時,采用線性插值進行計算)。,概率相關函數,PFD(N,D,X):自由度為N和D的F分布的分布函數在X點的取值。 PCX(N,X): 自由度為N的分布的分布函數在X點的取值。 PTD
54、(N,X): 自由度為N的t分布的分布函數在X點的取值。 QRAND(SEED): 返回0與1之間的多個擬均勻隨機數(SEED為種子,缺省時取當前計算機時間為種子)。該函數只能用在數據段,擬均勻隨機數可以認為是“超均勻”的隨機數,需要詳細了解“擬均勻隨機數(quasi-random uniform numbers)” 請進一步參閱LINGO的使用手冊。 RAND(SEED) :返回0與1之間的一個偽均勻隨機數(SEED為種子)。,概率相關函數,文件輸入輸出函數,FILE(filename) 當前模型引用其他ASCII碼文件中的數據或文本時可以采用該語句(但不允許嵌套使用),其中filename
55、為存放數據的文件名,該文件中記錄之間用“”分開。 ODBC 提供LINGO與ODBC(Open Data Base Connection,開放式數據庫連接)的接口。 OLE 提供LINGO與OLE(Object Linking and Embeding)接口。 POINTER( N)在Windows下使用LINGO的動態(tài)連接庫DLL ,直接從共享的內存中傳送數據。 TEXT(filename) 用于數據段中將解答結果送到文本文件filename中,當省略filename時,結果送到標準的輸出設備(通常就是屏幕)。filename中可以帶有文件路徑,沒有指定路徑時表示在當前目錄,如果這個文件已經
56、存在,將會被覆蓋。,結果報告函數,ITERS() 只能在程序的數據段使用,調用時不需要任何參數,返回LINGO求解器計算所使用的總迭代次數。例如: TEXT() = ITERS(); 將迭代次數顯示在屏幕上。 NEWLINE(n) 在輸出設備上輸出n個新行。 STRLEN(string) 返回字串“string”的長度,如 STRLEN(123)返回值為3。,NAME(var_or_row_refernce) 返回變量名或行名。 例: SETS: WH/WH1.WH3/;!WH表示倉庫的集合; C/C1.C4/; ! C 表示顧客的集合; ROAD(WH,C):X; !ROAD表示倉庫到顧客的
57、道路集合; !X表示某個倉庫對某個顧客供貨數; ENDSETS DATA: TEXT() = WRITEFOR( ROAD( I, J) | X( I, J) #GT# 0: NAME( X), , X, NEWLINE( 1); ENDDATA,結果報告函數,NAME(var_or_row_refernce) 返回變量名或行名。 輸出結果示意如下(這里沒有詳細交待屬性X當前的取值): X( WH1, C1) 2 X( WH1, C2) 17 X( WH1, C3) 1 X( WH2, C1) 13 X( WH2, C4) 12 X( WH3, C3) 21 注: “變量”是指“數組元素”X(
58、 WH1, C1)、X( WH2, C4)等,即屬性加上相應的下標(集合元素)。 同理,約束名也是指模型展開后的約束名(用LINGO| Generate命令可以看到約束展開后的情況),即也應該是帶有相應的下標(集合元素)的。,結果報告函數,結果報告函數,WRITE(obj1, , objn) 只能在數據段中使用,輸出一系列結果(obj1, , objn),其中obj1, , objn 等可以是變量(但不能只是屬性),也可以是字符串(放在單引號中的為字符串)或換行(NEWLINE)等。 結果可以輸出到一個文件,或電子表格(如EXCEL),或數據庫,這取決于WRITE所在的輸出語句中左邊的定位函數
59、。 例如: DATA: TEXT() = WRITE(A is, A, , B is, B, , A/B is, A/B); ENDDATA 其中A,B是該模型中的變量,在屏幕上輸出A,B以及A/B的值(增加了一些字符串,使結果讀起來更方便)。假設計算結束時A=10,B=5,則輸出為: A is 10,B is 5, A/B is 2,結果報告函數,WRITEFOR( setname ( set_index_list) | condition: obj1, objn) 函數WRITE在循環(huán)情況下的推廣,輸出集合上定義的屬性對應的多個變量的取值。 例:(這里WH,C,X含義同上): DATA: TEXT() = WRITEFOR( ROAD( I, J) | X( I, J) #GT# 0: 從倉庫 , W
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 平鄉(xiāng)垃圾分選管理辦法
- 科技項目專家管理辦法
- 肺仟維化中醫(yī)課件
- 口腔護士種植培訓課件
- 鞏義二模初三數學試卷
- 高中二檢數學試卷
- 定遠初二數學試卷
- 廣東甘肅高考數學試卷
- 高2期中數學試卷
- 幼師課件制作培訓體會
- 醫(yī)患之間暴力行為預防與處理管理制度
- 2022年版初中物理課程標準解讀-課件
- MOOC 大學物理實驗-鄭州大學 中國大學慕課答案
- 眼科臨床路徑培訓記錄課件
- 術后病人燙傷不良事件PDCA循環(huán)分析課件
- 學校作業(yè)檢查總結匯報
- 骨科手術后的康復輔助器具和輔助裝置
- 學校課程體系建設與調整情況匯報
- 鐵路路基施工與維護習題集
- 音樂考試真題
- 彩鋼屋面自粘卷材施工方案
評論
0/150
提交評論