#not# 否定該運算元的邏輯值
#eq# 若兩個運算數相等,則為true,否則false;
#ne# 若兩個運算子不相等,則為true,否則為false
#gt# 若左邊的運算子嚴格大於右邊的運算子,則為true,否則為false
#ge# 若左邊的運算子嚴格大於或等於右邊的運算子,則為true,否則為false
#lt# 若左邊的運算子嚴格小於右邊的運算子,則為true,否則為false
#lg# 若左邊的運算子嚴格大於右邊或等於的運算子,則為true,否則為false
#and# 即邏輯且
#or# 邏輯或
優先順序由高到低
高 #not#
#eq# #ne# #gt# #ge# #lt# #le#
低 #and# #or#
注:算數運算子(+,-,×,/)和關係運算子(=,>=,<=)與其他語言等類似,特殊之處為lingo不嚴格支援大於或者等於關係,若需要表示a所有操作符的優先順序:
高 #not# -(取反)
#eq# #ne# #gt# #ge# #lt# #le#
#and# #or#
低 <==>=
@abs(x) 返回x的絕對值
@cos(x) 返回x的余弦值
@sin(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) 返回x1x2…,xn中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值
這裡給出乙個例子:
model:
sets:
object/1..3/:f;
endsets
data:
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
變數界定函式實現對變數取值範圍附加限制,共4中:
@bin(x) 限制x為0或1
@bnd(l,x,u) 限制l<=x<@free(x) 取消變數x的預設下屆為0的限制,即x可以為任意數
@gin(x) 限制x為整數
如果元素在指定集內則返回1,否則返回0;
sets: !全集為i,c為b的補集
i/x1..x4/;
b(i)/x2/;
c(i)|#not#@in(b&1):;
endsets
該函式返回在集set_name中原是集成員primitive_set_element的索引。如果set_name被忽略,那麼它將返回第乙個原是集成員的索引。
sets: !如何確定集成員(b,y)屬於派生集s3
s1/a b c/;
s2/x y z/;
s3(s1,s2)/a x,a z,b,y,c x/;
endsets
該函式返回j=index-limit×k,相當於index模limit再加1
該函式返回名為"set_name"的集的成員個數
集迴圈函式整個集進行操作。其語法是
@function(setname[(set_index_list))[|conditional_qualifier]]:expression_list);
其中@function是對應的四個集迴圈之一;setname是要遍歷的集;set_index_list是集索引列表;conditional_qualifier是用來限制集迴圈函式範圍,當集迴圈函式遍歷集的每個成員時,lingo都要對其進行評價,只有當結果為真時,才會執行@function操作,否則跳過,進行到下一次迴圈。expression_list是被應用到每個及成員函式的表示式列表。當是@for時,它可以包含多個表示式,用逗號隔開;否則其只能含有乙個函式。這些表示式將被作為約束加到模型中去。
下面使用例子依次介紹四個集迴圈函式
(1)@for
該函式用來產生對集成員的約束。@for函式允許只輸入乙個約束,然後lingo自動產生每個集成員的約束。
例:產生序列
model:
sets:
number/1..5/:x;
endsets
@for(number(i):x(i)=i^2);
end
(2) @sum
該函式返回遍歷指定集成員的乙個表示式的和
例:求向量【5,1,3,4,6,10】前五個數的和。
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
(3)@min和@max
該函式返回指定的集成員的乙個表示式的最小值或者是最大值
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";
end
下面來看乙個稍微複雜一點的例子
例:職員時序安排模型 一項工作一周七天都需要有人,每天(周一至週日)所需的最少職員數字20,16,13,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)); !@wrap(index, limit)返回的是 index - k * limit 其中k是乙個整數 它使得返回值落到[1,limit]上;
end
(4)@prod:內積
@text('filename')
@ole('filename')
@ranged(varieble_or_row_name)
@rangeu(varieble_or_row_name)
@status()
@dual(varieble_or_row_name)
@warn('text',logical_condition)
lingo學習筆記,參考《數學模型與實驗》——王紹恆,王良偉與部落格
NOT運算子與 運算子
6.4.2 not運算子與 運算子 對於簡單的條件查詢,not運算子與 運算子的功能幾乎沒有什麼區別,那麼not運算子的優勢體現在 呢?答案是它可以與其他運算子組合使用,這一點是 運算子所不能實現的。在6.4.1節已經介紹了not運算子與in運算子組合使用的例子,下面給出乙個not運算子與betwe...
C語言 運算子與 運算子
我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如 輸出結果為 然而,我們期望輸出的結果是 5 20 2513 14 27 這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集 帶參巨集 中,號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果a是乙個巨集形參,那麼 a就是...
vbScript常用運算子與函式
基本運算 數字加法及字串連線 數字減法 數字乘法 數字除法 mod 求餘數 求商數 字串連線 次方 相等 不相等 大於或等於 大於 小於或等於 小於 not 非 and 且 or 或 xor 異或 迴圈及決策 if then 若.則.if then.else 若.則.非 else if.非若 sel...