LINGO函式與運算子

2021-09-01 00:13:31 字數 4155 閱讀 3729

#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...