[理學(xué)]lingo講義_第1頁
[理學(xué)]lingo講義_第2頁
[理學(xué)]lingo講義_第3頁
[理學(xué)]lingo講義_第4頁
[理學(xué)]lingo講義_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第一章 lingo的基本用法我們遇到的許多優(yōu)化問題都可以歸結(jié)為規(guī)劃問題,如線性規(guī)劃,非線性規(guī)劃,二次規(guī)劃,整數(shù)規(guī)劃,動態(tài)規(guī)劃,多目標(biāo)規(guī)劃等;當(dāng)遇到變量比較多或者約束條件表達(dá)式比較復(fù)雜的情況時,想用手工求解是不可能的;編程計算雖然可行,但工作量大,程序長而繁瑣,需要花費大量的時間和精力,還容易出錯??尚械霓k法是用現(xiàn)成的軟件求解,lingo是專門求解各種規(guī)劃問題的軟件包,其功能非常強(qiáng)大。§1lingo入門lingo是美國的lindo系統(tǒng)公司開發(fā)的求解數(shù)學(xué)規(guī)劃系列軟件中的一個,它的主要功能是求解大型線性,非線性和整數(shù)規(guī)劃問題。lingo的主要功能特色為:(1) 既能求解線性規(guī)劃問題,也有較

2、強(qiáng)的求解非線性規(guī)劃問題的能力;(2) 輸入模型簡練直觀;(3) 運行速度快,計算能力強(qiáng);(4) 內(nèi)置建模語言,提供幾十個內(nèi)部函數(shù),從而能以較少語句,以較直觀的方式描述較大規(guī)模的優(yōu)化模型;(5) 將集合的概念引入編程語言,很容易將實際問題轉(zhuǎn)化為lingo模型;(6) 能方便地與excel,數(shù)據(jù)庫等其他軟件交換數(shù)據(jù)。通常,一個優(yōu)化模型由以下三部分組成:(1) 目標(biāo)函數(shù):一般表示成求某個數(shù)學(xué)表達(dá)式的最大值或最小值。(2) 決策變量:目標(biāo)函數(shù)值取決于哪些變量。(3) 約束條件:對變量附加一些條件限制(通常用等式或不等式表示)。例1:對于上述的優(yōu)化模型,在lingo的窗口中輸入以下的代碼:min=2*x

3、1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;注1:lingo默認(rèn)決策變量都非負(fù),因而變量非負(fù)條件可以不必輸入。注2:lingo默認(rèn)的文件格式的擴(kuò)展名為.lg4,這是一種特殊的二進(jìn)制文件,保存了模型窗口中所有的文本和其他對象以及格式信息,其它幾種擴(kuò)展名分別代表不同類型的文件。見下表。lingo的文件類型擴(kuò)展名文件類型lng純文本格式模型文件,不含格式(如字體,顏色等)信息ldtlingo數(shù)據(jù)文件ltflingo命令腳本文件lgr用來存放lingo的計算結(jié)果(solution report)lingo的語法規(guī)定:(1) 求目標(biāo)函數(shù)的最大值或最小值

4、分別用max=-或min=-來表示;(2) 每個語句必須以分號結(jié)束,每行可以有多個語句,語句也可以跨行;(3) 變量名必須以字母(a-z)開頭,由字母,數(shù)字和下劃線組成,長度不超過32個字符,不去分大小寫;(4) 可以給語句加上標(biāo)號,例如obj max=200*x1+300*x2;(5) 以!開頭,以;號結(jié)束的語句是注釋語句;(6) 如果對變量的取值范圍沒有作特殊說明,則默認(rèn)所有決策變量都非負(fù);(7) lingo模型以語句model:開頭,以end結(jié)束,對于比較簡單的模型,這兩個語句可以省略。§2 lingo編程語言中的集lingo的優(yōu)點是輸入的模型較直觀,一般的數(shù)學(xué)表達(dá)式無須作太大

