LINGO 軟件的基本使用方法_第1頁
LINGO 軟件的基本使用方法_第2頁
LINGO 軟件的基本使用方法_第3頁
LINGO 軟件的基本使用方法_第4頁
LINGO 軟件的基本使用方法_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、這是 HYPERLINK 61/pub/1.%C9%FA%CE%EF%BD%B2%D2%E5/2004%B4%BA_%CA%FD%D1%A7%CA%B5%D1%E9_%D0%BB%BD%F0%D0%C7/8_%D4%BC%CA%F8%D3%C5%BB%AF/LINGO-howto.pdf 的 HTML 檔。G o o g l e 在網(wǎng)路漫游時會自動將檔案轉(zhuǎn)換成 HTML 網(wǎng)頁來儲存。Page 1第 3 章 LINGO 軟件的基本使用方法3.1 LINGO 的基本特點LINGO 8.0 for Windows 軟件比以前的版本有了很大的改進,功能大大增強,性能更加穩(wěn)定,解答結果更加可靠。LING

2、O 8.0 for Windows 軟件安裝程序的文件大小通常 20M 多一點,安裝過程與 LINDO 6.1 for Windows 的安裝過程完全類似,我們下面假設 LINGO 8.0 for Windows 軟件已經(jīng)安裝完畢。同樣,LINGO 8.0 也有兩種命令模式:一種是常用的 Windows 模式, 通過下拉式菜單命令驅(qū)動 LINGO 運行(多數(shù)的菜單命令通常有快捷鍵,常用的菜單命令在工具欄中有圖標表示的快捷按鈕),界面是圖形式的,使用起來也比較方便;另一種是命令行 (Command-Line) 模式,僅在命令窗口(Command Window)下操作,通過輸入行命令驅(qū)動 LING

3、O 運行,其使用界面不是圖形式的,而是字符式的,初學者往往不太容易掌握。與上一章一樣,我們?nèi)匀恢饕?Windows 菜單驅(qū)動模式下介紹 LINGO 的使用方法,最后再簡單介紹一下命令行模式下的主要行命令。我們前面說過,從基本功能上看,與 LINDO 相比,LINGO 軟件主要具有兩大優(yōu)點:1、除具有 LINDO 的全部功能外,還可用于求解非線性規(guī)劃問題,包括非線性整數(shù)規(guī)劃問題。2、LINGO 包含了內(nèi)置的建模語言,允許以簡練、直觀的方式描述較大規(guī)模的優(yōu)化問題,模型中所需的數(shù)據(jù)可以以一定格式保存在獨立的文件中。前一條是很容易理解的。那么后一條呢?從前一章的介紹中可以看到,雖然 LINDO 輸入

4、模型的格式與我們數(shù)學上對數(shù)學規(guī)劃的表達式非常接近,但是如果我們希望在 LINDO 模型窗口下輸入一個比較大規(guī)模的模型,那將是一件非常費時費力的事情。例如,如果決策變量有 1000 個,由于LINDO 不提供數(shù)組或類似的數(shù)據(jù)結構,我們除了用 x1,x2, x1000 或類似方法表示決策變量外,完全沒有其他辦法。而對實際企業(yè)中的優(yōu)化問題,決策變量達到幾十萬個也是常有的事,顯然用前面那種在 LINDO 模型窗口下輸入模型的方法幾乎是不可能的。而 LINGO 則在這方面通過引入建模語言有了很大改進.也就是說,即使你只對解線性規(guī)劃感興趣,你也應該學習使用 LINGO。3.2 初識 LINGO 在 Win

5、dows 操作系統(tǒng)下雙擊 LINGO 圖標,啟動 LINGO 軟件,屏幕上首先顯示如圖 1 所示的窗口。圖 11Page 2圖 1 中最外層的窗口使 LINGO 軟件的主窗口,所有其他窗口都在這個窗口之內(nèi)。當前光標所在的窗口上標有“LINGO MODEL LING01”,這就是模型窗口,也就是用于輸入優(yōu)化模型的窗口。初步觀察可以看到,圖 1 這個界面與 LINDO 軟件的界面非常類似,只是在 LINGO 軟件的主窗口中,最下面增加了一個狀態(tài)行(仔細觀察,可以發(fā)現(xiàn)菜單和工具欄也略有區(qū)別)。目前,狀態(tài)行最左邊顯示的是“Ready”,表示 “準備就緒”;右下角現(xiàn)實的是當前時間,時間前面是當前光標的位

6、置(1 行 1 列)。將來,用戶可以用選項命令(LINGO|Options 菜單命令)決定是否需要顯示工具欄和狀態(tài)行。作為一個最簡單的例子,我們看看上一章 2.2 節(jié)中輸入的那個簡單例子在 LINGO 下應當如何輸入. 當時我們把它存入了一個名為 EXAM0202.LTX 的模型文件中,為了對比 LINDO 和 LINGO 輸入的差別,我們現(xiàn)在重新用 LINDO 把它打開,看到該例子是如圖 2 所示的線性規(guī)劃。圖 2 圖 3 2Page 3在 LINGO 中,有一個命令可以直接把 LINDO 的模型文件轉(zhuǎn)化成 LINGO 模型。我們選擇菜單命令 FILE | IMPORT LINDO FILE

7、 (F12), 其意思是“導入 LINDO 文件”,則屏幕上會顯示一個標準的“打開文件”的對話框,我們在目錄下找到 EXAM0202.LTX,選定該文件后,屏幕顯示如圖 3。這個命令在 LINGO 主窗口中又打開了兩個子窗口,一個是命令窗口(Command Window),另一個是名為“exam0202”的模型窗口.。可以看出,當前光標位于命令窗口(從主窗口左上角的顯示結果也可以知道當前的活動窗口),命令窗口顯示的正是從 EXAM0202.LTX 讀出的原始文本文件;而“exam0202” 窗口才是由 EXAM0202.LTX 轉(zhuǎn)化而來的等價的 LINGO 模型。比較圖 2 和圖 3 可以發(fā)現(xiàn)

