版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、LINGO使用教程 LINGO是用來求解線性和非線性優(yōu)化問題的簡易工具。LINGO內(nèi)置了一種建立最優(yōu)化模型的語言,可以簡便地表達(dá)大規(guī)模問題,利用LINGO高效的求解器可快速求解并分析結(jié)果。 §1 LINGO快速入門 當(dāng)你在windows下開始運(yùn)行LINGO系統(tǒng)時,會得到類似下面的一個窗口: 外層是主框架窗口,包含了所有菜單命令和工具條,其它所有的窗口將被包含在主窗口之下。在主窗口內(nèi)的標(biāo)題為LINGO
2、Model LINGO1的窗口是LINGO的默認(rèn)模型窗口,建立的模型都要在該窗口內(nèi)編碼實(shí)現(xiàn)。下面舉兩個例子。例1.1 如何在LINGO中求解如下的LP問題:在模型窗口中輸入如下代碼:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后點(diǎn)擊工具條上的按鈕 即可。 例1.2 使用LINGO軟件計算6個發(fā)點(diǎn)8個收點(diǎn)的最小費(fèi)用運(yùn)輸問題。產(chǎn)銷單位運(yùn)價如下表。單位 銷地運(yùn)價產(chǎn)地B1B2B3B4B5B6B7B8產(chǎn)量A16267425960A24953858255A35219743351A47673927143A52395726541A6
3、5522814352銷量3537223241324338 使用LINGO軟件,編制程序如下:model:!6發(fā)點(diǎn)8收點(diǎn)運(yùn)輸問題;sets: warehouses/wh1.wh6/: capacity; vendors/v1.v8/: demand; links(warehouses,vendors): cost, volume;endsets!目標(biāo)函數(shù); min=sum(links: cost*volume);!需求約束; for(vendors(J): sum(warehouses(I): volume(I,J)=demand(J);!產(chǎn)量約束; for(warehouses(I)
4、: sum(vendors(J): volume(I,J)<=capacity(I); !這里是數(shù)據(jù);data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3;enddataend然后點(diǎn)擊工具條上的按鈕 即可。為了能夠使用LINGO的強(qiáng)大功能,接著第二節(jié)的學(xué)習(xí)吧。§2 LINGO中的集對實(shí)際問題建
5、模的時候,總會遇到一群或多群相聯(lián)系的對象,比如工廠、消費(fèi)者群體、交通工具和雇工等等。LINGO允許把這些相聯(lián)系的對象聚合成集(sets)。一旦把對象聚合成集,就可以利用集來最大限度的發(fā)揮LINGO建模語言的優(yōu)勢?,F(xiàn)在我們將深入介紹如何創(chuàng)建集,并用數(shù)據(jù)初始化集的屬性。學(xué)完本節(jié)后,你對基于建模技術(shù)的集如何引入模型會有一個基本的理解。2.1 為什么使用集集是LINGO建模語言的基礎(chǔ),是程序設(shè)計最強(qiáng)有力的基本構(gòu)件。借助于集,能夠用一個單一的、長的、簡明的復(fù)合公式表示一系列相似的約束,從而可以快速方便地表達(dá)規(guī)模較大的模型。 2.2 什么是集集是一群相聯(lián)系的對象,這些對象也稱為集的成員。一個集可能是一系列
6、產(chǎn)品、卡車或雇員。每個集成員可能有一個或多個與之有關(guān)聯(lián)的特征,我們把這些特征稱為屬性。屬性值可以預(yù)先給定,也可以是未知的,有待于LINGO求解。例如,產(chǎn)品集中的每個產(chǎn)品可以有一個價格屬性;卡車集中的每輛卡車可以有一個牽引力屬性;雇員集中的每位雇員可以有一個薪水屬性,也可以有一個生日屬性等等。LINGO有兩種類型的集:原始集(primitiveset)和派生集(derived set)。一個原始集是由一些最基本的對象組成的。一個派生集是用一個或多個其它集來定義的,也就是說,它的成員來自于其它已存在的集。 2.3 模型的集部分集部分是LINGO模型的一個可選部分。在LINGO模型中使用集
7、之前,必須在集部分事先定義。集部分以關(guān)鍵字“sets:”開始,以“endsets”結(jié)束。一個模型可以沒有集部分,或有一個簡單的集部分,或有多個集部分。一個集部分可以放置于模型的任何地方,但是一個集及其屬性在模型約束中被引用之前必須定義了它們。2.3.1 定義原始集為了定義一個原始集,必須詳細(xì)聲明:·集的名字·可選,集的成員·可選,集成員的屬性定義一個原始集,用下面的語法:setname/member_list/:attribute_list;注意:用“”表示該部分內(nèi)容可選。下同,不再贅述。Setname是你選擇的來標(biāo)記集的名字,最好具有較強(qiáng)的可讀性。集名字必須嚴(yán)格
8、符合標(biāo)準(zhǔn)命名規(guī)則:以拉丁字母或下劃線(_)為首字符,其后由拉丁字母(AZ)、下劃線、阿拉伯?dāng)?shù)字(0,1,9)組成的總長度不超過32個字符的字符串,且不區(qū)分大小寫。注意:該命名規(guī)則同樣適用于集成員名和屬性名等的命名。Member_list是集成員列表。如果集成員放在集定義中,那么對它們可采取顯式羅列和隱式羅列兩種方式。如果集成員不放在集定義中,那么可以在隨后的數(shù)據(jù)部分定義它們。 當(dāng)顯式羅列成員時,必須為每個成員輸入一個不同的名字,中間用空格或逗號擱開,允許混合使用。例2.1 可以定義一個名為students的原始集,它具有成員John、Jill、Rose和Mike,屬性有sex和age:sets
9、: students/John Jill, Rose Mike/: sex, age;endsets 當(dāng)隱式羅列成員時,不必羅列出每個集成員??刹捎萌缦抡Z法:setname/member1.memberN/: attribute_list;這里的member1是集的第一個成員名,memberN是集的最末一個成員名。LINGO將自動產(chǎn)生中間的所有成員名。LINGO也接受一些特定的首成員名和末成員名,用于創(chuàng)建一些特殊的集。列表如下:隱式成員列表格式示例所產(chǎn)生集成員1.n1.51,2,3,4,5StringM.StringNCar2.car14Car2,Car3,Car4,Car14DayM.Day
10、NMon.FriMon,Tue,Wed,Thu,FriMonthM.MonthNOct.JanOct,Nov,Dec,JanMonthYearM.MonthYearNOct2001.Jan2002Oct2001,Nov2001,Dec2001,Jan2002 集成員不放在集定義中,而在隨后的數(shù)據(jù)部分來定義。例2.2!集部分;sets: students:sex,age;endsets!數(shù)據(jù)部分;data: students,sex,age= John 1 16 Jill 0 14 Rose 0 17 Mike 1 13;enddata注意:開頭用感嘆號(!),末尾用分號(;)表示注釋,可跨多行
11、。在集部分只定義了一個集students,并未指定成員。在數(shù)據(jù)部分羅列了集成員John、Jill、Rose和Mike,并對屬性sex和age分別給出了值。集成員無論用何種字符標(biāo)記,它的索引都是從1開始連續(xù)計數(shù)。在attribute_ list可以指定一個或多個集成員的屬性,屬性之間必須用逗號隔開??梢园鸭⒓蓡T和集屬性同C語言中的結(jié)構(gòu)體作個類比。如下圖:集 結(jié)構(gòu)體集成員 結(jié)構(gòu)體的域集屬性 結(jié)構(gòu)體實(shí)例LINGO內(nèi)置的建模語言是一種描述性語言,用它可以描述現(xiàn)實(shí)世界中的一些問題,然后再借助于LINGO求解器求解。因此,集屬性的值一旦在模型中被確定,就不可能再更改。在LINGO中,只有在初始部分中給
12、出的集屬性值在以后的求解中可更改。這與前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述問題所必須的。2.3.2 定義派生集為了定義一個派生集,必須詳細(xì)聲明:·集的名字·父集的名字·可選,集成員·可選,集成員的屬性可用下面的語法定義一個派生集:setname(parent_set_list)/member_list/:attribute_list;setname是集的名字。parent_set_list是已定義的集的列表,多個時必須用逗號隔開。如果沒有指定成員列表,那么LINGO會自動創(chuàng)建父集成員的所有組合作為派生集的成員。派生集的父集既可以是原
13、始集,也可以是其它的派生集。例2.3sets: product/A B/; machine/M N/; week/1.2/; allowed(product,machine,week):x;endsetsLINGO生成了三個父集的所有組合共八組作為allowed集的成員。列表如下:編號 成員1 (A,M,1)2 2
14、0; (A,M,2)3 3 (A,N,1)4 4
15、 (A,N,2)5 5 (B,M,1)6 6
16、160; (B,M,2)7 7 (B,N,1)8 8
17、0; (B,N,2)成員列表被忽略時,派生集成員由父集成員所有的組合構(gòu)成,這樣的派生集成為稠密集。如果限制派生集的成員,使它成為父集成員所有組合構(gòu)成的集合的一個子集,這樣的派生集成為稀疏集。同原始集一樣,派生集成員的聲明也可以放在數(shù)據(jù)部分。一個派生集的成員列表有兩種方式生成:顯式羅列;設(shè)
18、置成員資格過濾器。當(dāng)采用方式時,必須顯式羅列出所有要包含在派生集中的成員,并且羅列的每個成員必須屬于稠密集。使用前面的例子,顯式羅列派生集的成員:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一個大的、稀疏的集,那么顯式羅列就很討厭。幸運(yùn)地是許多稀疏集的成員都滿足一些條件以和非成員相區(qū)分。我們可以把這些邏輯條件看作過濾器,在LINGO生成派生集的成員時把使邏輯條件為假的成員從稠密集中過濾掉。例2.4sets: !學(xué)生集:性別屬性sex,1表示男性,0表示女性;年齡屬性age. ; students/John,Jill,Rose,M
19、ike/:sex,age; !男學(xué)生和女學(xué)生的聯(lián)系集:友好程度屬性friend,0,1之間的數(shù)。 ; linkmf(students,students)|sex(&1) #eq# 1 #and# sex(&2) #eq# 0: friend; !男學(xué)生和女學(xué)生的友好程度大于0.5的集; linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x;endsetsdata: sex,age = 1 16 0 14 0 17 0 13; friend = 0.3 0.5 0.6;enddata用豎線(|)來標(biāo)記一個成員資格過濾器的開始。#
20、eq#是邏輯運(yùn)算符,用來判斷是否“相等”,可參考§4. &1可看作派生集的第1個原始父集的索引,它取遍該原始父集的所有成員;&2可看作派生集的第2 個原始父集的索引,它取遍該原始父集的所有成員;&3,&4,以此類推。注意如果派生集B的父集是另外的派生集A,那么上面所說的原始父集是集A向前回溯到最終的原始集,其順序保持不變,并且派生集A的過濾器對派生集B仍然有效。因此,?派生集的索引個數(shù)是最終原始父集的個數(shù)?,頁:5那么本例中應(yīng)只有一個索引,怎會有兩個?索引的取值是從原始父集到當(dāng)前派生集所作限制的總和。 總的來說,LINGO可識別的集只有兩種類
21、型:原始集和派生集。在一個模型中,原始集是基本的對象,不能再被拆分成更小的組分。原始集可以由顯式羅列和隱式羅列兩種方式來定義。當(dāng)用顯式羅列方式時,需在集成員列表中逐個輸入每個成員。當(dāng)用隱式羅列方式時,只需在集成員列表中輸入首成員和末成員,而中間的成員由LINGO產(chǎn)生。另一方面,派生集是由其它的集來創(chuàng)建。這些集被稱為該派生集的父集(原始集或其它的派生集)。一個派生集既可以是稀疏的,也可以是稠密的。稠密集包含了父集成員的所有組合(有時也稱為父集的笛卡爾乘積)。稀疏集僅包含了父集的笛卡爾乘積的一個子集,可通過顯式羅列和成員資格過濾器這兩種方式來定義。顯式羅列方法就是逐個羅列稀疏集的成員。成員資格過濾
22、器方法通過使用稀疏集成員必須滿足的邏輯條件從稠密集成員中過濾出稀疏集的成員。不同集類型的關(guān)系見下圖。集稠密集原始集顯式羅列稀疏集過濾器派生集LINGO集類型 §3 模型的數(shù)據(jù)部分和初始部分 在處理模型的數(shù)據(jù)時,需要為集指派一些成員并且在LINGO求解模型之前為集的某些屬性指定值。為此,LINGO為用戶提供了兩個可選部分:輸入集成員和數(shù)據(jù)的數(shù)據(jù)部分(Data Section)和為決策變量
23、設(shè)置初始值的初始部分(Init Section)。 3.1 模型的數(shù)據(jù)部分 3.1.1 數(shù)據(jù)部分入門數(shù)據(jù)部分提供了模型相對靜止部分和數(shù)據(jù)分離的可能性。顯然,這對模型的維護(hù)和維數(shù)的縮放非常便利。數(shù)據(jù)部分以關(guān)鍵字“data:”開始,以關(guān)鍵字“enddata”結(jié)束。在這里,可以指定集成員、集的屬性。其語法如下:object_list = value_list;對象列(object_list)包含要指定值的屬性名、要設(shè)置集成員的集名,用逗號或空格隔開。一個對象列中至多有一個集名,而屬性名可以有任意多。如果對象列中有多個屬性名,那么它們的類型必須一致。如果對象列中有一個集名,那么對象列中所有的屬性的類型
24、就是這個集。數(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ù)聲明(data statement)實(shí)現(xiàn)同樣的功能。例3.2sets: set1/A,B,C/: X,Y;endsetsdata: X,Y=1 4 2 5 3 6;enddata看到這個例子,可能會認(rèn)為X被指定了1、
25、4和2三個值,因為它們是數(shù)值列中前三個,而正確的答案是1、2和3。假設(shè)對象列有n個對象,LINGO在為對象指定值時,首先在n個對象的第1個索引處依次分配數(shù)值列中的前n個對象,然后在n個對象的第2個索引處依次分配數(shù)值列中緊接著的n個對象,以此類推。模型的所有數(shù)據(jù)屬性值和集成員被單獨(dú)放在數(shù)據(jù)部分,這可能是最規(guī)范的數(shù)據(jù)輸入方式。3.1.2 參數(shù)在數(shù)據(jù)部分也可以指定一些標(biāo)量變量(scalar variables)。當(dāng)一個標(biāo)量變量在數(shù)據(jù)部分確定時,稱之為參數(shù)??匆焕僭O(shè)模型中用利率8.5%作為一個參數(shù),就可以象下面一樣輸入一個利率作為參數(shù)。例3.3data: interest_rate = .085;
26、enddata也可以同時指定多個參數(shù)。例3.4data: interest_rate,inflation_rate = .085 .03;enddata3.1.3 實(shí)時數(shù)據(jù)處理在某些情況,對于模型中的某些數(shù)據(jù)并不是定值。譬如模型中有一個通貨膨脹率的參數(shù),我們想在2%至6%范圍內(nèi),對不同的值求解模型,來觀察模型的結(jié)果對通貨膨脹的依賴有多么敏感。我們把這種情況稱為實(shí)時數(shù)據(jù)處理(what if analysisGO有一個特征可方便地做到這件事。 )。LIN在本該放數(shù)的地方輸入一個問號(?)。例3.5data: interest_rate,inflation_rate = .085 ?;enddata
27、每一次求解模型時,LINGO都會提示為參數(shù)inflation_rate輸入一個值。在WINDOWS操作系統(tǒng)下,將會接收到一個類似下面的對話框:直接輸入一個值再點(diǎn)擊OK按鈕,LINGO就會把輸入的值指定給inflation_rate,然后繼續(xù)求解模型。 除了參數(shù)之外,也可以實(shí)時輸入集的屬性值,但不允許實(shí)時輸入集成員名。 3.1.4 指定屬性為一個值可以在數(shù)據(jù)聲明的右邊輸入一個值來把所有的成員的該屬性指定為一個值??聪旅娴睦?。例3.6sets: days /MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata: needs = 20;enddataLINGO將用20指定
28、days集的所有成員的needs屬性。對于多個屬性的情形,見下例。例3.7sets: days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata: needs cost = 20 100;enddata 3.1.5 數(shù)據(jù)部分的未知數(shù)值有時只想為一個集的部分成員的某個屬性指定值,而讓其余成員的該屬性保持未知,以便讓LINGO去求出它們的最優(yōu)值。在數(shù)據(jù)聲明中輸入兩個相連的逗號表示該位置對應(yīng)的集成員的屬性值未知。兩個逗號間可以有空格。例3.8sets: years/1.5/: capacity;endsetsdata: capacity = ,34,20,;
29、enddata屬性capacity的第2個和第3個值分別為34和20,其余的未知。 3.2 模型的初始部分初始部分是LINGO提供的另一個可選部分。在初始部分中,可以輸入初始聲明(initialization statement),和數(shù)據(jù)部分中的數(shù)據(jù)聲明相同。對實(shí)際問題的建模時,初始部分并不起到描述模型的作用,在初始部分輸入的值僅被LINGO求解器當(dāng)作初始點(diǎn)來用,并且僅僅對非線性模型有用。和數(shù)據(jù)部分指定變量的值不同,LINGO求解器可以自由改變初始部分初始化的變量的值。一個初始部分以“init:”開始,以“endinit”結(jié)束。初始部分的初始聲明規(guī)則和數(shù)據(jù)部分的數(shù)據(jù)聲明規(guī)則相同。也
30、就是說,我們可以在聲明的左邊同時初始化多個集屬性,可以把集屬性初始化為一個值,可以用問號實(shí)現(xiàn)實(shí)時數(shù)據(jù)處理,還可以用逗號指定未知數(shù)值。例3.9init: X, Y = 0, .1;endinitY=log(X);X2+Y2<=1;好的初始點(diǎn)會減少模型的求解時間。 在這一節(jié)中,我們僅帶大家接觸了一些基本的數(shù)據(jù)輸入和初始化概念,不過現(xiàn)在你應(yīng)該可以輕松的為自己的模型加入原始數(shù)據(jù)和初始部分啦。§4 LINGO函數(shù) 有了前幾節(jié)的基礎(chǔ)知識,再加上本節(jié)的內(nèi)容,你就能夠借助于LINGO建立并求解復(fù)雜的優(yōu)化模型了。LINGO有9種類型的函數(shù):1 基本運(yùn)算符:包括算術(shù)運(yùn)算符
31、、邏輯運(yùn)算符和關(guān)系運(yùn)算符2 數(shù)學(xué)函數(shù):三角函數(shù)和常規(guī)的數(shù)學(xué)函數(shù)3 金融函數(shù):LINGO提供的兩種金融函數(shù)4 概率函數(shù):LINGO提供了大量概率相關(guān)的函數(shù)5 變量界定函數(shù):這類函數(shù)用來定義變量的取值范圍6 集操作函數(shù):這類函數(shù)為對集的操作提供幫助7 集循環(huán)函數(shù):遍歷集的元素,執(zhí)行一定的操作的函數(shù)8 數(shù)據(jù)輸入輸出函數(shù):這類函數(shù)允許模型和外部數(shù)據(jù)源相聯(lián)系,進(jìn)行數(shù)據(jù)的輸入輸出9 輔助函數(shù):各種雜類函數(shù) 4.1 基本運(yùn)算符這些運(yùn)算符是非?;镜?,甚至可以不認(rèn)為它們是一類函數(shù)。事實(shí)上,
32、在LINGO中它們是非常重要的。4.1.1 算術(shù)運(yùn)算符算術(shù)運(yùn)算符是針對數(shù)值進(jìn)行操作的。LINGO提供了5種二元運(yùn)算符:乘方乘除加減LINGO唯一的一元算術(shù)運(yùn)算符是取反函數(shù)“”。這些運(yùn)算符的優(yōu)先級由高到底為:高(取反) 低運(yùn)算符的運(yùn)算次序為從左到右按優(yōu)先級高低來執(zhí)行。運(yùn)算的次序可以用圓括號“()”來改變。例4.1 算術(shù)運(yùn)算符示例。253,(24)5等等。4.1.2 邏輯運(yùn)算符在LINGO中,邏輯運(yùn)算符主要用于集循環(huán)函數(shù)的條件表達(dá)式中,來控制在函數(shù)中哪些集成員被包含,哪些被排斥。在創(chuàng)建稀疏集時用在成員資格過濾器中。LINGO具有種邏輯運(yùn)算符:#not# 否定該操作數(shù)的邏輯值,not是一個一元運(yùn)算符
33、#eq#若兩個運(yùn)算數(shù)相等,則為true;否則為flase#ne# 若兩個運(yùn)算符不相等,則為true;否則為flase#gt# 若左邊的運(yùn)算符嚴(yán)格大于右邊的運(yùn)算符,則為true;否則為flase#ge# 若左邊的運(yùn)算符大于或等于右邊的運(yùn)算符,則為true;否則為flase#lt# 若左邊的運(yùn)算符嚴(yán)格小于右邊的運(yùn)算符,則為true;否則為flase#le# 若左邊的運(yùn)算符小于或等于右邊的運(yùn)算符,則為true;否則為flase#and# 僅當(dāng)兩個參數(shù)都為true時,結(jié)果為true;否則為flase#or# 僅當(dāng)兩個參數(shù)都為false時,結(jié)果為false;否則為true這些運(yùn)算符的優(yōu)先級由高到低為:高
34、 #not# #eq# #ne# #gt# #ge# #lt# #le#低 #and# #or#例4.2 邏輯運(yùn)算符示例2 #gt# 3 #and# 4 #gt# 2,其結(jié)果為假(0)。 4.1.3 關(guān)系運(yùn)算符在LINGO中,關(guān)系運(yùn)算符主要是被用在模型中,來指定一個表達(dá)式的左邊是否等于、小于等于、或者大于等于右邊,形成模型的一個約束條件。關(guān)系運(yùn)算符與邏輯運(yùn)算符#eq#、#le#、#ge#截然不同,前者是模型中該關(guān)系運(yùn)算符所指定關(guān)系的為真描述,而后者僅僅判斷一個該關(guān)系是否被滿足:滿足為真,不滿足為假。 LINGO有三種關(guān)系運(yùn)算符:“=”、“<=”和“>=”。LINGO中還能用“<
35、;”表示小于等于關(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,這里是一個小的正數(shù),它的值依賴于模型中A小于B多少才算不等。 下面給出以上三類操作符的優(yōu)先級:高#not# (取反) #eq# #ne# #gt# #ge# #lt# #le#and# #or#低 <= = >= 4.2 數(shù)學(xué)函數(shù)LINGO提供了大量的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù):abs(x) 返回x的絕對值sin(x) 返回x的正弦值,x采用弧度制cos(x)
36、返回x的余弦值tan(x) 返回x的正切值exp(x) 返回常數(shù)e的x次方log(x) 返回x的自然對數(shù)0lgm(x) 返回x的gamma函數(shù)的自然對數(shù)sign(x) 如果x<0返回-1;否則,返回1floor(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中的最小值 例4.3 給定一個直角三角形,求包含該三角形的最小正方形。 解:如圖所示。ABCDDAEabx求最小的正方形就相當(dāng)于求如下的最優(yōu)化問題:LINGO代碼
37、如下:model:sets: object/1.3/: f;endsetsdata: a, b = 3, 4; !兩個直角邊長,修改很方便;enddata f(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);end 在上面的代碼中用到了函數(shù)bnd,詳情請見4.5節(jié)。4.5 變量界定函數(shù)變量界定函數(shù)實(shí)現(xiàn)對變量取值范圍的附加限制,共4種:bin(x) 限制x為0或1bnd(L,x,U) 限制LxUfree(x) 取消對變量x的默認(rèn)
38、下界為0的限制,即x可以取任意實(shí)數(shù)gin(x) 限制x為整數(shù)在默認(rèn)情況下,LINGO規(guī)定變量是非負(fù)的,也就是說下界為0,上界為+。free取消了默認(rèn)的下界為0的限制,使變量也可以取負(fù)值。bnd用于設(shè)定一個變量的上下界,它也可以取消默認(rèn)下界為0的約束。 4.6 集操作函數(shù)LINGO提供了幾個函數(shù)幫助處理集。1in(set_name,primitive_index_1 ,primitive_index_2,)如果元素在指定集中,返回1;否則返回0。例4.7 全集為I,B是I的一個子集,C是B的補(bǔ)集。sets: I/x1.x4/; B(I)/x2/; C(I)|#not#in(B,&
39、;1):;(#NOT#否定該操作)endsets2index(set_name, primitive_set_element)該函數(shù)返回在集set_name中原始集成員primitive_set_element的索引。如果set_name被忽略,那么LINGO將返回與primitive_set_element匹配的第一個原始集成員的索引。如果找不到,則產(chǎn)生一個錯誤。 例4.8 如何確定集成員(B,Y)屬于派生集S3。sets: S1/A B C/; S2/X Y Z/; S3(S1,S2)/A X, A Z, B Y, C X/;endsetsX=in(S3,index(S1,B),index
40、(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ù)時最好指定集。3wrap(index,limit)該函數(shù)返回j=index-k*limit,其中k是一個整數(shù),取適當(dāng)值保證j落在區(qū)間1,limit內(nèi)。?該函數(shù)相當(dāng)于index模limit再加1。?該函數(shù)在循環(huán)、多階段計劃編制中特別有用。4size(set_name)該函數(shù)返回集set
41、_name的成員個數(shù)。在模型中明確給出集大小時最好使用該函數(shù)。它的使用使模型更加數(shù)據(jù)中立,集大小改變時也更易維護(hù)。 4.7 集循環(huán)函數(shù)集循環(huán)函數(shù)遍歷整個集進(jìn)行操作。其語法為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_qua
42、lifier進(jìn)行評價,若結(jié)果為真,則對該成員執(zhí)行function操作,否則跳過,繼續(xù)執(zhí)行下一次循環(huán)。expression_list是被應(yīng)用到每個集成員的表達(dá)式列表,當(dāng)用的是for函數(shù)時,expression_list可以包含多個表達(dá)式,其間用逗號隔開。這些表達(dá)式將被作為約束加到模型中。當(dāng)使用其余的三個集循環(huán)函數(shù)時,expression_list只能有一個表達(dá)式。如果省略set_index_list,那么在expression_list中引用的所有屬性的類型都是setname集。1for該函數(shù)用來產(chǎn)生對集成員的約束?;诮UZ言的標(biāo)量需要顯式輸入每個約束,不過for函數(shù)允許只輸入一個約束,然后L
43、INGO自動產(chǎn)生每個集成員的約束。例4.10 產(chǎn)生序列1,4,9,16,25model:sets: number/1.5/:x;endsets for(number(I): x(I)=I2);end2sum該函數(shù)返回遍歷指定的集成員的一個表達(dá)式的和。例4.11 求向量5,1,3,4,6,10前5個數(shù)的和。model:data: N=6;enddatasets: number/1.N/:x;endsetsdata: x = 5 1 3 4 6 10;enddata s=sum(number(I) | I #le# 5: x);end3min和max返回指定的集成員的一個表達(dá)式的最小值或最大值。例
44、4.12 求向量5,1,3,4,6,10前5個數(shù)的最小值,后3個數(shù)的最大值。model:data: N=6;enddatasets: number/1.N/:x;endsetsdata: x = 5 1 3 4 6 10;enddata minv=min(number(I) | I #le# 5: x); maxv=max(number(I) | I #ge# N-2: x);end 下面看一個稍微復(fù)雜一點(diǎn)兒的例子。例4.13 職員時序安排模型 一項工作一周7天都需要有人(比如護(hù)士工作),每天(周一至周日)所需的最少職員數(shù)為20、16、13、16、19、14和12,并要求每個職員一周連續(xù)工作5
45、天,試求每周所需最少職員數(shù),并給出安排。注意這里我們考慮穩(wěn)定后的情況。model:sets: days/mon.sun/: required,start;endsetsdata: !每天所需的最少職員數(shù); required = 20 16 13 16 19 14 12; enddata!最小化每周所需職員數(shù); min=sum(days: start); for(days(J): sum(days(I) | I #le# 5: start(wrap(J+I+2,7) >= required(J);end計算的部分結(jié)果為Global optimal solution found at ite
46、ration: 0 Objective value: 22.00000 Variable Value Reduced Cost REQUIRED( MON) 20.00000 0.000000 REQUIRED( TUE) 16.00000 0.000000 REQUIRED( WED) 13.00000 0.000000 REQUIRED( THU) 16.00000 0.000000 REQUIRED( FRI) 19.00000 0.000000 REQUIRED( SAT) 14.00000 0.000000 REQUIRED( SUN) 12.00000 0.000000
47、 START( MON) 8.000000 0.000000 START( TUE) 2.000000 0.000000 START( WED) 0.000000 0.3333333 START( THU) 6.000000 0.000000 START( FRI) 3.000000 0.000000 START( SAT) 3.000000 0.000000 START( SUN) 0.000000 0.000000從而解決方案是:每周最少需要22個職員,周一安排8人,周二安排2人,周三無需安排人,周四安排6人,周五和周六都安排3人,周日無需安排人。 4.8 輸入和輸出函數(shù)輸入和
48、輸出函數(shù)可以把模型和外部數(shù)據(jù)比如文本文件、數(shù)據(jù)庫和電子表格等連接起來。1file函數(shù) 該函數(shù)用從外部文件中輸入數(shù)據(jù),可以放在模型中任何地方。該函數(shù)的語法格式為file(filename)。這里filename是文件名,可以采用相對路徑和絕對路徑兩種表示方式。file函數(shù)對同一文件的兩種表示方式的處理和對兩個不同的文件處理是一樣的,這一點(diǎn)必須注意。例4.14 以例1.2來講解file函數(shù)的用法。注意到在例1.2的編碼中有兩處涉及到數(shù)據(jù)。第一個地方是集部分的6個warehouses集成員和8個vendors集成員;第二個地方是數(shù)據(jù)部分的capacity,demand和cost數(shù)據(jù)。為了使數(shù)據(jù)和我們的模型完全分開,我們把它們移到外部的文本文件中。修改模型代碼以便于用file函數(shù)把數(shù)據(jù)從文
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 18912-2024光伏組件鹽霧腐蝕試驗
- 2025版第七章:電子信息產(chǎn)品采購合同管理規(guī)范3篇
- 賽車場屋頂防水工程
- 2025版虛擬現(xiàn)實(shí)技術(shù)研究與應(yīng)用開發(fā)合同3篇
- 2024年銅材行業(yè)節(jié)能減排技術(shù)與產(chǎn)品供應(yīng)合同3篇
- 眼鏡行業(yè)銷售人才聘用合同
- 體育賽事組織項目管理準(zhǔn)則
- 2025版昆都侖召消防設(shè)施遠(yuǎn)程監(jiān)控與報警系統(tǒng)合同3篇
- 健身房設(shè)備維護(hù)操作規(guī)程
- 美容美發(fā)合作社股東權(quán)益書
- 《正態(tài)分布理論及其應(yīng)用研究》4200字(論文)
- GB/T 45086.1-2024車載定位系統(tǒng)技術(shù)要求及試驗方法第1部分:衛(wèi)星定位
- 支氣管動脈造影護(hù)理
- 1古詩文理解性默寫(教師卷)
- 廣東省廣州市越秀區(qū)2021-2022學(xué)年九年級上學(xué)期期末道德與法治試題(含答案)
- 校園春季安全
- 2024-2025學(xué)年六上科學(xué)期末綜合檢測卷(含答案)
- 【MOOC】工程力學(xué)-浙江大學(xué) 中國大學(xué)慕課MOOC答案
- 在線教育平臺合作合同助力教育公平
- 工地鋼板短期出租合同模板
- 女排精神課件教學(xué)課件
評論
0/150
提交評論