5、的變化即可直接輸入。對于規(guī)模較小的模型可以直接輸入,但是對于變量和約束較多的情況,雖然也可以直接輸入,但是這種模型的篇幅很長,不便于修改和擴(kuò)展。例如,目標(biāo)函數(shù)中有求和表達(dá)式,若直接輸入,將有200個和200個相乘再相加,需要輸入很長的一串,即不方便修改,可讀性差。幸好lingo提供了建模語言,能夠以較少的語句簡單有效的表達(dá)上述的目標(biāo)函數(shù)(以及約束條件)。集合:對實際問題建模的時候,總會遇到一群或多群相聯(lián)系的對象,比如工廠、消費者群體、交通工具和雇工等等。lingo允許把這些相聯(lián)系的對象聚合成集(sets)。一旦把對象聚合成集,就可以利用集來最大限度的發(fā)揮lingo建模語言的優(yōu)勢。 2

6、.1 為什么使用集集是lingo建模語言的基礎(chǔ),是程序設(shè)計最強(qiáng)有力的基本構(gòu)件。借助于集,能夠用一個單一的、長的、簡明的復(fù)合公式表示一系列相似的約束,從而可以快速方便地表達(dá)規(guī)模較大的模型。  2.2 什么是集集是一群相聯(lián)系的對象,這些對象也稱為集的成員。一個集可能是一系列產(chǎn)品、卡車或雇員。每個集成員可能有一個或多個與之有關(guān)聯(lián)的特征,我們把這些特征稱為屬性。屬性值可以預(yù)先給定,也可以是未知的,有待于lingo求解。例如,產(chǎn)品集中的每個產(chǎn)品可以有一個價格屬性;卡車集中的每輛卡車可以有一個牽引力屬性;雇員集中的每位雇員可以有一個薪水屬性,也可以有一個生日屬性等等。lingo有兩種類型的集:原

7、始集(primitiveset)和派生集(derived set)。一個原始集是由一些最基本的對象組成的。一個派生集是用一個或多個其它集來定義的,也就是說,它的成員來自于其它已存在的集。 2.3 模型的集部分集部分是lingo模型的一個可選部分。在lingo模型中使用集之前,必須在集部分事先定義。集部分以關(guān)鍵字“sets:”開始,以“endsets”結(jié)束。一個模型可以沒有集部分,或有一個簡單的集部分,或有多個集部分。一個集部分可以放置于模型的任何地方,但是一個集及其屬性在模型約束中被引用之前必須定義了它們。2.3.1 定義原始集為了定義一個原始集,必須詳細(xì)聲明:·集的名字&

8、#183;可選,集的成員·可選,集成員的屬性定義一個原始集,用下面的語法:setname/member_list/:attribute_list;注意:用“”表示該部分內(nèi)容可選。下同,不再贅述。setname是你選擇的來標(biāo)記集的名字,最好具有較強(qiáng)的可讀性。集名字必須嚴(yán)格符合標(biāo)準(zhǔn)命名規(guī)則:以拉丁字母或下劃線(_)為首字符,其后由拉丁字母(az)、下劃線、阿拉伯?dāng)?shù)字(0,1,9)組成的總長度不超過32個字符的字符串,且不區(qū)分大小寫。注意:該命名規(guī)則同樣適用于集成員名和屬性名等的命名。member_list是集成員列表。如果集成員放在集定義中,那么對它們可采取顯式羅列和隱式羅列兩種方式。如

9、果集成員不放在集定義中,那么可以在隨后的數(shù)據(jù)部分定義它們。 當(dāng)顯式羅列成員時,必須為每個成員輸入一個不同的名字,中間用空格或逗號擱開,允許混合使用。例2.1 可以定義一個名為students的原始集,它具有成員john、jill、rose和mike,屬性有sex和age:sets: students/john jill, rose mike/: sex, age;endsets 當(dāng)隱式羅列成員時,不必羅列出每個集成員。可采用如下語法:setname/member1.membern/: attribute_list;這里的member1是集的第一個成員名,membern是集的最末一個成員名。li