8、轉(zhuǎn)化工作主要在于以下幾個方面(這也是 LINGO 模型的最基本特征):(1) 將目標函數(shù)的表示方式從“MAX”變成了“MAX=”; (2) “ST”在 LINGO 模型中不再需要,所以被刪除了;(3) 在每個系數(shù)與變量之間增加了運算符“*”(即乘號不能省略);(4) 每行(目標、約束和說明語句)后面均增加了一個分號“;”; (5) 約束的名字被放到了一對方括號“ ”中,而不是放在右半括號“)”之前;(6) 模型結束標志“END”也被刪除了(LINGO 中只有當模型以“MODEL:”開始時才能以“END” 結束)。注意:在上一章的最后,我們曾經(jīng)用行命令“SAVE”把同樣的 LINDO 模型存入了

9、一個名為MODEL01.LTX 的模型文件中。但是經(jīng)過試驗,筆者發(fā)現(xiàn)菜單命令 FILE | IMPORT LINDO FILE (F12)不能把 MODEL01.LTX 正確地轉(zhuǎn)化成 LINGO 模型。即使對于在 LINDO 中用菜單命令保存下來的模型,筆者也多次發(fā)現(xiàn)有時不能正確地轉(zhuǎn)化(轉(zhuǎn)化時出現(xiàn)嚴重錯誤)。因此,本人的經(jīng)驗是:為了保證將來能將 LINDO 模型移植到 LINGO 中去,在 LINDO 模型輸入時應盡量采用“規(guī)范化”的格式(例如:說明語句最好單獨占據(jù)一行;行名(目標和約束的名字)不要以數(shù)字開頭;盡量避免少出現(xiàn)漢字和非標準的英文字符;二次規(guī)劃(QP)模型不能被正確轉(zhuǎn)化;等等)。無

10、論如何,幸運的是我們的 LINGO 模型“exam0202”已經(jīng)成功地得到了?,F(xiàn)在把光標移動到“exam0202” 模型窗口,然后選擇菜單命令“LINGO|SOLVE”對該模型進行求解(求解時 LINGO自然還是先對模型進行編譯,模型編譯沒有發(fā)現(xiàn)語法錯誤才開始求解);求解結束得到的結果與LINDO 下得到的結果相同(但不詢問是否進行敏感性分析),結果仍然在報告窗口中顯示(這里我們就不給出這個報告窗口的示意圖了)。圖 4 3Page 4現(xiàn)在我們可以把模型和結果報告保存在文件中。例如,當光標位于“exam0202” 模型窗口時選擇菜單命令“File|Save As”,則出現(xiàn)圖 4 所示的對話框。后

11、綴“LG4”表示 LINGO 格式的模型文件,是一種特殊的二進制格式文件,保存了我們在模型窗口中所能夠看到的所有文本和其他對象及其格式信息,只有 LINGO 能讀出它,用其他系統(tǒng)打開這種文件時會出現(xiàn)亂碼?!癓NG”表示 LINGO文本文件,以這個格式保存模型時 LINGO 將給出警告,因為模型中的格式信息(如字體、顏色、嵌入對象等)將會丟失。“LDT”表示 LINGO 數(shù)據(jù)文件,“LTF”表示 LINGO 命令腳本文件,“LGR”表示 LINGO 報告文件。除“LG4”文件外,這里的另外幾種格式的文件其實都是普通的文本文件,可以用任何文本編輯器打開和編輯。圖 5 求解時也會顯示狀態(tài)窗口(如圖

12、5 所示),包含的內(nèi)容比 LINDO 求解時的狀態(tài)窗口中的內(nèi)容要多一些(注意:可能由于 LINDO 和 LINGO 對中文 WINDOWS 系統(tǒng)的兼容性不太好,所以圖 5中有些顯示字符和單詞被截掉了)。下面我們給出相應的解釋:右邊的 5 個框分別給出變量數(shù)量(其中包括變量總數(shù)、非線性變量數(shù)、整數(shù)變量數(shù))、約束數(shù)量(約束總數(shù)、非線性約束個數(shù))、非零系數(shù)數(shù)量(總數(shù)、非線性項的個數(shù))、內(nèi)存使用量、求解花費的時間。需要注意的是,凡是可以從一個約束直接解出變量取值時,這個變量就不認為是決策變量而是固定變量,不列入統(tǒng)計中;只含有固定變量的約束也不列入約束統(tǒng)計中(參見第一章 1.8 節(jié)的說明)??偟膩碚f,這

13、些統(tǒng)計值的意義比較清楚,圖 5 中最下面一行的含義也與 LINDO 狀態(tài)窗口類似,我們下面主要詳細介紹一下圖 5左邊的兩個框中內(nèi)容。左上角是求解器(求解程序)狀態(tài)框(Solver Status),含義見表 1;左下角是擴展的求解器(求解程序)狀態(tài)框(Extended Solver Status),含義見表 2。4Page 5域名含義可能的顯示Model Class 當前模型的類型(請參閱本書第 1 章)LP,QP,ILP,IQP,PILP, PIQP,NLP,INLP,PINLP (以 I 開頭表示 IP,以 PI 開頭表示 PIP)State 當前解的狀態(tài)Global Optimum, Lo

