版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 MACROBUTTON MTEditEquationSection2 Equation Chapter 1 Section 1 SEQ MTEqn r h * MERGEFORMAT SEQ MTSec r 1 h * MERGEFORMAT SEQ MTChap r 1 h * MERGEFORMAT 附錄B LINGO使用簡介LINGO軟件是美國LINDO系統(tǒng)公司開發(fā)的一套專門用于求解最優(yōu)化問題的軟件。它為求解最優(yōu)化問題提供了一個平臺,主要用于求解線性規(guī)劃、 HYPERLINK /s?wd=%E9%9D%9E%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92&tn=
2、44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y4n1bzn1-9rjTLmHmdmH6z0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHnsnWDknj01PHbkPWTzrjn1rf t _blank 非線性規(guī)劃、 HYPERLINK /s?wd=%E6%95%B4%E6%95%B0%E8%A7%84%E5%88%92&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqI
3、HckPjm4nH00T1Y4n1bzn1-9rjTLmHmdmH6z0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHnsnWDknj01PHbkPWTzrjn1rf t _blank 整數(shù)規(guī)劃、二次規(guī)劃、線性及非線性方程組等問題。它是最優(yōu)化問題的一種建模語言,包含有許多常用的函數(shù)供使用者編寫程序時調(diào)用,并提供了與其他數(shù)據(jù)文件的接口,易于方便地輸入和輸出數(shù)據(jù),求解和分析大規(guī)模最優(yōu)化問題,且執(zhí)行速度快。由于它的功能較強,所以在教學、科研、工業(yè)、商業(yè)、服務等許
4、多領域得到了廣泛的應用。一個LINGO程序一般會包括以下幾個部分:(1)集合段:集部分是LINGO模型的一個可選部分。在LINGO模型中使用集之前,必須在集部分事先定義。集部分以關鍵字“sets:”開始,以“endsets”結束。一個模型可以沒有集部分,或有一個簡單的集部分,或有多個集部分。一個集部分可以放置于模型的任何部分,但是一個集及其屬性在模型目標函數(shù)或約束條件中被引用之前必須先定義。(2)數(shù)據(jù)段:在處理模型的數(shù)據(jù)時,需要為集部分定義的某些元素在LINGO求解模型之前為其指定值。數(shù)據(jù)部分以關鍵字“data:”開始,以關鍵字“enddata”結束。(3)目標和約束段:這部分用來定義目標函數(shù)
5、和約束條件。該部分沒有開始和結束的標記。主要是要用到LINGO的內(nèi)部函數(shù),尤其是與集合有關的求和與循環(huán)函數(shù)等。(4)初始段:這個部分要以關鍵字“init:”開始,以關鍵字“endinit”結束,它的作用是對集合的屬性定義一個初值。在一般的迭代運算中,如果可以給一個接近最優(yōu)解的初始值,會大大減少程序運行的時間。(4)計算段:這一部分是以關鍵字“calc:”開始,以關鍵字“endcalc”結束。它的作用是把原始數(shù)據(jù)處理成程序模型需要的數(shù)據(jù),它的處理是在數(shù)據(jù)段輸入完以后、開始正式求解模型之前進行的。在這個段中,程序語句是順序執(zhí)行的。注意在計算段中不能有模型的決策變量。B. SEQ B. * ARAB
6、IC 1 LINGO中集合的概念在對實際問題建模的時候,總會遇到一群或多群相聯(lián)系的對象,比如消費者群體、交通工具和雇工等,LINGO允許把這些相聯(lián)系的對象聚合成集(sets)。一旦把對象聚合成集,就可以利用集來最大限度地發(fā)揮LINGO建模語言的優(yōu)勢。1.為什么使用集集是LINGO建模語言的基礎,是程序設計最強有力的基本構件。借助于集能夠用一個單一的、簡明的復合公式表示一系列相似的約束,從而可以快速方便地表達規(guī)模較大的模型。2.什么是集集是一群相聯(lián)系的對象,這些對象也稱為集的成員。一個集可能是一系列產(chǎn)品、卡車或雇員。每個集的成員可能有一個或多個與之有關聯(lián)的特征,把這些特征稱為屬性。屬性值可以預先
7、給定,也可以是未知的,有待于LINGO求解的。LINGO有兩種類型的集:原始集(primitive set)和派生集(derived set)。一個原始集是由一些最基本的對象組成的。一個派生集是用一個或多個其他集來定義的,也就是說,它的成員來自于其他已存在的集。3.原始集的定義為了定義一個原始集,必須詳細聲明:集的名稱;集的成員(可選的);集成員的屬性(可選的)。定義一個原始集,用下面的語法:setname/member_list/:attribute_list;注B. SEQ 注B. * ARABIC 1 用“”表示該部分內(nèi)容可選。同樣的,下面不再贅述。setname是用來標記集的名字,最好
8、具有較強的可讀性。集名稱必須嚴格符合標準命名規(guī)則:以字母為首字符,其后由字母(A-Z)、下劃線、阿拉伯數(shù)字(0,1,9)組成的總長度不超過32個字符的字符串,且不區(qū)分大小寫。注B. SEQ 注B. * ARABIC 2 該命名規(guī)則同樣適用于集合成員名和屬性名等的命名。member_list是集成員列表。如果集成員放在集定義中,那么對它們可采取顯式羅列和隱式羅列兩種方式。如果集成員不放在集合定義中,那么可以在隨后的數(shù)據(jù)部分定義它們。(1)當顯式羅列成員時,必須為每個成員輸入一個不同的名字,中間用空格或逗號擱開,允許混合使用。例B. SEQ 例B. * ARABIC 1 定義一個名為friends
9、的原始集,它具有成員John、Jill、Rose和Mike,屬性有sex和age。sets:friends/John Jill, Rose Mike/: sex, age;endsets(2) 當隱式羅列成員時,不必羅列出每個集成員??刹捎萌缦抡Z法:setname/member1.memberN/: attribute_list;這里的member1是集合的第一個成員名,memberN是集合的最末一個成員名。LINGO將自動產(chǎn)生中間的所有成員名。LINGO也接受一些特定的首成員名和末成員名,用于創(chuàng)建一些特殊的集合,如 REF _Ref512784251 h * MERGEFORMAT 表B.1
10、。 表B. SEQ 表B. * ARABIC 1 隱式羅列成員示例隱式成員列表格式示例所產(chǎn)生集成員1.n1.51,2,3,4,5StringM.StringNCar2.Car14Car2,Car3,Car4,Car14DayM.DayNMon.FriMon,Tue,Wed,Thu,FriMonthM.MonthNOct.JanOct,Nov,Dec,JanMonthYearM.MonthYearNOct2001.Jan2002Oct2001,Nov2001,Dec2001,Jan2002(3)集成員不放在集定義中,而在隨后的數(shù)據(jù)部分來定義。例B. SEQ 例B. * ARABIC 2 集定義示
11、例。sets: !集部分;friends: sex, age;endsetsdata: !數(shù)據(jù)部分;friends, sex, age=John 1 16Jill 0 14Rose 0 17Mike 1 13;enddata注B. SEQ 注B. * ARABIC 3 開頭用感嘆號(?。┍硎咀⑨?,可跨多行。末尾用分號(;)表示語句結束。在集部分只定義了一個集friends,并未指定成員。在數(shù)據(jù)部分羅列了集成員John、Jill、Rose和Mike,并對屬性sex和age分別給出了值。集成員無論用何種字符標記,它的索引都是從1開始連續(xù)計數(shù)。在attribute_list可以指定一個或多個集成員的
12、屬性,屬性之間必須用逗號隔開。4.定義派生集為了定義一個派生集,必須詳細說明集的名稱和父集的名稱,而集成員和集成員的屬性是可選的??捎孟旅娴恼Z法定義一個派生集:setname(parent_set_list)/member_list/:attribute_list;setname是集的名字。parent_set_list是已定義集的列表,多個時必須用逗號隔開。如果沒有指定成員列表,那么LINGO會自動創(chuàng)建父集成員的所有組合作為派生集的成員。派生集的父集既可以是原始集,也可以是其他的派生集。例B. SEQ 例B. * ARABIC 3 派生集定義示例。sets: product/A B/; ma
13、chine/M N/; week/1.2/; allowed(product, machine, week): x;endsetsLINGO生成了三個父集的所有組合共八組作為allowed集的成員。如 REF _Ref512793098 h * MERGEFORMAT 表B.2所列。表B. SEQ 表B. * ARABIC 2 集合allowed的成員編號成員1(A,M,1)2(A,M,2)3(A,N,1)4(A,N,2)5(B,M,1)6(B,M,2)7(B,N,1)8(B,N,2)成員列表被忽略時,派生集成員由父集成員所有的組合構成,這樣的派生集合稱為稠密集。如果限制派生集的成員,使它成為
14、父集成員所有組合構成的集合的一個子集,這樣的派生集稱為稀疏集。同原始集一樣,派生集成員的聲明也可以放在數(shù)據(jù)部分。一個派生集的成員列表有兩種方式生成。(1)顯式羅列派生集的成員allowed(product, machine, week)/A M 1, A N 2, B N 1/;(2)設置成員資格過濾器如果需要生成一個大的、稀疏集,那么顯式羅列就十分麻煩。但是許多稀疏集的成員都滿足一些條件以和非成員相區(qū)分??梢园堰@些邏輯條件看作過濾器,在LINGO生成派生集的成員時把使邏輯條件為假的成員從稠密集中過濾掉。例B. SEQ 例B. * ARABIC 4 稀疏集示例。sets: !學生集:性別屬性s
15、ex,1表示男性,0表示女性;年齡屬性age; students/John,Jill,Rose,Mike/:sex,age; !男學生和女學生的聯(lián)系集:友好程度屬性friend,0,1之間的數(shù); linkmf(students,students)|sex(&1)#eq#1 #and# sex(&2)#eq#0: friend; !男學生和女學生的友好程度大于0.5的集; linkmf2(linkmf)|friend(&1,&2)#gt#0.5: x;endsetsdata: sex,age=1 16, 0 14, 0 17, 0 13; friend=0.3, 0.5, 0.6;enddata
16、用豎線(|)來標記一個成員資格過濾器的開始。#eq#是邏輯運算符,用來判斷是否“相等”。&1可看作派生集的第1個原始父集的索引,它取遍該原始父集的所有成員;&2可看作派生集的第2個原始父集的索引,它取遍該原始父集的所有成員;&3,&4,以此類推。注意如果派生集B的父集是另外的派生集A,那么上面所說的原始父集是集A向前回溯到最終的原始集,其順序保持不變,并且派生集A的過濾器對派生集B仍然有效。因此,派生集的索引個數(shù)是最終原始父集的個數(shù),索引的取值是從原始父集到當前派生集所作限制的總和。總的來說,LINGO可識別的集只有兩種類型:原始集和派生集。在一個模型中,原始集是基本的對象,不能再被拆分成更小
17、的組分。原始集可以由顯式羅列和隱式羅列兩種方式來定義。當用顯式羅列方式時,需在集成員列表中逐個輸入每個成員。當用隱式羅列方式時,只需在集成員列表中輸入首成員和末成員,而中間的成員由LINGO產(chǎn)生。另一方面,派生集是由其他的集來創(chuàng)建。這些集被稱為該派生集的父集。一個派生集既可以是稀疏的,也可以是稠密的。稠密集包含了父集成員的所有組合(有時也稱為父集的笛卡爾乘積)。稀疏集僅包含了父集的笛卡爾乘積的一個子集,可通過顯式羅列和成員資格過濾器這兩種方式來定義,顯式羅列方法就是逐個羅列稀疏集的成員,成員資格過濾器方法通過使用稀疏集成員必須滿足的邏輯條件從稠密集成員中過濾出稀疏集的成員。不同集類型的關系如
18、REF _Ref512801100 h * MERGEFORMAT 圖B.1所示。圖B. SEQ 圖B. * ARABIC 1 LINGO集合關系圖B.2 LINGO數(shù)據(jù)部分和初始部分在處理模型的數(shù)據(jù)時,需要為集指派一些成員并且在LINGO求解模型之前為集的某些屬性指定值。為此,LINGO為用戶提供了兩個可選部分:輸入集成員和數(shù)據(jù)的數(shù)據(jù)部分(Data Section)和為決策變量設置初始值的初始部分(Init Section)。B.2.1 模型的數(shù)據(jù)部分 1.數(shù)據(jù)部分入門數(shù)據(jù)部分以關鍵字“data:”開始,以關鍵字“enddata”結束。在這里,可以指定集成員、集的屬性。其語法如下:objec
19、t_list=value_list;對象列(object_list)包含要指定值的屬性名、要設置集成員的集名,用逗號或空格隔開。一個對象列中至多有一個集名,而屬性名可以有任意多。如果對象列中有多個屬性名,那么它們的類型必須一致。數(shù)值列(value_list)包含要分配給對象列中的對象的值,用逗號或空格隔開。注意屬性值的個數(shù)必須等于集成員的個數(shù)。例B. SEQ 例B. * ARABIC 5sets: 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。也可采
20、用如下例子中的復合數(shù)據(jù)聲明(data statement)實現(xiàn)同樣的功能。例B. SEQ 例B. * ARABIC 6sets: set1/A,B,C/: X,Y;endsetsdata: X,Y=1 4 2 5 3 6;enddata REF _Ref512803707 h * MERGEFORMAT 例B.6中可能會認為X被指定了1、4和2三個值,因為它們是數(shù)值列中前三個,而正確的答案是1、2和3。假設對象列有n個對象,LINGO在為對象指定值時,首先在n個對象的第1個索引處依次分配數(shù)值列中的前n個對象,然后在n個對象的第2個索引處依次分配數(shù)值列中緊接著的n個對象,以此類推。2.參數(shù)輸入在
21、數(shù)據(jù)部分也可以指定一些標量變量(scalar variables)。當一個標量變量在數(shù)據(jù)部分確定時,稱之為參數(shù)。例如,假設模型中用利率8%作為一個參數(shù),就可以輸入一個利率作為參數(shù)。例B. SEQ 例B. * ARABIC 7data: interest_rate=0.08;enddata實際中也可以同時指定多個參數(shù)。例B. SEQ 例B. * ARABIC 8data: interest_rate,inflation_rate=0.08 0.03;enddata3.實時數(shù)據(jù)處理在某些情況,對于模型中的某些數(shù)據(jù)并不是定值。比如模型中有一個通貨膨脹率的參數(shù),如果在2%6%范圍內(nèi),對不同的值求解模型
22、,觀察模型的結果對通貨膨脹的依賴程度。那么把這種情況稱為實時數(shù)據(jù)處理。在本該放數(shù)的地方輸入一個問號(?)。例B. SEQ 例B. * ARABIC 9data: interest_rate,inflation_rate=0.08 ?;enddata圖B. SEQ 圖B. * ARABIC 2 交互式輸入對話框每一次求解模型時,LINGO都會提示為參數(shù)inflation_rate輸入一個值。在WINDOWS操作系統(tǒng)下,將會接收到一個類似 REF _Ref512826490 h * MERGEFORMAT 圖B.2的對話框。直接輸入一個值后再單擊OK按鈕,LINGO就會把輸入的值指定給inflat
23、ion_rate,然后繼續(xù)求解模型。 除了參數(shù)之外,也可以實時輸入集的屬性值,但不允許實時輸入集成員名。 4.指定屬性為一個值可以在數(shù)據(jù)聲明的右邊輸入一個值來把所有的成員的該屬性指定為一個值??聪旅娴睦印@鼴. SEQ 例B. * ARABIC 10sets: days /MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata: needs = 20;enddata REF _Ref512826931 h * MERGEFORMAT 例B.10中LINGO將用20指定days集的所有成員的needs屬性。對于多個屬性的情形,見下例。例B. SEQ 例B. * ARAB
24、IC 11sets: days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata: needs cost = 20 100;enddata 5.數(shù)據(jù)部分的未知數(shù)值表示有時只想為一個集的部分成員的某個屬性指定值,而讓其余成員的該屬性保持未知,以便讓LINGO去求出它們的最優(yōu)值。在數(shù)據(jù)聲明中輸入一個逗號(數(shù)據(jù)之間的逗號分隔符不計入)表示該位置對應的集成員的屬性值未知。兩個逗號間可以有空格。例B. SEQ 例B. * ARABIC 12sets: years/1.5/: capacity;endsetsdata: capacity = , 34, 20 ,
25、, ;enddata屬性capacity的第2個和第3個值分別為34和20,其余的未知。這里34和20之間的逗號是數(shù)據(jù)分隔符,第1個、第3個、第4個逗號表示未知值。B.2.2 模型的初始部分初始部分是LINGO提供的另一個可選部分。在初始部分中,與數(shù)據(jù)部分中的數(shù)據(jù)聲明相同,可以輸入初始聲明(initialization statement)。在實際問題建模時,初始部分并不起到描述模型的作用,在初始部分輸入的值僅被LINGO求解器當作初始點來用,并且僅僅對非線性模型有用。這與數(shù)據(jù)部分指定變量的值不同,LINGO求解器可以自由改變初始部分初始化的變量的值。一個初始部分以“init:”開始,以“en
26、dinit”結束。初始部分的初始聲明規(guī)則和數(shù)據(jù)部分的數(shù)據(jù)聲明規(guī)則相同。也就是說,我們可以在聲明的左邊同時初始化多個集屬性,可以把集屬性初始化為一個值,也可以用問號實現(xiàn)實時數(shù)據(jù)處理,還可以用逗號指定未知數(shù)值。例B. SEQ 例B. * ARABIC 13init: X, Y = 0, 0.1;endinitY=log(X);X2+Y2=1;好的初始點會減少模型的求解時間。B.3 LINGO函數(shù)B.3.1 運算符及其優(yōu)先級 LINGO中的運算符可以分為3類:算法運算符、邏輯運算符和關系運算符。1.算術運算符算術運算符是針對數(shù)值進行操作的。LINGO提供了5種二元運算符:(求冪)、(乘)、(除)、(
27、加)、(減)。LINGO唯一的一元算術運算符是取反運算“”。運算符的運算次序為從左到右按優(yōu)先級高低來執(zhí)行。運算的次序可以用圓括號“()”來改變。2.邏輯運算符在LINGO中,邏輯運算符主要用于集循環(huán)函數(shù)的條件表達式中,來控制在函數(shù)中哪些集成員被包含,哪些被排斥。在創(chuàng)建稀疏集時用在成員資格過濾器中。LINGO具有個邏輯運算符,這些運算符分為兩類:#and#(與),#or#(或),#not#(非) ,這三個運算符是參與邏輯值之間的運算,其結果還是邏輯值;#eq#(等于),#ne#(不等于),#gt#(大于),#ge#(大于等于),#lt#(小于),#le#(小于等于)是數(shù)與數(shù)之間的比較運算符,其結
28、果為邏輯值。3.關系運算符LINGO中有3個關系運算符:(等價于(等價于=,大于等于),=(等于)。注意LINGO中優(yōu)化模型的約束一般沒有嚴格大于、嚴格小于。在LINGO中,關系運算符主要是被用在模型中,來指定一個表達式的左邊是否等于、小于等于、或者大于等于右邊,形成模型的一個約束條件。關系運算符與邏輯運算符#eq#、#le#、#ge#截然不同。運算符的優(yōu)先級如 REF _Ref513044925 h * MERGEFORMAT 表B.3所示。表B. SEQ 表B. * ARABIC 3 運算符的優(yōu)先級優(yōu)先級運算符高級#not#,-(取反),#eq#,#ne#,#gt#,#ge#,#lt#,#
29、le#and#,#or#最低B.3.2 LINGO函數(shù)簡介1.基本數(shù)學函數(shù)LINGO中有相當豐富的數(shù)學函數(shù),這些函數(shù)的用法簡單。 REF _Ref875673 h 表B.4對各個函數(shù)的用法做了簡單介紹。表B. SEQ 表B. * ARABIC 4 基本數(shù)學函數(shù)函數(shù)調(diào)用格式含義abs(x)返回x的絕對值。sin(x)返回x的正弦值(x的單位是弧度)。cos(x)返回x的余弦值(x的單位是弧度)。tan(x)返回x的正切值(x的單位是弧度)。exp(x)返回ex的值。log(x)返回x的自然對數(shù)值。lgm(x)返回x的伽瑪(Gamma)函數(shù)的自然對數(shù)值。mod(x,y)返回x對y取模的結果。sig
30、n(x)返回x的符號值。pow(x,y)返回xy的值。sqr(x)返回x的平方。sqrt(x)返回x的正平方根值。floor(x)返回x的整數(shù)部分。當x=0時,返回不超過x的最大整數(shù);當x= a(j);end求得需要的總?cè)藬?shù)最少為22人,其中每天的安排如 REF _Ref513053212 h * MERGEFORMAT 表B.5所示。表B. SEQ 表B. * ARABIC 5 每天的人數(shù)安排星期星期一星期二星期三星期四星期五星期六星期日人數(shù)82063304.變量界定函數(shù)變量界定函數(shù)能夠?qū)崿F(xiàn)對變量取值范圍的附加限制,共4種:bin(x):限制x為0或1;bnd(L,x,U):限制LxU;fr
31、ee(x):取消對變量x的默認下界為0的限制,即x可以取任意實數(shù);gin(x):限制x為整數(shù)。在默認情況下,LINGO規(guī)定變量是非負的,也就是說下界為0,上界為+。free取消了默認的下界為0的限制,使變量也可以取負值。bnd用于設定一個變量的上下界,它也可以取消默認下界為0的約束。5.概率函數(shù)(1)pbn(p,n,x)二項分布的分布函數(shù)在x點的取值。當n和(或)x不是整數(shù)時,用線性插值法進行計算。(2)pcx(n,x)自由度為n的2分布的分布函數(shù)在x點的取值。(3)peb(a,x)當?shù)竭_負荷(平均服務強度)為a,服務系統(tǒng)有x個服務臺,且系統(tǒng)容量無限時的Erlang繁忙概率。(4)pel(a,
32、x)當?shù)竭_負荷(平均服務強度)為a,服務系統(tǒng)有x個服務臺,且不允許排隊時的Erlang繁忙概率。(5)pfd(n,d,x)自由度為n和d的F分布的分布函數(shù)在x點的取值。(6)pfs(a,x,c)當負荷上限為a,顧客數(shù)為c,平行服務臺數(shù)量為x時,有限源的Poisson服務系統(tǒng)的等待或返修顧客數(shù)的期望值。a等于顧客數(shù)乘以平均服務時間,再除以平均返修時間。當c和(或)x不是整數(shù)時,采用線性插值進行計算。(7)phg(pop,g,n,x)超幾何(Hypergeometric)分布的分布函數(shù)在x點的取值。pop表示產(chǎn)品總數(shù),g是正品總數(shù)。從所有產(chǎn)品中任意取出n(npop)件,取出的正品數(shù)為x。pop,g
33、,n和x都可以是非整數(shù),這時采用線性插值進行計算。(8)ppl(a,x)Poisson分布的線性損失函數(shù),即返回max(0,x)的期望值,其中隨機變量服從均值為a的Poisson分布。(9)pps(a,x)均值為a的Poisson分布的分布函數(shù)在x點的取值。當x不是整數(shù)時,采用線性插值進行計算。(10)psl(x)單位正態(tài)線性損失函數(shù),即返回max(0,x)的期望值,其中隨機變量服從標準正態(tài)分布。(11)psn(x)標準正態(tài)分布的分布函數(shù)在x點的取值。(12)ptd(n,x)自由度為n的t分布的分布函數(shù)在x點的取值。(13)qrand(seed)產(chǎn)生 (0,1)區(qū)間上的擬隨機數(shù)向量。qrand
34、只允許在模型的數(shù)據(jù)部分使用,它將用擬隨機數(shù)填滿集屬性。通常,聲明一個mn的二維表,m表示運行實驗的次數(shù),n表示每次實驗所需的隨機數(shù)的個數(shù)。在行內(nèi),隨機數(shù)是獨立分布的;在行間,隨機數(shù)是非常均勻的。這些隨機數(shù)是用“分層取樣”的方法產(chǎn)生的。例B. SEQ 例B. * ARABIC 21 model:sets: rows/1.4/; cols/1.2/; table(rows,cols): x;endsetsdata: X=qrand(); !qrand(seed)中沒有指明種子,LINGO用系統(tǒng)時間構造種子;enddataend(14)rand(seed)返回0和1間的一個偽隨機數(shù),依賴于指定的種子
35、。典型用法是U(I+1)=rand(U(I)。注意如果seed不變,那么產(chǎn)生的隨機數(shù)也不變。例B. SEQ 例B. * ARABIC 22 利用rand產(chǎn)生15個服從標準正態(tài)分布的隨機數(shù)和自由度為2的分布的隨機數(shù)。model:sets: series/1.15/: u, znorm, zt;endsets u(1)=rand(0.1234); !產(chǎn)生第一個(0,1)區(qū)間上隨機數(shù); for(series(i)|i#gt# 1:u(i)=rand(u(i-1); !產(chǎn)生其余的(0,1)區(qū)間上的隨機數(shù); for(series(i): psn(znorm(i)=u(i); !正態(tài)分布隨機數(shù); ptd(
36、2,zt(i)=u(i); !自由度為2的t分布隨機數(shù); free(znorm(i); free(zt(i); !ZNORM 和 ZT 可以是負數(shù);end6.金融函數(shù)目前LINGO提供了兩個金融函數(shù)。(1)fpa(I,N)返回如下情形的凈現(xiàn)值:單位時段利率為I,連續(xù)個時段支付,每個時段支付單位費用。若每個時段支付x單位的費用,則凈現(xiàn)值可用x乘以fpa(I,N)算得。fpa的計算公式為.例B. SEQ 例B. * ARABIC 23 貸款總金額50000元,貸款年利率5.31%,采取分期付款方式(每年年末還固定金額,直至還清)。問擬貸款10年,每年需償還多少元?解 設貸款的總額為元,年利率為,總
37、貸款時間為年,每年的等額還款額為元。設第年的欠款為(),則有遞推關系,.于是有,可以遞推地得到因而得到貸款總額、年利率、總貸款時間年、每年的還款額的如下關系, MACROBUTTON MTPlaceRef * MERGEFORMAT SEQ MTEqn h * MERGEFORMAT ( SEQ MTEqn c * Arabic * MERGEFORMAT 1)所以每年的還款額. MACROBUTTON MTPlaceRef * MERGEFORMAT SEQ MTEqn h * MERGEFORMAT ( SEQ MTEqn c * Arabic * MERGEFORMAT 2)代入數(shù)據(jù),計
38、算得每年需償還元。計算的LINGO程序如下:A0=50000; r=0.0531; N=10;A0=x1*fpa(r,N); !利用LINGO函數(shù)解方程計算;x2=A0*(1+r)N*r/(1+r)N-1); !利用還款額公式 GOTOBUTTON ZEqnNum480782 * MERGEFORMAT REF ZEqnNum480782 * Charformat ! * MERGEFORMAT (2)計算(2)fpl(I,N)返回如下情形的凈現(xiàn)值:單位時段利率為I,第N個時段支付單位費用。fpl(I,N)的計算公式為 .這兩個函數(shù)間的關系為 .例B. SEQ 例B. * ARABIC 24
39、驗證.驗證的LINGO程序如下:sets:num/1.10/;endsetsr=0.05; a=fpa(r,10);b=sum(num(i):fpl(r,i);B.4 LINGO與其他文件的數(shù)據(jù)傳遞B.4.1 通過文本文件傳遞數(shù)據(jù)在LINGO軟件中,通過文本文件輸入數(shù)據(jù)使用的是file函數(shù),輸出結果使用的是text函數(shù)。下面介紹這兩個函數(shù)的詳細用法。1.通過文本文件輸入數(shù)據(jù)file函數(shù)通??梢栽诩隙魏蛿?shù)據(jù)段使用,但不允許嵌套使用。這個函數(shù)的一般用法是file(filename);其中filename為存放數(shù)據(jù)的文件名,文件名可以包含完整的路徑名,沒有指定路徑時表示在當前目錄下尋找這個文件。該
40、文件必須是文本(或ASCII碼文件),可以用Windows附件中的寫字板或記事本創(chuàng)建,文件中可以包含多個記錄,記錄之間用“”分開,同一記錄內(nèi)的多個數(shù)據(jù)之間用逗號或空格分開。執(zhí)行一次file,讀入一個記錄的數(shù)據(jù)。下面通過一個簡單的例子來說明。例B. SEQ 例B. * ARABIC 25 file函數(shù)的用法示例。假設存放數(shù)據(jù)的文本文件gdataB25.txt的內(nèi)容如下:Seattle,Detroit,Chicago,DenverCOST,NEED,SUPPLY,ORDERED12,28,15,201600,1800,1200,10001700,1900,1300,1100現(xiàn)在,在LINGO模型窗
41、口中建立如下LINGO模型:model:sets:myset/file(gdataB25.txt)/:file(gdataB25.txt);endsetsdata:cost=file(gdataB25.txt); !LINGO是不區(qū)分大小寫字母的;need=file(gdataB25.txt);supply=file(gdataB25.txt);enddataend運行上述LINGO模型的結果為:文本文件gdataB25.txt中第一行的4個字符串賦值給集合myset的4個成員,第二行的4個字符串COST,NEED,SUPPLY,ORDERED(或cost,need,supply,ordere
42、d)成為集合myset的4個屬性,第三行的4個數(shù)值賦值給屬性cost,第四行的4個數(shù)值賦值給屬性need,第五行的4個數(shù)值賦值給屬性supply,未賦值的屬性ordered作為決策向量。顯然,當僅僅是輸入數(shù)據(jù)改變了,只需要改變輸入文件gdataB25.txt,而程序無需改變,這是非常有利的,因為這樣就做到了程序與數(shù)據(jù)的分離。2.通過文本文件輸出數(shù)據(jù)text函數(shù)用于文本文件輸出數(shù)據(jù),通常只在數(shù)據(jù)段使用這個函數(shù)。這個函數(shù)的語法為:text(filename,a)它用于數(shù)據(jù)段中將解答結果輸出到文本文件filename中,當省略filename時,結果送到標準的輸出設備(通常就是屏幕)。當有第二個參數(shù)
43、a時,數(shù)據(jù)是以追加(append)的方式輸出到文本文件,否則,是新建一個文本文件(如果文件已經(jīng)存在,則其中的內(nèi)容將會被覆蓋)供輸出數(shù)據(jù)。text函數(shù)的一般調(diào)用格式為:text(results.txt)=屬性名;其中results.txt是文件名,它可以由用戶按自己的意愿命名,該函數(shù)的執(zhí)行結果是把屬性名對應的取值輸出到文本文件results.txt中。例B. SEQ 例B. * ARABIC 26 已知某種商品6個倉庫的存貨量,8個客戶對該商品的需求量,單位商品運價如 REF _Ref513735941 h * MERGEFORMAT 表B.6所示。試確定6個倉庫到8個客戶的商品調(diào)運數(shù)量,使總的
44、運輸費用最小。表B. SEQ 表B. * ARABIC 6 商品信息數(shù)據(jù)表單位運價 客戶倉庫V1V2V3V4V5V6V7V8存貨量W16267425960W24953858255W35219743351w47673927143W52395726541W65522814352需求量3537223241324338解 設表示第個倉庫運到第個客戶的商品數(shù)量,表示第個倉庫到第個客戶的單位運價,表示第個客戶的需求量,表示第個倉庫的存貨量,建立如下線性規(guī)劃模型, s.t. 在 REF _Ref513753854 h * MERGEFORMAT 例B.26的運輸問題中,使用文本文件輸入和輸出數(shù)據(jù)。求得的最小
45、運輸費用為664,求得的最優(yōu)解為,其他.求解的LINGO程序如下:model:sets: warehouses/1.6/: e; vendors/1.8/: d; links(warehouses,vendors): c,x;endsetsdata: !數(shù)據(jù)部分;e=file(gdataB26_1.txt); d=file(gdataB26_1.txt); c=file(gdataB26_1.txt); text(gdataB26_2.txt)=table(x); !把求解結果以表格形式輸出到文本文件gd252.txt中;enddatamin=sum(links(i,j): c(i,j)*x(
46、i,j); !目標函數(shù);for(warehouses(i):sum(vendors(j): x(i,j)=e(i); !約束條件;for(vendors(j):sum(warehouses(i): x(i,j)=d(j);end其中文本文件gdataB26_1.txt中的內(nèi)容如下:60 55 51 43 41 5235 37 22 32 41 32 43 386 2 6 7 4 2 5 94 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3注B. SEQ 注B. * ARABIC 5 文本文件gd
47、ataB26_1.txt必須放在LINGO程序所在目錄下。注B. SEQ 注B. * ARABIC 6 在 REF _Ref513753854 h * MERGEFORMAT 例B.26數(shù)學模型中是一個矩陣,即二維向量,在上述LINGO程序中,屬性c數(shù)據(jù)(LINGO中通過c(i,j)引用屬性的值)的排列方式為 c(1,1),c(1,2),c(1,8),c(2,1),c(2,2), ,c(2,8), ,c(6,1),c(6,2), ,c(6,8);即LINGO中的數(shù)據(jù)是逐行排列的。B.4.2 LINGO與EXCEL文件之間的數(shù)據(jù)傳遞LINGO通過ole函數(shù)實現(xiàn)與EXCEL文件傳遞數(shù)據(jù),使用ole
48、函數(shù)既可以從EXCEL文件中輸入數(shù)據(jù),也能把計算結果輸出到EXCEL文件。1.通過EXCEL文件輸入數(shù)據(jù)ole函數(shù)只能用在模型的集定義段、數(shù)據(jù)段和初始段。使用格式為object_list = OLE(spreadsheet_file , range_name_list);其中spreadsheet_file是電子表格文件的名稱,應當包括擴展名(如*.xls,*.xlsx等),還可以包含完整的路徑名,只要字符數(shù)不超過64即可;range_name_list是指文件中包含數(shù)據(jù)的單元范圍(單元范圍的格式與EXCEL中工作表的單元范圍格式一致)。其中spreadsheet_file和range_nam
49、e_list都是可以缺省的。具體地說,當從EXCEL中向LINGO模型中輸入數(shù)據(jù)時,在集定義段可以直接采用“ole()”的形式讀入集成員,但在數(shù)據(jù)段和初始段應當采用“屬性=ole()”的賦值形式。2.通過EXCEL文件輸出數(shù)據(jù) ole函數(shù)能把數(shù)據(jù)輸出到EXCEL文件,調(diào)用格式為OLE( spreadsheet_file , range_name_list) = object_list;其中對象列表object_list中的元素用逗號分隔,spreadsheet_file是輸出值所保存到的EXCEL文件名,如果文件名缺省,默認的文件名是當前EXCEL軟件所打開的文件。域名列表range_name
50、_list是表單中的域名,所在的單元用于保存對象列表中的屬性值,表單中的域名必須與對象列表中的屬性一一對應,并且域名所對應的單元大小(數(shù)據(jù)塊的大?。┎粦∮谧兞克臄?shù)據(jù),如果單元中原來有數(shù)據(jù),則ole輸出語句運行后原來的數(shù)據(jù)將被新的數(shù)據(jù)覆蓋。 要注意ole函數(shù)用于輸出和輸入之間的差異,只要記住 ole( ) = object_list; 輸出, object_list = ole( ); 輸入。例B. SEQ 例B. * ARABIC 27(續(xù) REF _Ref513753854 h * MERGEFORMAT 例B.26)在 REF _Ref513753854 h * MERGEFORM
51、AT 例B.26的運輸問題中,使用EXCEL文件輸入和輸出數(shù)據(jù)。首先,我們用EXCEL建立一個名為gdata27.xlsx的EXCEL數(shù)據(jù)文件,參見 REF _Ref513754718 h * MERGEFORMAT 圖B.4。為了能夠通過ole函數(shù)與LINGO傳遞數(shù)據(jù),我們需要對這個文件中的數(shù)據(jù)進行命名,具體做法是:我們用鼠標選中這個表格的A1:H6單元,然后選擇EXCEL的菜單命令“插入名稱定義”,這時將會彈出一個對話框,請您輸入名字,例如可以將它命名為cost(LINGO禁止使用c作為域名),同理,我們將I1:I7單元命名為e,將A7:H7單元命令為d,將A9:H14單元命名為x。一般來
52、說,這些單元取什么名字是無所謂的,只要LINGO調(diào)用時使用對應的名字就可以了。但最好是這些單元的名稱(稱為域名)與LINGO對應的屬性名同名,將來LINGO調(diào)用時就可以省略域名。圖B. SEQ 圖B. * ARABIC 4 運輸問題的已知數(shù)據(jù)model:sets: warehouses/1.6/: e; vendors/1.8/: d; links(warehouses,vendors): c,x;endsetsdata: !數(shù)據(jù)部分;e=ole(gdataB27.xlsx); !域名與屬性名相同時,調(diào)用時省略域名;d=ole(gdataB27.xlsx); c=ole(gdataB27.xl
53、sx,cost); !域名與屬性名不相同時,調(diào)用時必須提供域名;ole(gdataB27.xlsx)=x; !把求解結果輸出到EXCEL文件;enddatamin=sum(links(i,j): c(i,j)*x(i,j); !目標函數(shù);for(warehouses(i):sum(vendors(j): x(i,j)=e(i); !約束條件;for(vendors(j):sum(warehouses(i): x(i,j)=d(j);end求解結果的輸出內(nèi)容如 REF _Ref513754727 h * MERGEFORMAT 圖B.5所示。圖B. SEQ 圖B. * ARABIC 5 求解結果
54、的輸出數(shù)據(jù)注B. SEQ 注B. * ARABIC 7 LINGO要輸入外部EXCEL文件中的數(shù)據(jù),必須預先用EXCEL軟件把要操作的EXCEL文件打開,否則LINGO是無法輸入數(shù)據(jù)的。例B. SEQ 例B. * ARABIC 28(續(xù) REF _Ref513756428 h * MERGEFORMAT 例B.27)使用EXCEL的單元范圍作為域名,輸入或輸出屬性的值。我們使用EXCEL的單元范圍作為域名,不需要像 REF _Ref513756428 h * MERGEFORMAT 例B.27那樣,需要預先定義輸入或輸出數(shù)據(jù)對應的域名,才能向LINGO輸入或輸出數(shù)據(jù)。model:sets: w
55、arehouses/1.6/: e; vendors/1.8/: d; links(warehouses,vendors): c,x;endsetsdata: !數(shù)據(jù)部分;e=ole(gdataB27.xlsx, I1:I7); d=ole(gdataB27.xlsx, A7:H7); c=ole(gdataB27.xlsx, A1:H6); ole(gdataB27.xlsx,A9:H14)=x; !把求解結果輸出到EXCEL文件;enddatamin=sum(links(i,j): c(i,j)*x(i,j); !目標函數(shù);for(warehouses(i):sum(vendors(j):
56、 x(i,j)=e(i); !約束條件;for(vendors(j):sum(warehouses(i): x(i,j)=d(j);endB.5 LINGO子模型B.5.1 子模型的定義和求解在 LINGO 9.0 及更早的版本中,在每個LINGO 模型窗口中只允許有一個優(yōu)化模型,可以稱為主模型(MAIN MODEL)。在LINGO 10.0及以后的版本中,每個LINGO 模型窗口中除了主模型外,用戶還可以定義子模型(SUBMODEL)。子模型可以在主模型的計算段中被調(diào)用,這就進一步增強了LINGO的編程能力。子模型必須包含在主模型之內(nèi),即必須位于以“MODEL:”開頭、以“END”結束的模塊
57、內(nèi)。同一個主模型中,允許定義多個子模型,所以每個子模型本身必須命名,其基本語法是:SUBMODEL submodel_name:可執(zhí)行語句(約束+目標函數(shù));ENDSUBMODEL其中submodel_name是該子模型的名字,可執(zhí)行語句一般是一些約束語句,也可能包含目標函數(shù),但不可以有自身單獨的集合段、數(shù)據(jù)段、初始段和計算段。也就是說,同一個主模型內(nèi)的變量都是全局變量,這些變量對主模型和所有子模型同樣有效。如果已經(jīng)定義了子模型 submodel_name,則在計算段中可以用語句“SOLVE(submodel_name);”求解這個子模型。同一個LINGO主模型中,允許定義多個子模型。例B.
58、SEQ 例B. * ARABIC 29 用LINGO求下列方程組的所有解。model:submodel maincon: !定義方程子模型;x2+y2=4;x2-y2=1;endsubmodelsubmodel con1: !定義附加約束子模型;free(x);x0;endsubmodelsubmodel con2: !定義附加約束子模型;free(y); y0;endsubmodelsubmodel con3: !定義附加約束子模型;free(x); free(y);x0; y0;endsubmodelcalc:solve(maincon); !調(diào)用子模型,求第一象限中的解;solve(ma
59、incon,con1); !調(diào)用兩個子模型,求第二象限中的解;solve(maincon,con2); !調(diào)用兩個子模型,求第四象限中的解;solve(maincon,con3); !調(diào)用兩個子模型,求第三象限中的解;endcalcend求上述LINGO模型時,需要把求解器設置為全局求解器。依次調(diào)用4個子模型,求得方程組的解依次為;.例B. SEQ 例B. * ARABIC 30 分別求解以下4個優(yōu)化問題: (1)在滿足約束且非負的條件下,求的最大值; (2)在滿足約束且非負的條件下,求的最小值; (3)在滿足約束且可取任何實數(shù)的條件下,求的最大值; (4)在滿足約束且可取任何實數(shù)的條件下,求
60、的最小值??梢跃帉懭缦翷INGO程序:model:submodel obj1:max=x-y;endsubmodelsubmodel obj2:min=x+y;endsubmodelsubmodel con1:x2+4*y2=1;endsubmodelsubmodel con2:free(x); free(y);endsubmodelcalc:write(問題1的解:, newline(1); solve(obj1,con1);write(問題2的解:, newline(1); solve(obj2,con1);write(問題3的解:, newline(1); solve(obj1,con1
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【新課標Ⅲ卷】高三第二次全國大聯(lián)考語文試卷(含答案)
- 愛學習有自信幼兒舞蹈創(chuàng)編15課件講解
- 2025年專業(yè)期刊發(fā)行協(xié)議
- 2025年合伙勞動分工協(xié)議
- 2025年教育捐贈合同樣本
- 2025年度教育機構教學質(zhì)量擔保合同全文4篇
- 2025版危品運輸企業(yè)安全文化建設合同3篇
- 2024版智能家居系統(tǒng)集成安裝合同
- 2025年留學家庭教育咨詢與心理輔導服務合同4篇
- 2025版學生入學校園體育設施維護與服務合同2篇
- 2024公路瀝青路面結構內(nèi)部狀況三維探地雷達快速檢測規(guī)程
- 2024年高考真題-地理(河北卷) 含答案
- 2024光儲充一體化系統(tǒng)解決方案
- 處理后事授權委托書
- 食材配送服務方案投標方案(技術方案)
- 足療店營銷策劃方案
- 封條(標準A4打印封條)
- 2024年北京控股集團有限公司招聘筆試參考題庫含答案解析
- 延遲交稿申請英文
- 運動技能學習與控制課件第十章動作技能的指導與示范
- 石油天然氣建設工程交工技術文件編制規(guī)范(SYT68822023年)交工技術文件表格儀表自動化安裝工程
評論
0/150
提交評論