10、ngo將自動產(chǎn)生中間的所有成員名。lingo也接受一些特定的首成員名和末成員名,用于創(chuàng)建一些特殊的集。列表如下:隱式成員列表格式示例所產(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 集成員可以不放在集定義中,而在隨后的數(shù)據(jù)部分來定義。例2.2

11、!集部分;sets: students:sex,age;endsets!數(shù)據(jù)部分;data: students,sex,age= john 1 16 jill 0 14 rose 0 17 mike 1 13;enddata注意:開頭用感嘆號(!),末尾用分號(;)表示注釋,可跨多行。在集部分只定義了一個集students,并未指定成員。在數(shù)據(jù)部分羅列了集成員john、jill、rose和mike,并對屬性sex和age分別給出了值。集成員無論用何種字符標(biāo)記,它的索引都是從1開始連續(xù)計數(shù)。在attribute_ list可以指定一個或多個集成員的屬性,屬性之間必須用逗號隔開??梢园鸭?、集成員和

12、集屬性同c語言中的結(jié)構(gòu)體作個類比。如下圖:集 結(jié)構(gòu)體集成員 結(jié)構(gòu)體的域集屬性 結(jié)構(gòu)體實例lingo內(nèi)置的建模語言是一種描述性語言,用它可以描述現(xiàn)實世界中的一些問題,然后再借助于lingo求解器求解。因此,集屬性的值一旦在模型中被確定,就不可能再更改。在lingo中,只有在初始部分中給出的集屬性值在以后的求解中可更改。這與前面并不矛盾,初始部分是lingo求解器的需要,并不是描述問題所必須的。2.3.2 定義派生集為了定義一個派生集,必須詳細(xì)聲明:·集的名字·父集的名字·可選,集成員·可選,集成員的屬性可用下面的語法定義一個派生集:setname(pare

13、nt_set_list)/member_list/:attribute_list;setname是集的名字。parent_set_list是已定義的集的列表,多個時必須用逗號隔開。如果沒有指定成員列表,那么lingo會自動創(chuàng)建父集成員的所有組合作為派生集的成員。派生集的父集既可以是原始集,也可以是其它的派生集。例2.3sets: product/a b/; machine/m n/; week/1.2/; allowed(product,machine,week):x;endsetslingo生成了三個父集的所有組合共八組作為allowed集的成員。列表如下:編號 成員1 (a,m,1)2 &

14、#160; (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)成員列表被忽略時,派生集成員由父集成員所有的組合構(gòu)成,這樣的派生集成為稠密集。如果限制派生集的成員,使它成為父集成員所有組合構(gòu)成的集合的一個子集,這樣的派生集成為稀疏集。同原始集一樣,派生集成員的聲明也可以放在數(shù)據(jù)部分。一個派生集的成員列表有兩種方式生成:顯式羅列;設(shè)置成員資格過濾器。當(dāng)采用方式時,必須顯式羅列出所有要包含在派生集中的成員,并且羅列的每個成員必須屬于稠密集。使用前

15、面的例子,顯式羅列派生集的成員:allowed(product,machine,week)/a m 1,a n 2,b n 1/;如果需要生成一個大的、稀疏的集,那么顯式羅列就很討厭。幸運地是許多稀疏集的成員都滿足一些條件以和非成員相區(qū)分。我們可以把這些邏輯條件看作過濾器,在lingo生成派生集的成員時把使邏輯條件為假的成員從稠密集中過濾掉。例2.4sets: !學(xué)生集:性別屬性sex,1表示男性,0表示女性;年齡屬性age. ; students/john,jill,rose,mike/:sex,age; !男學(xué)生和女學(xué)生的聯(lián)系集:友好程度屬性friend,0,1之間的數(shù)。 ; linkmf

16、(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)記一個成員資格過濾器的開始。#eq#是邏輯運算符,用來判斷是否“相等”, &1可看作派生集的第1個原始父集的索引,它取遍該原始父集的所有

17、成員;&2可看作派生集的第2 個原始父集的索引,它取遍該原始父集的所有成員;&3,&4,以此類推。注意如果派生集b的父集是另外的派生集a,那么上面所說的原始父集是集a向前回溯到最終的原始集,其順序保持不變,并且派生集a的過濾器對派生集b仍然有效。因此,派生集的索引個數(shù)是最終原始父集的個數(shù),索引的取值是從原始父集到當(dāng)前派生集所作限制的總和。 總的來說,lingo可識別的集只有兩種類型:原始集和派生集。在一個模型中,原始集是基本的對象,不能再被拆分成更小的組分。原始集可以由顯式羅列和隱式羅列兩種方式來定義。當(dāng)用顯式羅列方式時,需在集成員列表中逐個輸入每個成員。當(dāng)用

18、隱式羅列方式時,只需在集成員列表中輸入首成員和末成員,而中間的成員由lingo產(chǎn)生。另一方面,派生集是由其它的集來創(chuàng)建。這些集被稱為該派生集的父集(原始集或其它的派生集)。一個派生集既可以是稀疏的,也可以是稠密的。稠密集包含了父集成員的所有組合(有時也稱為父集的笛卡爾乘積)。稀疏集僅包含了父集的笛卡爾乘積的一個子集,可通過顯式羅列和成員資格過濾器這兩種方式來定義。顯式羅列方法就是逐個羅列稀疏集的成員。成員資格過濾器方法通過使用稀疏集成員必須滿足的邏輯條件從稠密集成員中過濾出稀疏集的成員。不同集類型的關(guān)系見下圖。集稠密集原始集顯式羅列稀疏集過濾器派生集lingo集類型§3 lingo模

19、型中的數(shù)據(jù)部分和初始部分  在處理模型的數(shù)據(jù)時,需要為集指派一些成員并且在lingo求解模型之前為集的某些屬性指定值。為此,lingo為用戶提供了兩個可選部分:輸入集成員和數(shù)據(jù)的數(shù)據(jù)部分(data section)和為決策變量設(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;對象列(

20、object_list)包含要指定值的屬性名、要設(shè)置集成員的集名,用逗號或空格隔開。一個對象列中至多有一個集名,而屬性名可以有任意多。如果對象列中有多個屬性名,那么它們的類型必須一致。如果對象列中有一個集名,那么對象列中所有的屬性的類型就是這個集。數(shù)值列(value_list)包含要分配給對象列中的對象的值,用逗號或空格隔開。注意屬性值的個數(shù)必須等于集成員的個數(shù)??聪旅娴睦印@?.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。也可采用

21、如下例子中的復(fù)合數(shù)據(jù)聲明(data statement)實現(xiàn)同樣的功能。例3.2sets: set1/a,b,c/: x,y;endsetsdata: x,y=1 4 2 5 3 6;enddata看到這個例子,可能會認(rèn)為x被指定了1、4和2三個值,因為它們是數(shù)值列中前三個,而正確的答案是1、2和3。假設(shè)對象列有n個對象,lingo在為對象指定值時,首先在n個對象的第1個索引處依次分配數(shù)值列中的前n個對象,然后在n個對象的第2個索引處依次分配數(shù)值列中緊接著的n個對象,以此類推。模型的所有數(shù)據(jù)屬性值和集成員被單獨放在數(shù)據(jù)部分,這可能是最規(guī)范的數(shù)據(jù)輸入方式。3.1.2 參數(shù)在數(shù)據(jù)部分也可以指定一些

22、標(biāo)量變量(scalar variables)。當(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;enddata3.1.3 實時數(shù)據(jù)處理在某些情況,對于模型中的某些數(shù)據(jù)并不是定值。譬如模型中有一個通貨膨脹率的參數(shù),我們想在2%至6%范圍內(nèi),對不同的值求解模型,來觀察模型的結(jié)果對通貨膨脹的依賴有多么敏感。我們把這種情況稱為實

23、時數(shù)據(jù)處理(what if analysis)。lingo有一個特征可方便地做到這件事。 在本該放數(shù)的地方輸入一個問號(?)。例3.5data: interest_rate,inflation_rate = .085 ?;enddata每一次求解模型時,lingo都會提示為參數(shù)inflation_rate輸入一個值。在windows操作系統(tǒng)下,將會接收到一個類似下面的對話框:        直接輸入一個值再點擊ok按鈕,lingo就會把輸入的值指定給inflation_rate,然后繼續(xù)求解模型。除了參數(shù)之外,也可

24、以實時輸入集的屬性值,但不允許實時輸入集成員名。注:data:a=?;enddatamax=98*x1+a*x2-x12-0.3*x1*x2-2*x22;x1+x2<100;x1<x2;gin(x1);gin(x2); 3.1.4 指定屬性為一個值可以在數(shù)據(jù)聲明的右邊輸入一個值來把所有的成員的該屬性指定為一個值??聪旅娴睦?。例3.6sets: days /mo,tu,we,th,fr,sa,su/:needs;endsetsdata: needs = 20;enddatalingo將用20指定days集的所有成員的needs屬性。對于多個屬性的情形,見下例。例3.7sets: d

25、ays /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,;enddata屬性capacity的第2個和第3個值分別為34和20,其余的未知。

26、60; 3.2 模型的初始部分初始部分是lingo提供的另一個可選部分。在初始部分中,可以輸入初始聲明(initialization statement),和數(shù)據(jù)部分中的數(shù)據(jù)聲明相同。對實際問題的建模時,初始部分并不起到描述模型的作用,在初始部分輸入的值僅被lingo求解器當(dāng)作初始點來用,并且僅僅對非線性模型有用。和數(shù)據(jù)部分指定變量的值不同,lingo求解器可以自由改變初始部分初始化的變量的值。一個初始部分以“init:”開始,以“endinit”結(jié)束。初始部分的初始聲明規(guī)則和數(shù)據(jù)部分的數(shù)據(jù)聲明規(guī)則相同。也就是說,我們可以在聲明的左邊同時初始化多個集屬性,可以把集屬性初始化為一個值,可以用問號

27、實現(xiàn)實時數(shù)據(jù)處理,還可以用逗號指定未知數(shù)值。例3.9init: x, y = 0, .1;endinity=log(x);x2+y2<=1;好的初始點會減少模型的求解時間。§4 lingo中的基本函數(shù)lingo有9種類型的函數(shù):1  基本運算符:包括算術(shù)運算符、邏輯運算符和關(guā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

28、0; 集循環(huán)函數(shù):遍歷集的元素,執(zhí)行一定的操作的函數(shù)8  數(shù)據(jù)輸入輸出函數(shù):這類函數(shù)允許模型和外部數(shù)據(jù)源相聯(lián)系,進(jìn)行數(shù)據(jù)的輸入輸出9  輔助函數(shù):各種雜類函數(shù) 4.1 基本運算符這些運算符是非?;镜模趌ingo中它們是非常重要的。4.1.1 算術(shù)運算符算術(shù)運算符是針對數(shù)值進(jìn)行操作的。lingo提供了5種二元運算符:乘方乘除加減lingo唯一的一元算術(shù)運算符是取反函數(shù)“”。這些運算符的優(yōu)先級由高到底為:高(取反) 低運算符的運算次序為從左到右按優(yōu)先級高低來執(zhí)行。運算的次序可以用圓括號“()”來改變。例4.1 算術(shù)運算符示例。253,(24)5等等。4.1.2 邏

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

30、符小于或等于右邊的運算符,則為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)。 4.1.3 關(guān)系運算符在lingo中,關(guān)系運算符主要是被用在模型中,來指定一個表達(dá)式的左邊是否等于、小于等于、或者大于等于右邊,形成模型的一個約束條件。關(guān)系運算符與邏輯運算符#eq

31、#、#le#、#ge#截然不同,前者是模型中該關(guān)系運算符所指定關(guān)系的為真描述,而后者僅僅判斷一個該關(guān)系是否被滿足:滿足為真,不滿足為假。 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,那么可以把它變成如下的小于等于表達(dá)式:a+<=b,這里是一個很小的正數(shù),它的值依賴于模型中a小于b多少才算不等。 下面給出以上三類操作符的優(yōu)先級:高#not# (取反) #eq#

32、#ne# #gt# #ge# #lt# #le#and# #or#低 <= = >= 4.2 lingo中的數(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;否則,返回1floor(x) 返回x的整數(shù)部分。當(dāng)x>=0時,返回不超過x的最大整數(shù);當(dāng)x<0時,返回不低于x的最大整數(shù)。smax(x1,x2,xn

33、) 返回x1,x2,xn中的最大值smin(x1,x2,xn) 返回x1,x2,xn中的最小值 例4.3 給定一個直角三角形,求包含該三角形的最小正方形。 解:如圖所示。abcddaeabx求最小的正方形就相當(dāng)于求如下的最優(yōu)化問題:lingo代碼如下: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); bn

34、d(0,x,1.57);end 在上面的代碼中用到了函數(shù)bnd,此函數(shù)確定變量的界。 4.3 金融函數(shù)目前l(fā)ingo提供了兩個金融函數(shù)。1fpa(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

35、(.0531,10);答案是x=6573.069元。2fpl(i,n)返回如下情形的凈現(xiàn)值:單位時段利率為i,第n個時段支付單位費用。fpl(i,n)的計算公式為。細(xì)心的讀者可以發(fā)現(xiàn)這兩個函數(shù)間的關(guān)系:。  4.4 概率函數(shù)1pbn(p,n,x)二項分布的累積分布函數(shù)。當(dāng)n和(或)x不是整數(shù)時,用線性插值法進(jìn)行計算。2pcx(n,x)自由度為n的2分布的累積分布函數(shù)。3peb(a,x)當(dāng)?shù)竭_(dá)負(fù)荷為a,服務(wù)系統(tǒng)有x個服務(wù)器且允許無窮排隊時的erlang繁忙概率。4pel(a,x)當(dāng)?shù)竭_(dá)負(fù)荷為a,服務(wù)系統(tǒng)有x個服務(wù)器且不允許排隊時的erlang繁忙概率。5pfd(n,d,x)自由度為n和

