LINGO使用教程資料_第1頁
LINGO使用教程資料_第2頁
LINGO使用教程資料_第3頁
LINGO使用教程資料_第4頁
LINGO使用教程資料_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

LINGO使用教程

LINGO是用來求解線性和非線性優(yōu)化問題的簡易工具。LINGO內(nèi)置了一種建立最優(yōu)化模型

的語言,可以簡便地表達(dá)大規(guī)模問題,利用LINGO高效的求解器可快速求解并分析結(jié)果。

model:

sets:

A/l..8/:d;

B/l..4/:n;

!n(j)=l代表該候選地址成功作為物流中心;

AB(A,B):vc,ven;

!ven(i,j)代表物料中心i運(yùn)輸?shù)絡(luò)城市的貨物量;

endsets

data:

d=10050120802007060100;

!這里d(i)我理解成需求運(yùn)輸量,不知道是不是你要表達(dá)的意思;

vc=124206

1022510

431614

5692

121873

41449

3020211

1224622;

enddata

min=@suni(AB(i,j):n(j)*vc(i,j)*vcn(i,j));

@sum(B:n)=2;

?for(A(i):@sum(B(j):n(j)*vcn(i,j))=d(i));

@for(B:@gin(n));

end

§1LINGO快速入門

當(dāng)你在windows下開始運(yùn)行LINGO系統(tǒng)時,會得到類似下面的一個窗口:

外層是主框架窗口,包含了所有菜單命令和工具條,其它所有的窗口將被包含在主窗口之下。

在主窗口內(nèi)的標(biāo)題為LINCOModel-LINGO1的窗口是LINGO的默認(rèn)模型窗口,建立的模型

都都要在該窗口內(nèi)編碼實(shí)現(xiàn)。下面舉兩個例子。

例1.1如何在LINGO中求解如下的LP問題:

min2X1+3x2

s.t.

xi+x2>35()

K>100

2xt+x2<600

x^x2>0

在模型窗口中輸入如下代碼:

min=2*xl+3*x2;

xl+x2>=350;

xl>=100;

2*xl+x2<=600;

然后點(diǎn)擊工具條上的按鈕松即可。

例1.2使用LINGO軟件計(jì)算6個發(fā)點(diǎn)8個收點(diǎn)的最小費(fèi)用運(yùn)輸問題。產(chǎn)銷單位運(yùn)價如

下表。

單\

位\銷地

B.B)Bi產(chǎn)量

B2;BsRiBTBR

產(chǎn)地

A,6267425960

A24953858255

A;J5219743351

A,,7673927143

As2395726541

As5522814352

銷量3537223241324338

使用LINGO軟件,編制程序如下:

model:

!6發(fā)點(diǎn)8收點(diǎn)運(yùn)輸問題;

sets:

warehouses/whl..wh6/:capacity;

vendors/vl..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):

@sum(vendors(J):volume(I,J))<=capacity(I));

!這里是數(shù)據(jù);

data:

capacity=605551434152;

demand=3537223241324338;

cost=62674295

49538582

52197433

76739271

23957265

55228143;

enddata

end4

然后點(diǎn)擊工具條上的按鈕壁即可。

為了能夠使用LINGO的強(qiáng)大功能,接著第二節(jié)的學(xué)習(xí)吧。

§2LINGO中的集

對實(shí)際問題建模的時候,總會遇到一群或多群相聯(lián)系的對象,比如工廠、消費(fèi)者群體、交通

工具和雇工等等。LINGO允許把這些相聯(lián)系的對象聚合成集(sets)。一旦把對象聚合成集,

就可以利用集來最大限度的發(fā)揮LINGO建模語言的優(yōu)勢.

現(xiàn)在我們將深入介紹如何創(chuàng)建集,并用數(shù)據(jù)初始化集的屬性。學(xué)完本節(jié)后,你對基于建

模技術(shù)的集如何引入模型會有一個基本的理解。

2.1為什么使用集

集是LINGO建模語言的基礎(chǔ),是程序設(shè)計(jì)最強(qiáng)有力的基本構(gòu)件。借助于集,能夠用一個

單?的、長的、簡明的復(fù)合公式表示??系列相似的約束,從而可以快速方便地表達(dá)規(guī)模較大

的模型。

2.2什么是集

集是一群相聯(lián)系的對象,這些對象也稱為集的成員。一個集可能是一系列產(chǎn)品、卡車或

雇員。每個集成員可能有一個或多個與之有關(guān)聯(lián)的特征,我們把這些特征稱為屬性。屬性值

