Lingo軟件中存在各種各樣的運算符及相關函數,能夠有效的幫助我們建立並求解複雜的優化模型。

Lingo軟件中存在各種各樣的運算符及相關函數,能夠有效的幫助我們建立並求解複雜的優化模型。
Lingo中包含9個類型的函數:

基本運算符:包含算術運算符,邏輯運算符和關係運算符
數學函數:三角函數和常規的數學函數
金融函數:Lingo提供了兩種金融函數
概率函數:Lingo提供了大量的概率函數
變量界定函數:這類函數用來定義變量的取值範圍
集操作函數:這類函數對集的操作提供幫助
集循環函數
數據輸入輸出函數
輔助函數:各種雜類函數
1.基本運算符:
算術運算符:^ (乘方);*(乘);/(除);+(加);-(減);-(一元運算符取反函數)
邏輯運算符(對應的運算優先級從高到低):

#not# 否定該操作數的邏輯值,#not#是一個一元運算符
#eq# 若兩個運算數相等,則爲 true;否則爲 flase
#ne# 若兩個運算符不相等,則爲 true;否則爲 flase
#gt# 若左邊的運算符嚴格大於右邊的運算符,則爲 true;否則爲 flase
#ge# 若左邊的運算符大於或等於右邊的運算符,則爲 true;否則爲 flase
#lt# 若左邊的運算符嚴格小於右邊的運算符,則爲 true;否則爲 flase
#le# 若左邊的運算符小於或等於右邊的運算符,則爲 true;否則爲 flase
#and# 僅當兩個參數都爲 true 時,結果爲 true;否則爲 flase
#or# 僅當兩個參數都爲 false 時,結果爲 false;否則爲 true
1
2
3
4
5
6
7
8
9
關係運算符:
Lingo中有三種關係運算符:“=”,“<=”,”>=”,需要注意的是,Lingo中不支持嚴格大於和嚴格小於關係運算符。

2.數學函數:
LINGO 提供了大量的標準數學函數:
@abs(x) 返回 x 的絕對值
@sin(x) 返回 x 的正弦值,x 採用弧度制
@cos(x) 返回 x 的餘弦值
@tan(x) 返回 x 的正切值
@exp(x) 返回常數 e 的 x 次方
@log(x) 返回 x 的自然對數
@lgm(x) 返回 x 的 gamma 函數的自然對數
@sign(x) 如果 x<0 返回-1;否則,返回 1
@floor(x) 返回 x 的整數部分。當 x>=0 時,返回不超過 x 的
最大整數;當 x<0 時,返回不低於 x 的最大整數。
@smax(x1,x2,…,xn) 返回 x1,x2,…,xn 中的最大值
@smin(x1,x2,…,xn) 返回 x1,x2,…,xn 中的最小值

3.金融函數:
@fpa(I,,n):返回一個現值,其單位時間利率爲I,連續支付n個時間段,該支付所對應的現值,示例程序如下:
貸款金額 50000 元,貸款年利率 5.31%,採取分期付款方式(每
年年末還固定金額,直至還清)。問擬貸款 10 年,每年需償還多少元?

50000 = x * @fpa(.0531,10)
1
@fpl(I,n):返回如下情形的淨現值,單位時間的利率爲I,第n個時間段支付單位費用的現值,可以認爲對它求和得到@fpa(I,n)的值。

4.概率函數:
對這一塊暫時不瞭解,留待以後解決。

5.變量界定函數:
變量界定函數實現對變量取值範圍的附加限制,共 4 種:
@bin(x) 限制 x 爲 0 或 1
@bnd(L,x,U) 限制 L≤x≤U
@free(x) 取消對變量 x 的默認下界爲 0 的限制,即 x 可以取任意實數
@gin(x) 限制 x 爲整數
在默認情況下,LINGO 規定變量是非負的,也就是說下界爲 0,上界爲+∞。@free 取消了默認的下界爲 0 的限制,使變量也可以取負值。@bnd 用於設定一個變量的上下界,它也可以取消默認下界爲 0 的約束。

6.集操作函數

7.集循環函數:
這裏重點提供四個函數
@for:該函數用來產生對集成員的約束。基於建模語言的標量需要顯式輸入每個約束,不過@for 函數允許只輸入一個約束,然後 LINGO 自動產生每個集成員的約束,示例程序如下:

model:
sets:
number/1…5/:x;
endsets
@for(number(I): x(I)=I^2);
end
1
2
3
4
5
6
@sum:該函數返回遍歷指定的集成員的一個表達式的和,示例程序如下:

model:
data:
N=6;
enddata
sets:
number/1…N/:x;
endsets
data:
x = 5 1 3 4 6 10;
enddata
s=@sum(number(I) | I #le# 5: x);
end
1
2
3
4
5
6
7
8
9
10
11
12
@max和@min:返回指定的集成員的一個表達式的最小值或最大值,示例程序如下:

model:
data:
N=6;
enddata
sets:
number/1…N/:x;
endsets
data:
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
1
2
3
4
5
6
7
8
9
10
11
12
13
下面提供一個複雜一點的例子:
例 4.13 職員時序安排模型 一項工作一週 7 天都需要有人(比如護士工作), 每天 (周
一至週日)所需的最少職員數爲 20、16、13、16、19、14 和 12,並要求每個職員一週連續
工作 5 天,試求每週所需最少職員數,並給出安排。注意這裏我們考慮穩定後的情況。

model:
sets:
days/mon…sun/: required,start;
endsets
data:
!每天所需的最少職員數;
required = 20 16 13 16 19 14 12;
enddata
!最小化每週所需職員數;
min=@sum(days: start);
@for(days(J):
@sum(days(I) | I #le# 5:
start(@wrap(J+I+2,7))) >= required(J));
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
8.輸入和輸出函數

9.輔助函數:
@if(logical_condition,true_result,false_result):@if 函數將評價一個邏輯表達式 logical_condition,如果爲真,返回 true_ result,
否則返回 false_result。
求解最優化問題,其問題的約束條件中含有分段函數,示例代碼如下:

model:
min=fx+fy;
fx=@if(x #gt# 0, 100,0)+2x;
fy=@if(y #gt# 0,60,0)+3
y;
x+y>=30;
end
1
2
3
4
5
6
下面提供一個比較基礎但綜合應用的例子:
例 1.2 使用 LINGO 軟件計算 6 個發點 8 個收點的最小費用運輸問題。產銷單位運價如下表。

位 銷地


產地
B1 B2 B3 B4 B5 B6 B7 B8 產量
A1 6 2 6 7 4 2 5 9 60
A2 4 9 5 3 8 5 8 2 55
A3 5 2 1 9 7 4 3 3 51
A4 7 6 7 3 9 2 7 1 43
A5 2 3 9 5 7 2 6 5 41
A6 5 5 2 2 8 1 4 3 52
銷量 35 37 22 32 41 32 43 38
使用 LINGO 軟件,編制程序如下:

model:
!6 發點 8 收點運輸問題;
sets:
warehouses/wh1…wh6/: capacity;
vendors/v1…v8/: demand;
links(warehouses,vendors): cost, volume;
endsets
!目標函數;
min=@sum(links: cost*volume);
!需求約束;
@for(vendors(J):
@sum(warehouses(I): volume(I,J))=demand(J));
!產量約束;
@for(warehouses(I):
@sum(vendors(J): volume(I,J))<=capacity(I));
!這裏是數據;
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;
enddata
end

作者:ChasingdreamLY
來源:CSDN
原文:https://blog.csdn.net/qq_26591517/article/details/50674581
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章