14、cal Optimum, Feasible, Infeasible(不可行), Unbounded(無界), Interrupted(中斷), Undetermined(未確定)Objective 當前解的目標函數(shù)值實數(shù)Infeasibility當前約束不滿足的總量(不是不滿足的約束的個數(shù))實數(shù)(即使該值=0,當前解也可能不可行,因為這個量中沒有考慮用上下界形式給出的約束)Iterations 目前為止的迭代次數(shù)非負整數(shù)表 1 域名含義可能的顯示Solver Type 使用的特殊求解程序B-and-B (分枝定界算法)Global (全局最優(yōu)求解程序)Multistart(用多個初始點求解的程

15、序)Best Obj 目前為止找到的可行解的最佳目標函數(shù)值實數(shù)Obj Bound 目標函數(shù)值的界實數(shù)Steps 特殊求解程序當前運行步數(shù):分枝數(shù)(對 B-and-B 程序);子問題數(shù)(對 Global 程序);初始點數(shù)(對 Multistart 程序)非負整數(shù)Active 有效步數(shù)非負整數(shù)表 2 作為一個例子,我們現(xiàn)在再用 LINGO 來解第 1 章 1.4 節(jié)給出的如下二次規(guī)劃問題:Max98 x1 + 277 x2 x12 0.3 x1x2 2x22s.t. x1 + x2 100 x1 2 x2 x1 , x2 0 為整數(shù)該模型輸入 LINGO1 模型窗口后的形式見圖 6。對照第 2 章

16、 2.6 節(jié),我們可以看出用 LINGO解 QP 比用 LINDO 解要容易輸入模型。注意:原來的整數(shù)限定語句“GIN X1”和“GIN X2”這里變成了“GIN(X1)”和“GIN(X2)”;但是,在 LINDO 下也可以寫成“GIN 2”,這里卻不可以寫成“GIN(2)”,否則 LINGO 將把這個模型看成沒有整數(shù)變量。在 LINGO 中,以“”開頭的都是函數(shù)調(diào)用,我們將在后面(本章 3.5 節(jié))詳細介紹 LINGO 中能夠使用的所有函數(shù)。圖 6 5Page 6圖 7 現(xiàn)在運行菜單命令“LINGO|Solve”,則可以得到圖 7 所示的解答報告,最優(yōu)整數(shù)解 X=(35,65),最大利潤=1

17、1077.5。結果中最優(yōu)整數(shù)解與第 2 章 2.6 節(jié)相同,但最優(yōu)值略有不同,估計是計算誤差引起的。此外,LINGO 是將它作為 PINLP(純整數(shù)非線性規(guī)劃)來求解,因此只告訴我們找到的是局部最優(yōu)解(為什么 LINGO 不將它作為 PIQP(純整數(shù)二次規(guī)劃)來求解?本人也不清楚)。你還可以選擇運行菜單命令“WINDOW|Status Window”看到圖 8 所示的狀態(tài)窗口(這時我們已經(jīng)把該規(guī)劃模型保存到了文件 IQP0302B.LG4 中,所以這個名字現(xiàn)在也出現(xiàn)在了狀態(tài)窗口中),從中可以看到目前為止找到的最佳目標值“Best Obj”與問題的上界“Obj Bound”已經(jīng)是一樣的,當前解的

18、最大利潤與這兩個值非常接近,估計是計算誤差引起的差異。實際上,如果采用全局最優(yōu)求解程序(我們將在后面介紹“LINGO|Options”菜單命令時介紹如何激活全局最優(yōu)求解程序),可以驗證它就是全局最優(yōu)解。圖 8 6Page 7在本節(jié)的最后,我們對 LINGO 的基本用法指出幾點注意事項:1) 變量和行名可以超過 8 個字符,但不能超過 32 個字符,且必須以字母開頭。2) 與 LINDO 相同,用 LINGO 解規(guī)劃時已假定各變量非負(除非用限定變量取值范圍的函數(shù)free或sub 或slb 另行說明)。3) 與 LINDO 不同,變量可以放在約束條件的右端(同時數(shù)字也可放在約束條件的左端)。但為

19、了提高 LINGO 求解時的效率,應盡可能采用線性表達式定義目標和約束(如果可能)。3.3 在 LINGO 中使用集合331 集合的基本用法我們前面說過,LINGO 同時也是優(yōu)化問題的一種建模語言。有了它,使用者可以只用鍵入一行文字就可以建立起含有大規(guī)模變量的目標函數(shù)和成千上萬條約束。掌握這種最優(yōu)化模型語言是非常重要的,與 LINDO 相比,這可使輸入較大規(guī)模問題的過程得到簡化。理解 LINGO 建模語言最重要的是理解“集合”(SET)及其“屬性”(Attribute)的概念。什么是集合呢?我們通過下面的一個簡單例子開始來進行介紹。例:SAILCO 公司需要決定下四個季度的帆船生產(chǎn)量。下四個季

20、度的帆船需求量分別是 40 條,60 條,75 條,25 條,這些需求必須按時滿足。每個季度正常的生產(chǎn)能力是 40 條帆船,每條船的生產(chǎn)費用為 400 美元。如果加班生產(chǎn),每條船的生產(chǎn)費用為 450 美元。每個季度末,每條船的庫存費用為 20 美元。假定生產(chǎn)提前期為 0,初始庫存為 10 條船。如何安排生產(chǎn)可使總費用最小?我們用 DEM,RP,OP,INV 分別表示需求、正常生產(chǎn)的產(chǎn)量、加班生產(chǎn)的產(chǎn)量、庫存量,則DEM,RP,OP,INV 對每個季度都應該有一個對應的值,也就說他們都應該是一個由 4 個元素組成的數(shù)組,其中 DEM 是已知的,而 RP,OP,INV 是未知數(shù)。現(xiàn)在我們可以寫出這