可以預(yù)先給定,也可以是未知的,有待于LINGO求解。例如,產(chǎn)品集中的每個產(chǎn)品可以有一

個價格屬性;卡車集中的每輛卡車可以有一個牽引力屬性;雇員集中的每位雇員可以有一個

薪水屬性,也可以有一個生日屬性等等。

LINGO有兩種類型的集:原始集(primitiveset)和派生集(derivedset)。

一個原始集是由一些最基本的對象組成的。

一個派生集是用一個或多個其它集來定義的,也就是說,它的成員來白于其它已存在的

集。

2.3模型的集部分

集部分是LINGO模型的一個可選部分。在LINGO模型中使用集之前,必須在集部分事先

定義。集部分以關(guān)鍵字“sets:"開始,以“ondsets”結(jié)束。一個模型可以沒有集部分,或

有一個簡單的集部分,或有多個集部分。一個集部分可以放置于模型的任何地方,但是一個

集及其屬性在模型約束中被引用之前必須定義了它們。

2.3.1定義原始集

為了定義一個原始集,必須詳細(xì)聲明:

?集的名字

?可選,集的成員

?可選,集成員的屬性

定義一個原始集,用下面的語法:

setname[/memberlist/][:attribute_list];

注意:用“口”表示該部分內(nèi)容可是。下同,不再贅忘

Setname是你選擇的來標(biāo)記集的名字,最好具有較強(qiáng)的可讀性。集名字必須嚴(yán)格符合標(biāo)

準(zhǔn)命名規(guī)則:以拉丁字母或下劃線(_)為首字符,其后由拉丁字母(A-Z)s下劃線、阿拉

伯?dāng)?shù)字(0,1,…,9)組成的總長度不超過32個字符的字符串,且不區(qū)分大小寫。

注意:該命名規(guī)則同樣適用于集成員名和屬性名等的命名。

Member」ist是集成員列表。如果集成員放在集定義中,那么對它們可采取顯式羅列和

隱式羅列兩和方式。如果集成員不放在集定義中,那么可以在隨后的數(shù)據(jù)部分定義它們。

①當(dāng)顯式羅列成員時,必須為每個成員輸入一個不同的名字,中間用空格或逗號擱開,

允許混合使用。

例2.1可以定義一個名為students的原始集,它具有成員John、Jill、Rose和Mike,

屬性有sex和age:

sets:

studcnts/JohnJill,RoseMike/:sex,age;

endsets

②當(dāng)隱式羅列成員時,不必羅列出每個集成員??刹捎萌缦抡Z法:

sctname/membcrl..memberN/[:attribute」ist];

這里的memberl是集的第一個成員名,memberN是集的最末一個成員名。LINGO將自比產(chǎn)生

中間的所有成員名。LINGO也接受一些特定的首成員名和末成員名,用于創(chuàng)建一些特殊的集。

列表如下:

隱式成員列表格式示例所產(chǎn)生集成員

1..n1..51,2,3,4,5

StringM..StringNCar2..car14Car2,Car3,Car4,Car14

DayM..DayNMon..FriMon,Tue,Wed,Thu,Fri

MonthM..MonthNOct..JanCct,Nov,Dec,Jan

MonthYearM..MonthYearNOct2001..Jan20020ct2001,Nov2001,Dec2001,Jan2002

③集成員不放在集定義中,而在隨后的數(shù)據(jù)部分來定義。

例2.2

!集部分;

sets:

students:sex,age;

endsets

!數(shù)據(jù)部分;

data:

students,sex,age=John116

Jill014

Rose017

Mike113:

enddata

注意:開頭用感嘆號(!),末尾用分號(;)表示注釋,可跨多行。

在集部分只定義了一個集students,并未指定成員。在數(shù)據(jù)部分羅列了集成員John、

Jill、Rose和Mike,并對屬性sex和age分別給出了值。

集成員無論用何種字符標(biāo)記,它的索引都是從1開始連續(xù)計(jì)數(shù)。在attribute,list可

以指定一個或多個集成員的屬性,屬性之間必須用逗號隔開。

可以把集、集成員和集屬性同C語言中的結(jié)構(gòu)體作個類比。如下圖:

集-一結(jié)構(gòu)體

集成員一一結(jié)構(gòu)體的域

集屬性-一結(jié)構(gòu)體實(shí)例

LINGO內(nèi)置的建模語言是一種描述性語言,用它可以描述現(xiàn)實(shí)世界中的一些問題,然后

再借助于LINGO求解器求解。因此,集屬性的值一旦在模型中被確定,就不可能再更改。在

LINGO中,只有在初始部分中給出的集屬性值在以后的求解中可更改。這與前面并不矛盾、