36、d的f分布的累積分布函數(shù)。6pfs(a,x,c)當(dāng)負(fù)荷上限為a,顧客數(shù)為c,平行服務(wù)器數(shù)量為x時,有限源的poisson服務(wù)系統(tǒng)的等待或返修顧客數(shù)的期望值。a是顧客數(shù)乘以平均服務(wù)時間,再除以平均返修時間。當(dāng)c和(或)x不是整數(shù)時,采用線性插值進(jìn)行計算。7phg(pop,g,n,x)超幾何(hypergeometric)分布的累積分布函數(shù)。pop表示產(chǎn)品總數(shù),g是正品數(shù)。從所有產(chǎn)品中任意取出n(npop)件。pop,g,n和x都可以是非整數(shù),這時采用線性插值進(jìn)行計算。8ppl(a,x)poisson分布的線性損失函數(shù),即返回max(0,z-x)的期望值,其中隨機(jī)變量z服從均值為a的poisson

37、分布。9pps(a,x)均值為a的poisson分布的累積分布函數(shù)。當(dāng)x不是整數(shù)時,采用線性插值進(jìn)行計算。10psl(x)單位正態(tài)線性損失函數(shù),即返回max(0,z-x)的期望值,其中隨機(jī)變量z服從標(biāo)準(zhǔn)正態(tài)分布。11psn(x)標(biāo)準(zhǔn)正態(tài)分布的累積分布函數(shù)。12ptd(n,x)自由度為n的t分布的累積分布函數(shù)。13qrand(seed)產(chǎn)生服從(0,1)區(qū)間的擬隨機(jī)數(shù)。qrand只允許在模型的數(shù)據(jù)部分使用,它將用擬隨機(jī)數(shù)填滿集屬性。通常,聲明一個m×n的二維表,m表示運行實驗的次數(shù),n表示每次實驗所需的隨機(jī)數(shù)的個數(shù)。在行內(nèi),隨機(jī)數(shù)是獨立分布的;在行間,隨機(jī)數(shù)是非常均勻的。這些隨機(jī)數(shù)是用