21、個問題的模型。首先,目標函數(shù)是所有費用的和:MIN =+4,3,2,1)(20)(450)(400IIINVIOPIRP約束條件主要有兩個:1)能力限制:RP(I)1;“#GT#”是邏輯運算符號,意思是“大于”(其他邏輯運算符將在本章后面 3.4 節(jié)介紹)。8Page 9現(xiàn)在運行菜單命令“LINGO|Solve”,則可以得到圖 11 所示的解答報告,全局最優(yōu)解 RP=(40,40,40,25),OP=(0,10,35,0),最小成本=78450。這就是我們模型的計算結果。圖 11 一般來說, LINGO 中建立的優(yōu)化模型由四個部分組成,或稱為四“段”(SECTION):(1)集合段(SETS)

22、:這部分要以 SETS: 開始,以 ENDSETS 結束,作用在于定義必要的集合變量(SET)及其元素(MEMBER,含義類似于數(shù)組的下標)和屬性(ATTRIBUTE,含義類似于數(shù)組)。如上例中定義了集合 quarters(含義是季節(jié)),這里它包含四個元素即四個季節(jié)指標(1,2,3,4),每個季節(jié)都有需求(DEM)、正常生產(chǎn)量(RP)、加班生產(chǎn)量(OP)、庫存量(INV)等屬性(相當于數(shù)組,數(shù)組下標由 quarters 元素決定)。一旦這樣的定義建立起來,如果 quarters的數(shù)量不是 4 而是 1000,只需擴展其元素為 1,2,.,1000,每個季節(jié)仍然都有 DEM,RP,OP,INV這

23、樣的屬性(這些量的具體數(shù)值如果是常量,則可在數(shù)據(jù)段輸入;如果是未知數(shù),則可在初始段輸入初值)。自然,當 quarters 的數(shù)量不是 4 而是 1000 時,我們也沒有必要把 1,2,.,1000全部一個一個列出來,而是可以如下定義 quarters 集合:quarters/1.1000/:DEM,RP,OP,INV; 即“1.1000”的意識就是從 1 到 1000 的所有整數(shù)(我們的例子中只有 4 個元素,所以沒有寫成“1.4”而是全部列出來了)。(2)目標與約束段:這部分實際上定義了目標函數(shù),約束條件等。一般要用到 LINGO 的內(nèi)部函數(shù),可在具體使用中體會其功能和用法(詳見 3.5 節(jié)

24、)。上例中定義的目標函數(shù)與 quarters 的9Page 10元素數(shù)目是 4 或 1000 并無具體的關系。約束的表示也類似。(3)數(shù)據(jù)段(DATA):這部分要以 DATA: 開始,以 ENDDATA 結束,作用在于對集合的屬性(數(shù)組)輸入必要的常數(shù)數(shù)據(jù)。格式為:attribute = value_list。常數(shù)值列表(value_list)中數(shù)據(jù)之間可以用逗號“,”分開,也可以用空格分開(回車的作用也等價于一個空格),如上面對 DEM 的賦值也可以寫成“DEM=40 60 75 25”。在 LINGO 模型中,如果想在運行時才對參數(shù)賦值,可以在數(shù)據(jù)段使用輸入語句。但這僅用于對單個變量賦值,

25、而不能用于屬性變量(數(shù)組),輸入語句格式為:“變量名 = ?;”。例如,上面的例子中如果需要在求解模型時才給出初始庫存量(記為 A),則可以在模型中數(shù)據(jù)段寫上“A = ?;”語句,在求解時 LINDO 系統(tǒng)給出提示界面,等待用戶輸入變量 A 的數(shù)值。(4)初始段(INIT):這部分要以 INIT: 開始,以 ENDINIT 結束,作用在于對集合的屬性(數(shù)組)定義迭代初值,如果有一個接近最優(yōu)解的初值,對 LINGO 求解模型是有幫助的。格式為:attribute = value_list;上例中沒有初始化部分,我們將在下一個例子中舉例說明。實際上,LINGO 模型在求解時也是要展開成與 LIND

26、O 模型類似的形式的。選擇菜單命令“LINGO|Generate|Disply model”(Ctrl+G),可以得到展開形式的模型如圖 12 所示,這與我們在 LINDO 下的模型輸入形式很類似,只是在 LINDO 中不允許有這種數(shù)組形式的變量。注意:如果目標或約束中有非線性變量項,對應的非線性變量前的系數(shù)將以問號(“?”)顯示。圖 12 332 基本集合與派生集合我們下面再用 LINGO 來解在第一章 1.5 節(jié)中介紹的如下料場選址問題:某公司有 6 個建筑工地要開工,每個工地的位置(用平面坐標 a, b 表示,距離單位:公里)及水泥日用量 d(噸)由表 3 給出。目前有兩個臨時料場位于

27、P (5, 1), Q (2, 7) ,日儲量各有 20 噸。假設從料場到工地之間均有直線道路相連,試制定每天的供應計劃,即從 A, B 兩料場分別向各工地運送多少噸水泥,使總的噸公里數(shù)最小。為了進一步減少噸公里數(shù),打算舍棄兩個臨時料場,改建兩個新的,日儲量仍各為 20 噸,問應建在何處,節(jié)省的噸公里數(shù)有多大。a 3b 5d 3547611表 3 工地的位置(a, b)及水泥日用量 d 10Page 11記工地的位置為,水泥日用量為),(iiba6,1,L=idi;料場位置為,日儲量為;從料場),(jjyx2,1, =jejj向工地的運送量為。這個優(yōu)化問題的數(shù)學規(guī)劃模型是:iijc222161

28、)()(minijijjiijbyaxcf+=s.t. 6,1,21L=idcijij2,1,61=jecjiij當使用現(xiàn)有臨時料場時,決策變量只有,是 LP 模型;當為新建料場選址時決策變量為和,由于目標函數(shù)對是非線性的,所以在新建料場時是 NLP 模型。我們現(xiàn)在先解 NLP模型,而把現(xiàn)有臨時料場的位置作為初始解告訴 LINGO。ijcijcjjyx ,fjjyx ,輸入后的程序如圖 13 所示。我們在集合段定義了三個集合,其中 DEMAND 和 SUPPLY 集合的及其屬性的含義與上一個例子類似,而 LINK 則是在前兩個集合的基礎上定義的一個集合。LINK中的元素就是 DEMAND 和

29、SUPPLY 的笛卡兒積,也就是LINK=(S,T)|SDEMAND,TSUPPLY 因此,其屬性 C 也就是一個 6*2 的矩陣(或數(shù)組)。正是由于這種表示方式,LINGO 建模語言也稱為矩陣生成器(MATRIX GENERATOR)。DEMAND 和 SUPPLY 這種直接把元素列舉出來的集合,稱為基本集合(primary set,也可譯為“原始集合”),而把 LINK 這種基于基本集合構造的集合稱為派生集合(derived set, 也可譯為“導出集合”)。圖 13 11Page 12本模型中包括了初始段,請?zhí)貏e注意其中“X Y =5,1,2,7;”語句的實際賦值順序是X=(5,2),