初始部分是LINGO求解器的需要,并不是描述問題所必須的。

2.3.2定義派生集

為了定義一個派生集,必須詳細(xì)聲明:

?集的名字

?父集的名字

?可選,集成員

?可選,集成員的屬性

可用下面的語法定義一個派生集:

setname(parsntsetlist)[/memberlist/][:attribute_list];

setname是集的名字。parent_set_list是已定義的集的列表,多個時必須用逗號隔開。

如果沒有指定成員列表,那么UNG0會自動創(chuàng)建父集成員的所有組合作為派生集的成員。派

生集的父集既可以是原始集,也可以是其它的派生集。

例2.3

sets:

product/AB/;

machinc/MN/;

week/1..2/;

allowed(product,machine,week):x;

endsets

LINGO生成了三個父集的所有組合共八組作為allowed集的成員。列表如下:

編號成員

1(A,M,1)

22(A,M,2)

33(A,N,1)

44(A,N,2)

55(B,M,1)

66(B,M,2)

77(B,N,1)

88(B,N,2)

成員列表被忽略時.,派生集成員由父集成員所有的組合構(gòu)成,這樣的派生集成為稠密集。

如果限制派生集的成員,使它成為父集成員所有組合構(gòu)成的集合的一個子集,這樣的派生集

成為稀疏集。同原始集?樣,派生集成員的聲明也可以放在數(shù)據(jù)部分。?個派生集的成員列

表有兩種方式生成:①顯式羅列;②設(shè)置成員資格過濾器。當(dāng)采用方式①時,必須顯式羅列

出所有要包含在派生集中的成員,并口羅列的每個成員必須屬于稠密集。使用前面的例子,

顯式羅列派生集的成員:

allowed(product,machine,week)/AM1,AN2,BN1/;

如果需要生成一個大的、稀疏的集,那么顯式羅列就很討厭。幸運(yùn)地是許多稀疏集的成員都

滿足一些條件以和非成員相區(qū)分。我們可以把這些邏輯條件看作過濾器,在LINGO生成派生

集的成員時把使邏輯條件為假的成員從稠密集中過濾掉。

例2.4

sets:

!學(xué)生集:性別屬性sex,1表示男性,0表示女性:年齡屬性age.;

students/John,Jill,Rose,Mike/:sex,age;

!男學(xué)生和女學(xué)生的聯(lián)系集:友好程度屬性friend,[0,1]之間的數(shù)。;

linkmf(students,students)|sex(&l)#eq#1#anddsex(&2)#eq#0:friend;

!男學(xué)生和女學(xué)生的友好程度大于0.5的集;

linkmf2(linkmf)|friend(&1,&2)#gc#0.5:x;

endsets

data:

sex,age=116

014

017

013;

friend=0.30.50.6;

enddata

用豎線(|)來標(biāo)記一個成員資格過濾器的開始。#eq#是邏輯運(yùn)算符,用來判斷是否“相

等”,可參考§4.可看作派生集的第1個原始父集的索引,它取遍該原始父集的所有成

員;&2可看作派生集的第2個原始父集的索引,它取遍該原始父集的所有成員;&3,&4,……,

以此類推。注意如果派生集B的父集是另外的派生集A,那么上面所說的原始父集是集A向

前回溯到最終的原始集,其順序保持不變,并且派生集A的過濾器對派生集B仍然有效。因

此,派生集的索引個數(shù)是最終原始父集的個數(shù),索引的取值是從原始父集到當(dāng)前派生集所作

限制的總和。

總的來說,LINGO可識別的集只有兩種類型:原始集和派生集。

在一個模型中,原始集是基本的對象,不能再被拆分成更小的組分。原始集可以由顯式

羅列和隱式羅列兩種方式來定義。當(dāng)用顯式羅列方式時,需在集成員列表中逐個輸入每個成

員。當(dāng)用隱式羅列方式時,只需在集成員列表中輸入首成員和末成員,而中間的成員由LINGO

產(chǎn)生。

々一方面,派生集是由其它的集來創(chuàng)建。這弊集被稱為該派生集的父集(原始集或其它

的派生集)。一個派生集既可以是稀疏的,也可以是稠密的。稠密集包含了父集成員的所有

組合(有時也稱為父集的笛卡爾乘積)。稀疏集僅包含了父集的笛卡爾乘積的一個子集,可

通過顯式羅列和成員資格過濾器這兩種方式來定義。顯式羅列方法就是逐個羅列稀疏集的成

員。成員資格過濾器方法通過使用稀疏集成員必須滿足的邏輯條件從稠密集成員中過濾出稀

