【Lingo】lingo使用
目錄
- 規劃
- LINGO 有 9 種類型的函數:
- 算術運算符
- LINGO 具有9種邏輯運算符:
- 優先級
- 數學函數
- 金融函數
- 概率函數
- 變量界定函數
- 集操作函數
- 集循環函數
- 輸入和輸出函數
- 結果報告函數
- 輔助函數
規劃
max?2x1+x2s.t.x1+x2≥350x1≥1002x1+x2≤600x1,x2≥0\begin{array}{l} \hspace*{1.5cm}\max{\rm{ }}2x_1+x_2\\ s.t.\hspace*{1cm}{\rm{ }}x_1+x_2\ge {\rm{ }}350\\ \hspace*{1.5cm}x_1\ge100\\ \hspace*{1.5cm}2x_1+x_2\le600\\ \hspace*{1.5cm}x_1,x_2\ge0 \end{array} max2x1?+x2?s.t.x1?+x2?≥350x1?≥1002x1?+x2?≤600x1?,x2?≥0?
Lingo代碼
max?98x1+277x2?x12?0.3x1x2?2x22s.t.x1+x2≤100x1≤2x2x1,x2≥0\begin{array}{l} \hspace*{1.5cm}\max{\rm{ }}98x_1+277x_2-x_1^2-0.3x_1x_2-2x_2^2\\ s.t.\hspace*{1cm}{\rm{ }}x_1+x_2\le {\rm{ }}100\\ \hspace*{1.5cm}x_1\le2x_2\\ \hspace*{1.5cm}x_1,x_2\ge0 \end{array} max98x1?+277x2??x12??0.3x1?x2??2x22?s.t.x1?+x2?≤100x1?≤2x2?x1?,x2?≥0?
lingo代碼
LINGO 有 9 種類型的函數:
1. 基本運算符:包括算術運算符、邏輯運算符和關系運算符;
2. 數學函數:三角函數和常規的數學函數;
3. 金融函數:LINGO 提供的兩種金融函數;
4. 概率函數:LINGO 提供了大量概率相關的函數;
5. 變量界定函數:這類函數用來定義變量的取值范圍;
6. 集操作函數:這類函數為對集的操作提供幫助;
7. 集循環函數:遍歷集的元素,執行一定的操作的函數;
8. 數據輸入輸出函數:這類函數允許模型和外部數據源相聯系,進行數據的輸入
輸出;
9. 輔助函數:各種雜類函數。
算術運算符
算術運算符是針對數值進行操作的。LINGO 提供了 5 種二元運算符:
^ 乘方
﹡ 乘
/ 除
﹢ 加
﹣ 減
LINGO 唯一的一元算術運算符是取反函數“﹣”。
這些運算符的優先級由高到底為:
高 ﹣(取反)
^
﹡/
低 ﹢﹣
LINGO 具有9種邏輯運算符:
- #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
優先級
高 #not#
#eq# #ne# #gt# #ge# #lt# #le#
低 #and# #or#
數學函數
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 函數的自然對數。
@mod(x,y):返回 x 除以 y 的余數。
@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 中的最小值。
金融函數
1.@fpa(I,n)
2.@fpl(I,n)
@fpa(I,n)=∑k=1n@fpl(I,k)@fpa(I,n )=\sum\limits_{{{k}} = 1}^n {@fpl( I,k )}@fpa(I,n)=k=1∑n?@fpl(I,k)。
概率函數
1.@pbn(p,n,x)
二項分布的累積分布函數。當 n 和(或)x 不是整數時,用線性插值法進行計算。
2.@pcx(n,x)
自由度為 n 的 χ2χ^2χ2分布的累積分布函數。
3.@peb(a,x)
當到達負荷為 a,服務系統有 x 個服務器且允許無窮排隊時的Erlang 繁忙概率。
4.@pel(a,x)
當到達負荷為 a,服務系統有 x 個服務器且不允許排隊時的 Erlang 繁忙概率。
5.@pfd(n,d,x)
自由度為 n 和 d 的 F 分布的累積分布函數。
6.@pfs(a,x,c)
當負荷上限為 a,顧客數為 c,平行服務器數量為 x 時,有限源的 Poisson 服務系統的等待或返修顧客數的期望值。a 是顧客數乘以平均服務時間,再除以平均返修時間。當 c 和(或)x 不是整數時,采用線性插值進行計算。
7.@phg(pop,g,n,x)
超幾何(Hypergeometric)分布的累積分布函數。pop 表示產品總數,g 是正品數。從所有產品中任意取出 n(n≤pop)件。pop,g,n 和 x 都可以是非整數,這時采用線性插值進行計算。
8.@ppl(a,x)
Poisson 分布的線性損失函數,即返回 max(0,z-x)的期望值,其中隨機變量 z 服從均值為 a 的 Poisson 分布。
9.@pps(a,x)
均值為 a 的 Poisson 分布的累積分布函數。當 x 不是整數時,采用線性插值進行計算。
10.@psl(x)
單位正態線性損失函數,即返回 max(0,z-x)的期望值,其中隨機變量 z 服從標準
正態分布。
11.@psn(x)
標準正態分布的累積分布函數。
12.@ptd(n,x)
自由度為 n 的 t 分布的累積分布函數。
13.@qrand(seed)
產生服從(0,1)區間的擬隨機數。@qrand 只允許在模型的數據部分使用,它將用擬隨機數填滿集屬性。通常,聲明一個 m×n 的二維表,m 表示運行實驗的次數,n 表示每次實驗所需的隨機數的個數。在行內,隨機數是獨立分布的;在行間,隨機數是非常均勻的。這些隨機數是用“分層取樣”的方法產生的。
變量界定函數
變量界定函數實現對變量取值范圍的附加限制,共 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 的約束。
集操作函數
1.@in(set_name,primitive_index_1 [,primitive_index_2,…])
如果元素在指定集中,返回 1;否則返回 0。
sets: I/x1..x4/:x; B(I)/x2/:y; C(I)|#not#@in(B,&1):z; endsets2.@index([set_name,] primitive_set_element)
該函數返回在集 set_name 中原始集成員 primitive_set_element 的索引。如果set_name 被忽略,那么 LINGO 將返回與primitive_set_element 匹配的第一個原始集成員的索引。如果找不到,則產生一個錯誤。
sets: S1/A B C/; S2/X Y Z/; S3(S1,S2)/A X, A Z, B Y, C X/; endsets X=@in(S3,@index(S1,B),@index(S2,Y));3.@wrap(index,limit)
該函數返回 j=index-k*limit,其中 k 是一個整數,取適當值保證 j 落在區間[1,limit]內。該函數在循環、多階段計劃編制中特別有用。
4.@size(set_name)
該函數返回集 set_name 的成員個數。在模型中明確給出集大小時最好使用該函數。它的使用使模型更加數據中立,集大小改變時也更易維護
集循環函數
集循環函數遍歷整個集進行操作。其語法為
@function(setname[(set_index_list)[|conditional_qualifier]]: expression_list);
@function 相應于下面羅列的四個集循環函數之一;setname 是要遍歷的集;set_ index_list 是集索引列表;conditional_qualifier 是用來限制集循環函數的范圍,當集循環函數遍歷集的每個成員時,LINGO 都要對 conditional_qualifier 進行評價,若結果為真,則對該成員執行@function 操作,否則跳過,繼續執行下一次循環。expression_list 是被應用到每個集成員的表達式列表,當用的是@for 函數時,expression_list 可以包含多個表達式,其間用逗號隔開。這些表達式將被作為約束加到模型中。當使用其余的三個集循環函數時,expression_list 只能有一個表達式。如果省略set_index_list,那么在 expression_list 中引用的所有屬性的類型都是setname 集。
1.@for
該函數用來產生對集成員的約束。基于建模語言的標量需要顯式輸入每個約束,不過@for 函數允許只輸入一個約束,然后 LINGO 自動產生每個集成員的約束。
2.@sum
該函數返回遍歷指定的集成員的一個表達式的和。
3.@min 和@max
返回指定的集成員的一個表達式的最小值或最大值。
輸入和輸出函數
1.@file 函數
該函數用從外部文件中輸入數據,可以放在模型中任何地方。該函數的語法格式為@file(’filename’)。這里 filename 是文件名,可以采用相對路徑和絕對路徑兩種表示方式。
2.@text 函數
該函數被用在數據部分用來把解輸出至文本文件中。它可以輸出集成員和集屬性
值。其語法為
這里 filename 是文件名,可以采用相對路徑和絕對路徑兩種表示方式。如果忽略filename,那么數據就被輸出到標準輸出設備(大多數情形都是屏幕)。@text 函數僅能出現在模型數據部分的一條語句的左邊,右邊是集名(用來輸出該集的所有成員名)或集屬性名(用來輸出該集屬性的值)。
我們把用接口函數產生輸出的數據聲明稱為輸出操作。輸出操作僅當求解器求解完模型后才執行,執行次序取決于其在模型中出現的先后。
3.@ole 函數
@OLE 是從 EXCEL 中引入或輸出數據的接口函數,它是基于傳輸的 OLE 技術。OLE傳輸直接在內存中傳輸數據,并不借助于中間文件。當使用@OLE 時,LINGO 先裝載 EXCEL,再通知 EXCEL 裝載指定的電子數據表,最后從電子數據表中獲得 Ranges。為了使用 OLE函數,必須有 EXCEL5 及其以上版本。OLE 函數可在數據部分和初始部分引入數據。
@OLE 可以同時讀集成員和集屬性,集成員最好用文本格式,集屬性最好用數值格式。原始集每個集成員需要一個單元(cell),而對于 n 元的派生集每個集成員需要 n個單元,這里第一行的 n 個單元對應派生集的第一個集成員,第二行的 n 個單元對應派生集的第二個集成員,依此類推。
@OLE 只能讀一維或二維的 Ranges(在單個的 EXCEL 工作表(sheet)中),但不能讀間斷的或三維的 Ranges。Ranges 是自左而右、自上而下來讀。
結果報告函數
1.@WRITE(obj1[,…,objn])
這個函數只能在數據段中使用,用于輸出一系列結果(obj1,…,objn),其中obj1, …,objn 等可以是變量(但不能只是屬性),也可以是字符串(放在單引號中的為字符串)或換行(@NEWLINE(1))等。結果可以輸出到一個文件,或電子表(如 Excel),或數據庫,這取決于@WRITE 所在的輸出語句中左邊的定位函數。例如:
DATA:
@TEXT()=@WRITE(’A is ’,A,’,B is ’,B,’,A/B is’,A/B);
ENDDATA
其中 A,B 是模型中的變量,則上面語句的作用是在屏幕上輸出 A,B 以及 A/B 的值(注意上面語句中還增加了一些字符串,使結果讀起來更方便)。假設計算結束時 A=10,B=5,則輸出為 A is 10, B is 5, A/B is 2
2.@WRITEFOR(setname[(set_index_list)[|condition]]:obj1[,objn])
這個函數可以看作是函數@WRITE 在循環情況下的推廣,它輸出集合上定義的屬性對應的多個變量的取值(因此它實際上也是一個集合循環函數)。
3.@ITERS()
這個函數只能在程序的數據段使用,調用時不需要任何參數,總是返回 LINGO 求解器計算所使用的總迭代次數。例如: @TEXT()=@WRITE('Iterations= ',@ITERS());
將迭代次數顯示在屏幕上。
4.@NEWLINE(n)
這個函數在輸出設備上輸出 n 個新行(n 為一個正整數)。
5.@STRLEN(string)
這個函數返回字符串“string”的長度,如@STRLEN(123)返回值為 3。
6.@NAME(var_or_row_reference)
這個函數返回變量名或行名。
7.符號“*”
在@write 和@writefor 函數中,可以使用符號“”表示將一個字符串重復多次,
用法是將“”放在一個正整數 n 和這個字符串之間,表示將這個字符串重復 n 次。
8.@format(value,format_descriptor)
在@write 和@writefor 函數中,可以使用@format 函數對數值設定輸出格式。其中value 表示要輸出的數值,而 format_descriptor(格式描述符)表示輸出格式。格式描述符的含義與 C 語言中的格式描述是類似的,如“12.2f”表示輸出一個十進制數,總共占 12,其中有 2 位小數。
9.@ranged(variable_or_row_name)
為了保持最優基不變,變量的費用系數或約束行的右端項允許減少的量。
10.@rangeu(variable_or_row_name)
為了保持最優基不變,變量的費用系數或約束行的右端項允許增加的量。
11.@status()
返回 LINGO 求解模型結束后的狀態:
- Global Optimum(全局最優)
- Infeasible(不可行)
- Unbounded(無界)
- Undetermined(不確定)
- Feasible(可行)
- Infeasible or Unbounded(通常需要關閉“預處理”選項后重新求解模型,以確定模型究竟是不可行還是無界)
- Local Optimum(局部最優)
- Locally Infeasible(局部不可行,盡管可行解可能存在,但是LINGO 并沒有找到一個)
- Cutoff(目標函數的截斷值被達到)
- Numeric Error(求解器因在某約束中遇到無定義的算術運算而停止)
通常,如果返回值不是 0、4 或 6 時,那么解將不可信,幾乎不能用。該函數僅
12.@dual
@dual(variable_or_row_name)返回變量的判別數(檢驗數)或約束行的對偶(影
子)價格(dual prices)。
輔助函數
1.@if(logical_condition,true_result,false_result)
@if 函數將評價一個邏輯表達式 logical_condition,如果為真,返回 true_ result,否則返回 false_result。
2.@warn(’text’,logical_condition)
如果邏輯條件 logical_condition 為真,則產生一個內容為’text’的信息框。
總結
以上是生活随笔為你收集整理的【Lingo】lingo使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 桌面小插件下载地址,桌面
- 下一篇: DO280介绍红帽OPENSHIFT容器