30、Y=(1,7), 而不是X=(5,1), Y=(2,7)。也就是說,LINGO對數(shù)據(jù)是按列賦值的,而不是按行。當然,你直接寫成兩個語句“X=5,2; Y=1,7;”也是等價的。同樣道理,數(shù)據(jù)段中對常數(shù)數(shù)組A,B的賦值語句也可以寫成A, B=;請注意我們前面說過,這時空格與逗號“,”或“回車”的作用是等價的。由于新建料場的位置可以是任意的,所以我們在約束的最后(模型最后的 END 上面一行)用free 函數(shù)取消了變量 X、Y 非負限制。此外,我們用 TITLE 語句對這個模型取了一個標題“LOCATION PROBLEM”(見模型開始的“MODEL:”下面一行);并且對目標行(OBJ)和兩類約束

31、(DEMAND_CON、SUPPLY_CON)分別進行了命名(請?zhí)貏e注意這里約束命名的特點)。大家仔細閱讀、理解了圖 13 的程序后,現(xiàn)在就可以運行菜單命令“LINGO|Solve”,很快得到解答報告(顯示界面略,請?zhí)貏e注意結果中約束名稱也是有下標的):局部最優(yōu)解 , ,C(略),最小運量=89.8835(噸公里)?,F(xiàn)在我們來看看對于這個問題的 NLP 模型,最小運量 89.8835 是不是全局最優(yōu)。我們考慮用全局最優(yōu)求解程序(我們將在后面介紹“LINGO|Options”菜單命令時介紹如何激活全局最優(yōu)求解程序),解圖 13 中的模型。全局最優(yōu)求解程序花費的時間可能是很長的,所以為了減少計算工

32、作量,我們對 X,Y 的取值再做一些限制。雖然新建料場的位置可以是任意的,但我們可以很直觀地想到,最佳的料場位置不應該離工地太遠,無論如何至少不應該超出現(xiàn)在 6 個工地所決定的坐標的最大、最小值決定的矩形之外,即: 0.5=x=8.75, 0.75=y=7.75. 可以用bnd 函數(shù)加上這個條件取代模型 END 上面的行,運行 NLP 模型,發(fā)現(xiàn)全局最優(yōu)求解程序花費的時間仍然很長,圖 14是運行 27 分 35 秒時人為終止求解的求解狀態(tài)窗口。圖 14 12Page 13圖 15 012345678901234567835476112016圖 16 從圖 14 可以看出,此時目標函數(shù)值的下界(

33、Obj Bound=85.2638)與目前得到的最好的可行解的目標函數(shù)值(Best Obj=85.2661)相差已經(jīng)非常小,可以認為已經(jīng)得到了全局最優(yōu)解。部分結果見圖 15,這就可以認為是我們模型的最后結果。在圖 16 中,我們可以畫出料場和工地的位置示意圖,其中標有“*”號的是料場,標有“+”號的是工地。我們還可以指出:如果要把料廠 P(5, 1), Q (2, 7)的位置看成是已知并且固定的,這時是 LP 模型。只需要在圖 13 中把初始段的“X Y =5,1,2,7;”語句移到數(shù)據(jù)段就可以了。此時,運行結果告訴我們得到全局最優(yōu)解(變量 C 的取值這里略去),最小運量 (噸公里)。13Pa

34、ge 14333 稠密集合與稀疏集合上節(jié)我們介紹了在 LINGO 中可以定義和使用兩類集合:基本集合和派生集合。前面的例子中我們把派生集合 MATCH 的元素定義為 DEMAND 和 SUPPLY 的笛卡兒積,這種派生集合稱為稠密集合(簡稱稠集)。其實在 LINGO 中,派生集合的元素可以只是這個笛卡兒積的一個真子集合,這種派生集合稱為稀疏集合(簡稱疏集)。下面我們通過一個例子來說明。最短路問題在縱橫交錯的公路網(wǎng)中,貨車司機希望找到一條從一個城市到另一個城市的最短路. 假設圖 17 表示的是該公路網(wǎng), 節(jié)點表示貨車可以??康某鞘?弧上的權表示兩個城市之間的距離(百公里). 那么,貨車從城市 S

35、 出發(fā)到達城市 T,如何選擇行駛路線,使所經(jīng)過的路程最短? A16665B1C15 87S3A2 T6837B2C2 6A349圖 17 最短路問題的例子假設從S到T的最優(yōu)行駛路線 P 經(jīng)過城市C1, 則P中從S到C1的子路也一定是從S到C1的最優(yōu)行駛路線; 假設 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)行駛路線; 為了

36、求出從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(j=1或 2), Bj Ck(k=1 或 2), Ck T. 記d(Y,X)為城市Y與城市X之間的直接距離(若這兩個城市之間沒有道路直接相連,則可以認為直接距離為無窮大),用L(X)表示城市S到城市X的最優(yōu)行駛路線的路長, 則: L(S)=0; SXXYdYLXLX