疏集的成員。不同集類型的關(guān)系見下圖。

LINGO集類型

§3模型的數(shù)據(jù)部分和初始部分

在處理模型的數(shù)據(jù)時,需要為集指派一些成員并且在LINGO求解模型之前為集的某些屬

性指定值。為此,LINGO為用戶提供了兩個可選部分:輸入集成員和數(shù)據(jù)的數(shù)據(jù)部分(Data

Section)和為決策變量設(shè)置初始值的初始部分UnitSection)。

3.1模型的數(shù)據(jù)部分

3.1.1數(shù)據(jù)部分入門

數(shù)據(jù)部分提供了模型相對靜止部分和數(shù)據(jù)分離的可能性。顯然,這對模型的維護(hù)和維數(shù)

的縮放非常便利。

數(shù)據(jù)部分以關(guān)鍵字“data:"開始,以關(guān)鍵字“cnddata”結(jié)束。在這里,可以指定集成

員、集的屬性。其語法如下:

object_list=value」:st;

對象列(object」ist)包含要指良值的屬性名、要設(shè)置集成員的集名,用逗號或空格

隔開。一個對象列中至多有一個集名,而屬性名可以有任意多。如果對象列中有多個屬性名,

那么它們的類型必須一致。如果對象列中有一個集名,那么對象列中所有的屬性的類型就是

這個集。

數(shù)值列(valuelist)包含要分配給對象列中的對象的值,用逗號或空格隔開。注意屬

性值的個數(shù)必須等于集成員的個數(shù)??聪旅娴睦?。

例3.1

sets:

setl/A,B,C/:X,Y;

endsets

data:

X=l,2,3;

Y=4,5,6;

enddata

在集setl中定義了兩個屬性X和Y。X的三個值是1、2和3,Y的三個值是4、5和6。

也可采用如下例子中的復(fù)合數(shù)據(jù)聲明(datastatement)實(shí)現(xiàn)同樣的功能。

例3.2

sets:

sctl/A,B,C/:X,Y;

endsets

data:

X,Y=14

25

36;

enddata

看到這個例子,可能會認(rèn)為X被指定了1、4和2三個值,因?yàn)樗鼈兪菙?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)量變量(scalarvariables)。當(dāng)一個標(biāo)量變量在數(shù)據(jù)部

分確定時,稱之為參數(shù)??匆焕僭O(shè)模型中用利率8.5%作為一個參數(shù),就可以象下面一

樣輸入一個利率作為參數(shù),

例3.3

data:

interest_rate=.085;

enddata

也可以I可時指定多個參數(shù),

例3.4

data:

interestrate,inflationrate=.085.03;

enddata

3.1.3實(shí)時數(shù)據(jù)處理

在某些情況,對于模型中的某些數(shù)據(jù)并不是定值。譬如模型中有一個通貨膨脹率的參數(shù),

我們想在2%至佻范圍內(nèi),對不同的值求解模型,來觀察模型的結(jié)果對通貨膨脹的依賴有多

么敏感。我們把這種情況稱為實(shí)時數(shù)據(jù)處理(whatifanalysis)oLINGO有一個特征可方

便地做到這件事。

在本該放數(shù)的地方輸入一個問號(?)。

例3.5

data:

interest_rate,inflation_rate=.085?;

enddata

每?次求解模型時,LING。都會提示為參數(shù)inflationrate輸入一個值。在WINDOWS操作

系統(tǒng)下,將會接收到一個類似下面的對話框:

直接輸入一個值再點(diǎn)擊0K按鈕,LINGO就會把輸入的值指定給inflalionjate,然后繼續(xù)

求解模型。

除了參數(shù)之外,也可以實(shí)時輸入集的屬性值,但不允許實(shí)時輸入集成員名。

3.1.4指定屬性為個值

可以在數(shù)據(jù)聲明的右邊輸入一個值來把所有的成員的該屬性指定為一個值??聪旅娴睦?/p>

子。

例3.6

sets:

days/MO,TU,WE,TH,FR,SA,SU/:needs;

endsets

data:

needs=20;

enddata

LINGO將用20指定days集的所有成員的needs屬性。對于多個屬性的情形,見下例。

例3.7

sets:

days/M0,TU,WE,TH,FR,SA,SU/:needs,cost;

endsets

data:

needscost=20100;

enddata

3.1.5數(shù)據(jù)部分的未知數(shù)值

有時只想為一個集的部分成員的某個屬性指定值,而讓其余成員的該屬性保持未知,以