38、“分層取樣”的方法產(chǎn)生的。例4.5 model:data: m=4; n=2; seed=1234567;enddatasets: rows/1.m/; cols/1.n/; table(rows,cols): x;endsetsdata: x=qrand(seed);enddataend如果沒有為函數(shù)指定種子,那么lingo將用系統(tǒng)時間構(gòu)造種子。14rand(seed)返回0和1間的偽隨機(jī)數(shù),依賴于指定的種子。典型用法是u(i+1)=rand(u(i)。注意如果seed不變,那么產(chǎn)生的隨機(jī)數(shù)也不變。例4.6 利用rand產(chǎn)生15個標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù)和自由度為2的t分布的隨機(jī)數(shù)。model:

39、!產(chǎn)生一列正態(tài)分布和t分布的隨機(jī)數(shù);sets: series/1.15/: u, znorm, zt;endsets  !第一個均勻分布隨機(jī)數(shù)是任意的; u( 1) = rand( .1234);  !產(chǎn)生其余的均勻分布的隨機(jī)數(shù); for(series( i)| i #gt# 1: u( i) = rand( u( i - 1) );  for( series( i): !正態(tài)分布隨機(jī)數(shù); psn( znorm( i) = u( i); !和自由度為2的t分布隨機(jī)數(shù); ptd( 2, zt( i) = u( i); !znorm 和 zt 可以是負(fù)數(shù); free(

40、 znorm( i); free( zt( i); );end 4.5 變量界定函數(shù)變量界定函數(shù)實現(xiàn)對變量取值范圍的附加限制,共4種:bin(x) 限制x為0或1bnd(l,x,u) 限制lxufree(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的約束。 4.6 集操作函數(shù)lingo提供了幾個函數(shù)幫助處理集。1.in(set_name,primitive

41、_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):;endsets2index(set_name, primitive_set_element)該函數(shù)返回在集set_name中原始集成員primitive_set_element的索引。如果set_name被忽略,那么lingo將返回與primitive_set_element匹配的第一個原始集成員的索引。如果找不到,則產(chǎn)生一個錯誤。例4.8 如何確

42、定集成員(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(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=ind

43、ex-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_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ù)之一;setnam

44、e是要遍歷的集;set_ index_list是集索引列表;conditional_qualifier是用來限制集循環(huán)函數(shù)的范圍,當(dāng)集循環(huán)函數(shù)遍歷集的每個成員時,lingo都要對conditional_qualifier進(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_

45、list,那么在expression_list中引用的所有屬性的類型都是setname集。1for該函數(shù)用來產(chǎn)生對集成員的約束。基于建模語言的標(biāo)量需要顯式輸入每個約束,不過for函數(shù)允許只輸入一個約束,然后lingo自動產(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;

46、endsetsdata: x = 5 1 3 4 6 10;enddata s=sum(number(i) | i #le# 5: x);end3min和max返回指定的集成員的一個表達(dá)式的最小值或最大值。例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 下面

47、看一個稍微復(fù)雜一點兒的例子。例4.13 職員時序安排模型 一項工作一周7天都需要有人(比如護(hù)士工作),每天(周一至周日)所需的最少職員數(shù)為20、16、13、16、19、14和12,并要求每個職員一周連續(xù)工作5天,試求每周所需最少職員數(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(d

48、ays(i) | i #le# 5: start(wrap(j+i+2,7) >= required(j);end計算的部分結(jié)果為global optimal solution found at iteration: 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.0

49、00000 required( fri) 19.00000 0.000000 required( sat) 14.00000 0.000000 required( sun) 12.00000 0.000000 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.

50、000000 0.000000從而解決方案是:每周最少需要22個職員,周一安排8人,周二安排2人,周三無需安排人,周四安排6人,周五和周六都安排3人,周日無需安排人。 §5 lingo中的菜單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菜單中選用“l(fā)ook”命令或直接按ctrl+l組合鍵可以查看全部的或選中的模型文本內(nèi)容。4 靈敏性分析(range,ctrl+r)用該命令產(chǎn)生當(dāng)前模型的靈敏性分析報告:研究當(dāng)目標(biāo)函數(shù)的費用系數(shù)和約束右端項在什么范圍(此時假定其它系數(shù)不變)時,最優(yōu)基保持不變。靈敏性分析是在求解模型時作出的,因此在求解模型時靈敏性分析是激活狀態(tài),但是

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論