37、Y+=),()(min)(對本例的具體問題,可以直接計算如下:L(A1)=6, L(A2)=3, L(A3)=3; L(B1)=min L(A1)+6, L(A2)+8, L(A3)+7= 10 = L(A3)+7, L(B2)=min L(A1)+5, L(A2)+6, L(A3)+4= 7 = L(A3)+4; L(C1)=min L(B1)+6, L(B2)+8= 15 = L(B2)+8, L(C2)=min L(B1)+7, L(B2)+9= 16 = L(B2)+9; L(T)=min L(C1)+5, L(C2)+6= 20 = L(C1)+5. 所以, 從S到T的最優(yōu)行駛路線的

38、路長為 20. 進一步分析以上求解過程, 可以得到從S到T的最優(yōu)行駛路線為S A3 B2 C1 T.上面這種計算方法在數(shù)學上稱為動態(tài)規(guī)劃(Dynamic Programming). 動態(tài)規(guī)劃也是最優(yōu)化的一個分之。作為一個例子,我們用 LINGO 來解這個最短路問題。我們可以編寫如圖 18 的 LINGO 程序。集合段定義的 CITIES 是一個基本集合(元素通過枚舉給出),L 是其對應的屬性變量(我們要求的最短路長);ROADS 是由 CITIES 導出的一個派生集合(請?zhí)貏e注意其用法),由于只有一部分城市之間有道路相連,所以我們進一步將其元素通過枚舉給出,這就是一個稀疏集合。D 是 ROAD

39、S 對應的屬性變量(給定的距離)。14Page 15圖 18 從模型中還可以看出:這個 LINGO 程序可以沒有目標函數(shù),這在 LINGO 中是允許的,可以用來找可行解(解方程組和不等式組)。此外,在數(shù)據(jù)段我們對 L 進行了賦值,但只有 L(S)=0 是已知的,所以后面的值為空(但位置必須留出來,即逗號“,”一個也不能少,否則會出錯)。如果這個語句直接寫成“L=0;”,語法上看也是對的,但其含義是 L 所有元素的取值全部為 0,所以也會與題意不符。圖 19 從這個例子還可以看出,雖然集合 CITIES 中的元素不是數(shù)字,但當它以 CITIES(I)的形式出現(xiàn)在循環(huán)中時,引用下標 I 卻實際上是

40、正整數(shù),也就是說 I 指的正是元素在集合中的位置(順序),一般稱為元素的索引(INDEX)。我們在for 循環(huán)中故意用了一個函數(shù)“index”, 其作用是返回一個元素在集合中的索引值,這里index(S )=1,所以邏輯關系式“I#GT#index(S )”可以直接等價地寫成“I#GT#1”。這里index(S )實際上還是index(CITIES,S )的簡寫,即返回 S 在集合 CITIES中的索引值。15Page 16運行以上程序后得到結果(圖 19)??梢钥闯? 從S到T的最優(yōu)行駛路線的路長為 20(進一步分析,可以得到從S到T的最優(yōu)行駛路線為S A3 B2 C1 T)。上面這個例子中

41、定義稀疏集合 ROADS 的方法是將其元素通過枚舉給出,有時這還是太麻煩了,用起來不方便。LINGO 提供了另一種定義稀疏集合的方法,這就是“元素過濾”法,能夠從構成派生集合的父集合的笛卡兒積中系統(tǒng)地過濾下來一些真正的元素。請看下面的例子。某班 8 名同學準備分成 4 個調(diào)查隊(每隊兩人)前往 4 個地區(qū)進行社會調(diào)查。假設這 8 名同學兩兩之間組隊的效率如表 4 所示(由于對稱性,只列出了上三角部分),問如何組隊可以使總效率最高?學生S1S2S3S4S5S6S7S8S1-9342156S2-173521S3-44292S4-1552S5-876S6-23S7-4表 4 這是一個典型的匹配(MA

42、TCHING)問題。把上面的效率矩陣記為 BENEFIT,用 MATCH(Si,Sj)=1 表示同學 Si,Sj 組成一隊,而 0 表示不組隊。由于對稱性,只需考慮 ij 共 32 個 0-1 變量。顯然,目標函數(shù)為 BENEFIT(Si,Sj)* MATCH(Si,Sj)之和;約束條件是每個同學只能(而且必須在)某一組,即對于任意 i 有:只要 MATCH 屬性的某個下標為 i 就加起來,此和=1。顯然,這是一個 0-1 線性規(guī)劃。模型輸入見圖 20,其中 STUDENTS 集合的元素列表“S1.S8”等價于寫成“S1 S2 S3 S4 S5 S6 S7 S8”, 它沒有相關的屬性列表,主要

43、用于表示下標集合。我們看到在派生集合 PAIRS 的定義中,增加了過濾條件,即邏輯關系式“&2#GT#&1”,意思是第 2 個父集合的元素的索引值(用“&2”表示)大于第 1 個父集合的元素的索引值(用“&1”表示)。圖 20 16Page 17選擇菜單命令“LINGO|SOLVE”運行這個程序,可以得到全局最優(yōu)值=30。由于 MATCH 變量中多數(shù)為 0,我們這里練習一下如何更清晰地瀏覽最優(yōu)解解。選擇菜單命令“LINGO|SOLUTION”,可以看到圖 21 所示的對話框。在對話框中選擇 MATCH 屬性(變量)和 Nonzeros(只顯示非零值)選項,點擊“OK”按鈕,得到的正是我們想看的