便讓LINGO去求出它們的最優(yōu)值。在數(shù)據(jù)聲明中輸入兩個相連的逗號表示該位置對應(yīng)佗集成

員的屬性值未知。兩個逗號間可以有空格。

例3.8

sets:

years/1..5/:capacity;

endsets

data:

capacity=,34,20,,;

enddata

屬性capacity的第2個和第3個值分別為34和20,其余的未知。

3.2模型的初始部分

初始部分是LINGO提供的另一個可選部分。在初始部分中,可以輸入初始聲明

(initializationstatement),和數(shù)據(jù)部分中的數(shù)據(jù)聲明相同。對實(shí)際問題的建模時,初

始部分并不起到描述模型的作用,在初始部分輸入的值僅被LINGO求解器當(dāng)作初始點(diǎn)來用,

并且僅僅對非線性模型有用。和數(shù)據(jù)部分指定變量的值不同,LINGO求解器可以自由改變初

始部分初始化的變量的值,

一個初始部分以“init:”開始,以“endinit”結(jié)束。初始部分的初始聲明規(guī)則和數(shù)據(jù)

部分的數(shù)據(jù)聲明規(guī)則相同,也就是說,我們可以在聲明的左邊同時初始化多個集屬性,可以

把集屬性初始化為一個值,可以用問號實(shí)現(xiàn)實(shí)時數(shù)據(jù)處理,還可以用逗號指定未知數(shù)值。

例3.9

init:

X,Y=0,.1;

endinit

Y=@log(X);

X*2+Y-2<=1:

好的初始點(diǎn)會減少模型的求解時間。

在這?節(jié)中,我們僅帶大家接觸了?些基本的數(shù)據(jù)輸入和初始化概念,不過現(xiàn)在你應(yīng)該

可以輕松的為自己的模型加入原始數(shù)據(jù)和初始部分啦。

§4LINGO函數(shù)

有了前幾節(jié)的基礎(chǔ)知識,再加上本節(jié)的內(nèi)容,你就能夠借助于LINGO建立并求解復(fù)雜的

優(yōu)化模型了。

LINGO有9種類型的函數(shù):

1.1.基本運(yùn)算符:包括算術(shù)運(yùn)算符、邏輯運(yùn)算符和關(guān)系運(yùn)算符

2.2.數(shù)學(xué)函數(shù):三角函數(shù)和常規(guī)的數(shù)學(xué)函數(shù)

3.3.金融函數(shù):LINGO提供的兩種金融函數(shù)

4.4.概率函數(shù):LINGO提供了大量概率相關(guān)的函數(shù)

5.5.變量界定函數(shù):這類函數(shù)用來定義變量的取值范圍

6.6.集操作函數(shù):這類函數(shù)為對集的操作提供幫助

7.7.集循環(huán)函數(shù):遍歷集的元素,執(zhí)行一定的操作的函數(shù)

8.8.數(shù)據(jù)輸入輸出函數(shù):這類函數(shù)允許模型和外部數(shù)據(jù)源相聯(lián)系,進(jìn)行數(shù)據(jù)的輸

入輸出

9.9.輔助函數(shù):各種雜類函數(shù)

4.1基本運(yùn)算符

這些運(yùn)算符是非?;镜模踔量梢圆徽J(rèn)為它們是一類函數(shù)。事實(shí)上,在LINGO中它們

是非常重要的。

4.1.1算術(shù)運(yùn)算符

算術(shù)運(yùn)算符是制對數(shù)值進(jìn)行操作的。LINGO提供了5種二元起算符:

人乘

*

/

+

-

“-”

函數(shù)

取反

符是

運(yùn)算

算術(shù)

一元

一的

GO唯

LIN

底為:

由高到

優(yōu)先級

算符的

這些運(yùn)

取反

?(

+-

“()”

括號

川圓

可以

次序

算的

行。運(yùn)

低來執(zhí)

先級高

右按優(yōu)

從左到

次序?yàn)?/p>

的運(yùn)算

運(yùn)算符

改變。

示例。

運(yùn)算符

1算術(shù)

例4.

等。

/5等

+4)

(2

/3,

2-5

輯運(yùn)算

2邏

4.1.

些集

中哪

函數(shù)

制在

,來控

達(dá)式中

條件表

函數(shù)的

集循環(huán)

要用于

算符主

邏輯運(yùn)

O中,

ING

在L

器中。

格過濾

成員資

時用在

稀疏集

在創(chuàng)建

排斥。

哪些被

包含,

成員被

算符:

邏輯運(yùn)

有9種

GO具

LIN

算符

元運(yùn)

個一

溫馨提示

  • 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

提交評論