44、關于最優(yōu)解的報告(如圖 22 所示)。圖 21 圖 22 334 集合的使用小結我們把前面介紹的關于集合的不同類型及其關系小結一下,表示在圖 23 中。集合派生集合基本集合稀疏集合稠密集合元素列表法元素過濾法直接列舉法隱式列舉法圖 23 現(xiàn)在,我們歸納一下基本集合和派生集合的定義語法。基本集合的定義格式為(以下語法中凡是在方括號“ ”中的內(nèi)容,表示是可選的項,即該項可以有也可以沒有):17Page 18setname /member_list/ : attribute_list; 其中 setname 為定義的集合名,member_list 為元素列表,attribute_list 為屬性列表

45、。元素列表可以采用顯式列舉法(即直接將所有元素全部列出,元素之間用逗號或空格分開),也可以采用隱式列舉法。隱式列舉法可以有幾種不同格式,見表 5。類型隱式列舉格式示例示例集合表示的元素數(shù)字型1.n 1.5 1, 2, 3, 4, 5 字符-數(shù)字型stringM.stringNCar101.car208Car101, car102, , car208 日期(星期)型dayM.dayNMON.FRIMON, TUE, WED, THU, FRI 月份型monthM.monthN OCT.JAN OCT, NOV, DEC, JAN 年份-月份型monthYearM.monthYearNOCT200

46、1.JAN2002OCT2001, NOV2001, DEC2001, JAN2002 表 5上面的語法還告訴我們元素列表和屬性列表都是可選的。當屬性列表不在集合定義中出現(xiàn)時,這樣的集合往往只是為了將來在程序中作為一個循環(huán)變量來使用;而當元素列表不在集合定義中出現(xiàn)時,則必須在程序的數(shù)據(jù)段以賦值語句的方式直接給出元素列表。例如, 節(jié)的模型(圖10)的集合段和數(shù)據(jù)段可以分別改為:SETS: QUARTERS:DEM,RP,OP,INV; !注意沒有給出元素列表;ENDSETSDATA: QUARTERS DEM=1 40 2 60 3 75 4 25; !注意LINGO按列賦值的特點;ENDDAT

47、A 派生集合的一般定義格式為: setname(parent_set_list) /member_list/ : attribute_list; 其中與基本集合的定義相比較只是多了一個 parent_set_list(父集合列表)。父集合列表中的集合(如 set1,set2,等)稱為派生集合 setname 的父集合,它們本身也可以是派生集合。當元素列表(member_list)不在集合定義中出現(xiàn)時,還可以在程序的數(shù)據(jù)段以賦值語句的方式給出元素列表;若在程序的數(shù)據(jù)段也不以賦值語句的方式給出元素列表,則認為父集合中所有元素的組合(笛卡兒積)都是 setname 的元素。當元素列表在集合定義中出現(xiàn)

48、時,又有“元素列表法”和“元素過濾法”兩種不同方式,請參看本節(jié)前面的介紹。3.4 運算符及其優(yōu)先級在前面的很多例子里,我們陸續(xù)用到了一些運算符,現(xiàn)在歸納一下 LING0 中的三類運算符:算術運算符、邏輯運算符和關系運算符。算術運算符有 5 種:+(加法),(減法或負號),*(乘法),/(除法),(求冪)。邏輯運算符有 9 種:#AND#(與),#OR#(或),#NOT#(非),#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。邏輯運算的結果只有“真”(TRUE)和“假”(FALSE)兩個值,LINGO 中用數(shù)字 1 代表 TR

49、UE,其他值(典型的值是 0)都是 FALSE。18Page 19關系運算符有 3 種:(即(即=,大于等于)。注意在數(shù)學規(guī)劃中約束一般沒有嚴格小于、嚴格大于關系。這些運算符的優(yōu)先級如表 6 所示(同一優(yōu)先級按從左到右的順序執(zhí)行;如果有括號“()”,則括號內(nèi)的表達式優(yōu)先進行計算)。優(yōu)先級運算符最高#NOT# (負號)* / + (減法)#EQ# #NE# #GT# #GE# #LT# #LE# #AND# #OR# 最低 表 6 3.5 LINGO 函數(shù)一覽LINGO 中還包括相當豐富的數(shù)學函數(shù)和控制語句。在 LINGO 中建立優(yōu)化模型時可以引用大量的內(nèi)部函數(shù),這些函數(shù)以”符號打頭。1)常用的

50、數(shù)學函數(shù)ABS(X) 返回變量 X 的絕對值。COS(X) 返回變量 X 的余弦值(X 的單位是弧度)。EXP(X) 返回的值(其中 e 為自然對數(shù)的底,即 2.718281.)。eXFLOOR( X) 返回的整數(shù)部分(向最靠近 0 的方向取整)。LGM(X) 返回變量 X 的 gamma(伽瑪)函數(shù)的自然對數(shù)值(當 X 為整數(shù)時 LGM(X) = LOG(X-1)?。划?X 不為整數(shù)時,采用線性插值得到結果)。LOG(X) 返回變量 X 的自然對數(shù)值。SIGN(X) 返回變量 X 的符號值( X = 0 時返回+1)。SIN(X) 返回變量 X 的正弦值(X 的單位是弧度)。SMAX(lis

51、t ) 返回一列數(shù)(list)的最大值。SMIN(list ) 返回一列數(shù)(list)的最小值。TAN(X) 返回變量 X 的正切值(X 的單位是弧度)。2)集合循環(huán)函數(shù)集合循環(huán)函數(shù)的用法如下:function( setname ( set_index_list) | condition : expression_list); 其中 function 是集合函數(shù)名,有 FOR、MAX、MIN、SUM 四種; setname 是集合名;set_index_list 是集合索引列表(不需使用索引時可以省略);condition 是用邏輯表達式描述的條件(通常含有索引,無條件時可以省略);expre

52、ssion_list 是一個表達式(對FOR函數(shù),可以是一組表達式)。集合函數(shù)名的含義如下:FOR 對集合 setname 的每個元素獨立地生成約束,約束由 expression_list 描述。MAX 返回集合 setname 上的表達式的最大值。MIN 返回集合 setname 上的表達式的最小值。SUM 返回集合 setname 上的表達式的和。19Page 203)集合處理函數(shù)IN( set_name, primitive_index_1 , primitive_index_2 .) 如果集合 set_name 中包含本集合的元素索引 primitive_index_1 , primi

53、tive_index_2 .所對應的元素,則返回 1,否則返回 0。元素索引用“&1”、“&2”或INDEX 函數(shù)等形式給出,這里“&1”表示對應于第 1 個父集合的元素的索引值,“&2”表示對應于第 2 個父集合的元素的索引值。例如,如果我們想定義一個學生集合 STUDENTS(基本集合),然后由它派生一個及格學生的集合 PASSED 和一個不及格學生的集合 FAILED,可以如下定義:SETS: STUDENTS / ZHAO, QIAN, SUN, LI/:; PASSED( STUDENTS) /QIAN,SUN/:; FAILED( STUDENTS) | #NOT# IN( PAS

54、SED, &1):; ENDSETS 又如,如果集合 C 是由集合 A,B 派生的,例如:SETS: A / 1.3/:; B / X Y Z/:; C( A, B) / 1,X 1,Z 2,Y 3,X/:; ENDSETS 現(xiàn)在假設我們想判斷 C 中是否包含元素(2,Y),則可以利用以下語句(對本例,C 中確實包含元素(2,Y),所以 X=1):X = IN( C, INDEX( A, 2), INDEX( B, Y); INDEX( set_name, primitive_set_element) 給出元素 primitive_set_element 在集合 set_name 中的索引值(

55、即順序位置的編號)。如果省略 set_name , LINGO 按模型中定義的集合順序找到第一個含有元素primitive_set_element 的集合,并返回索引值。如果在所有集合中均沒有找到該元素,會給出出錯信息。WRAP(I,N) 當 I 位于區(qū)間1, N 內(nèi)時直接返回 I;一般地,返回 J = I - K *N , 其中 J 位于區(qū)間1, N , K 為整數(shù)??梢娺@個,此函數(shù)相當于數(shù)學上用 I 對 N 取模函數(shù)的值+1,即WRAP(I,N)=I (mode N)+1。此函數(shù)對 N1 無定義??梢韵氲剑撕瘮?shù)的目地之一是可以用來防止集合的索引越界。SIZE (set_name) 返回數(shù)

56、據(jù)集 set_name 中包含元素的個數(shù)。4)變量界定函數(shù)變量函數(shù)對變量的取值范圍附加限制。共四種:BND(L, X, U) 限制 L = X NEED( I); SHIPPED( I) SUPPLY( I); DATA: COST = FILE( myfile.txt); NEED = FILE( myfile.txt); SUPPLY = FILE( myfile.txt); ENDDATA END myfile.txt 文件的內(nèi)容可以是如下格式:Seattle,Detroit,Chicago,DenverCOST,NEED,SUPPLY,SHIPPED12,28,15,201600,18

57、00,1200,10001700,1900,1300,1100 ODBC 和OLE 分別提供 LINGO 與 ODBC 和 OLE 的接口,我們將在下章詳細介紹。POINTER( N) 在 Windows 下使用 LINGO 的動態(tài)連接庫(Dynamic Link Library,簡寫為 DLL) ,直接從共享的內(nèi)存中傳送數(shù)據(jù)。RANGED( variable_or_row_name) 為了保持最優(yōu)基不變,變量的費用系數(shù)或約束行的右端項允許減少的量(參見第 2 章 2.3 節(jié)敏感性分析中的 allowable decrease)。RANGEU( variable_or_row_name) 為了

58、保持最優(yōu)基不變,變量的費用系數(shù)或約束行的右端項允許增加的量(參見第 2 章 2.3 節(jié)敏感性分析中的 allowable increase)。STATUS() 返回 LINGO 求解模型結束后的最后狀態(tài):0 Global Optimum (全局最優(yōu))1 Infeasible(不可行)22Page 232 Unbounded (無界)3 Undetermined (不確定)4 (LINGO 中沒有使用該值)5 Infeasible or Unbounded (通常需要關閉“預處理”選項后重新求解模型,以確定究竟是不可行還是無界)6 Local Optimum(全局最優(yōu))7 Locally Inf

59、easible(局部不可行)8 Cutoff(目標函數(shù)達到了 Cutoff 水平)9 Numeric Error (約束中遇到了無定義的數(shù)學操作)TEXT( filename) 用于數(shù)據(jù)段中將解答結果送到文本文件 filename 中。當省略 filename 時,結果送到標準的輸出設備(通常就是屏幕)。8)其他函數(shù)IF( logical_condition, true_result, false_result) 當邏輯表達式 logical_condition 的結果為真時,返回 true_result,否則返回false_result。例如IF( X #LT# 100, 20, 15)語句

60、,當 X1 的正整數(shù)):N 點求解Barrier: 障礙法 (即內(nèi)點法) 表?37 LINGO 的主要行命令與 LINDO 類似,你隨時可以通過菜單命令“Window/Command Window (Ctrl+1)”打開36Page 37命令窗口,在命令窗口下操作。LINGO 行命令大多數(shù)與 LINDO 類似,如在命令窗口下的提示符“:”后面鍵入 COMMANDS(COM)可以看到 LINGO 的所有行命令(圖?)??梢钥闯觯琇INDO 的不少行命令在 LINGO 中不再支持,如 DATE,TABL,SDBC,F(xiàn)BS,F(xiàn)PUN,SMPN,等等。LINGO 也增加了一些與 LINDO 不同的命令

溫馨提示

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

評論

0/150

提交評論