Lingo_ 运算符及其优先级和函数总览

1.运算符及其优先级

现在归纳一下 LING0 中的三类运算 符:算术运算符、逻辑运算符和关系运算符。

  1. 算术运算符有 5 种:+(加法),—(减法或负号),*(乘法),/(除法),^(求幂)。

  2. 逻辑运算符有 9 种:#AND#(与),#OR#(或),#NOT#(非),#EQ#(等于),#NE# (不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。

  3. 逻 辑运算的结果只有“真”(TRUE)和“假”(FALSE)两个值,LINGO 中用数字 1 代表 TRUE, 其他值(典型的值是 0)都是 FALSE。

  4. 关系运算符有 3 种:<(即<=,小于等于),=(等于),>(即>=,大于等于)。注意在 数学规划中约束一般没有严格小于、严格大于关系。

  5. 这些运算符的优先级 (同一优先级按从左到右的顺序执行;如果有括号 “()”,则括号内的表达式优先进行计算)。
    这里写图片描述

2.函数总览

LINGO 中还包括相当丰富的数学函数和控制语句。在 LINGO 中建立优化模型时可以引用 大量的内部函数,这些函数以”@”符号打头。

2.1 常用的数学函数

@ABS(X) 返回变量 X 的绝对值。
@COS(X) 返回变量 X 的余弦值(X 的单位是弧度)。
@EXP(X) 返回 e X 的值(其中 e 为自然对数的底,即 2.718281…)。
@FLOOR( X) 返回的整数部分(向最靠近 0 的方向取整)。
@LGM(X) 返回变量 X 的 gamma(伽玛)函数的自然对数值(当 X 为整数时 LGM(X) = LOG(X-1)!;当 X 不为整数时,采用线性插值得到结果)。
@LOG(X) 返回变量 X 的自然对数值。
@SIGN(X) 返回变量 X 的符号值( X < 0 时返回-1, X >= 0 时返回+1)。 @SIN(X) 返回变量 X 的正弦值(X 的单位是弧度)。
@SMAX(list ) 返回一列数(list)的最大值。
@SMIN(list ) 返回一列数(list)的最小值。
@TAN(X) 返回变量 X 的正切值(X 的单位是弧度)。

2.2 集合循环函数

集合循环函数的用法如下:
@function( setname [ ( set_index_list)[ | condition]] : expression_list); 其中 function 是集合函数名,有 FOR、MAX、MIN、SUM 四种; setname 是集合名; set_index_list 是集合索引列表(不需使用索引时可以省略);condition 是用逻辑表 达式描述的条件(通常含有索引,无条件时可以省略);expression_list 是一个表达式 (对@FOR 函数,可以是一组表达式)。集合函数名的含义如下:
@FOR 对集合setname的每个元素独立地生成约束,约束由expression_list描述。 @MAX 返回集合 setname 上的表达式的最大值。
@MIN 返回集合 setname 上的表达式的最小值。
@SUM 返回集合 setname 上的表达式的和。

2.3 集合处理函数

@IN( set_name, primitive_index_1 [, primitive_index_2 …])
如果集合 set_name 中包含本集合的元素索引 primitive_index_1 [, primitive_index_2 …]所对应的元素,则返回 1,否则返回 0。元素索引用“&1”、“&2”或@INDEX 函数等形式给出,这里“&1”表示对应于第 1 个父集合的元素的索引值, “&2”表示对应于第 2 个父集合的元素的索引值。
例如,如果我们想定义一个学生集合 STUDENTS(基本集合),然后由它派生一个及格 学生的集合 PASSED 和一个不及格学生的集合 FAILED,可以如下定义:

SETS:
STUDENTS / ZHAO, QIAN, SUN, LI/:;
PASSED( STUDENTS) /QIAN,SUN/:;
FAILED( STUDENTS) | #NOT# @IN( PASSED, &1):;
ENDSETS

又如,如果集合 C 是由集合 A,B 派生的,例如:

      SETS:
          A / 1..3/:;
B / X Y Z/:;
          C( A, B) / 1,X 1,Z 2,Y 3,X/:;
       ENDSETS

现在假设我们想判断 C 中是否包含元素(2,Y),则可以利用以下语句(对本例,C 中确实 包含元素(2,Y),所以 X=1):

 X = @IN( C, @INDEX( A, 2), @INDEX( B, Y));
@INDEX( [set_name,] primitive_set_element)

给出元素 primitive_set_element 在集合 set_name 中的索引值(即顺序位置的编
号)。如果省略 set_name,LINGO 按模型中定义的集合顺序找到第一个含有元素 primitive_set_element 的集合,并返回索引值。如果在所有集合中均没有找到该元素, 会给出出错信息。
@WRAP(I,N)
当I位于区间[1, N ]内时直接返回I;一般地,返回 J = I - K *N , 其中J位于
区间[1, N ], K 为整数。可见这个,此函数相当于数学上用 I 对 N 取模函数的值+1,即 @WRAP(I,N)=I (mode N)+1。此函数对 N<1 无定义。可以想到,此函数的目地之一是可 以用来防止集合的索引越界。
@SIZE (set_name) 返回数据集set_name中包含元素的个数。

2.4变量界定函数

变量函数对变量的取值范围附加限制。共四种:
@BND(L, X, U) 限制L <= X <= U。
@BIN(X) 限制X为0或1。
@FREE(X) 取消对 X 的符号限制(即可取负数、0 或正数)。 @GIN(X) 限制 X 为整数。

2.5财务函数

@FPA(I,N) 返回如下情形下的净现值:单位时段利率为 I,连续 N 个时段支付,每个
∑N
n=1
时段支付单位费用。即@FPA(I,N) = @FPL(I,N) 返回如下情形下的净现值:单位时段利率为 I,第 N 个时段支付单位费用。 即@FPL(I,N) =( 1 )N 。

2.6概率函数

这里我们只是列出这些函数的简要功能,由于牵涉较多概率论和随机过程的概念,请大
家参阅有关概率论和随机过程的书籍。
@PSN(X) 标准正态分布的分布函数。
@PSL(X) 单位正态线性损失函数,即返回 MAX(0, Z-X)的期望值, 其中 Z 为标准正
态随机变量。
@PPS(A,X) 均值为 A 的 Poisson 分布的分布函数(当 X 不是整数时,采用线性插值
进行计算)。
@PPL(A,X)Poisson分布的线性损失函数,即返回 MAX(0,Z-X)的期望值, 其中 Z
为均值为 A 的 Poisson 随机变量。
@PBN(P,N,X) 二项分布的分布函数(当 N 和(或)X 不是整数时,采用线性插值计算)。 @PHG(POP,G,N,X) 超几何(Hypergeometric)分布的分布函数(当 POP,G,N
和(或)X 不是整数时,采用线性插值进行计算)。也就是说,这个就是如下概率: 当总共有 POP 个球,其中 G 个是白球的,那么随机地从中取出 N 个球,白球不超过 X 个的概率。
@PEL(A,X) 当到达负荷为 A,服务系统有 X 个服务器且不允许排队时的 Erlang 损失 概率。
@PEB(A,X) 当到达负荷为 A,服务系统有 X 个服务器且允许无穷排队时的 Erlang 繁 忙概率。
@PFS(A,X,C) 当负荷上限为 A,顾客数为 C,平行服务器数量为 X 时,有限源的 Poisson 服务系统的等待或返修顾客数的期望值。(A 是顾客数乘以平均服务时间, 再除以平均返修时间。当 C 和(或)X 不是整数时,采用线性插值进行计算)。
@PFD(N,D,X) 自由度为 N 和 D 的 F 分布的分布函数。
@PCX(N,X) 自由度为 N 的 Chi-squared 分布的分布函数。
@PTD(N,X) 自由度为 N 的 t 分布的分布函数。
@QRAND(SEED) 返回 0 与 1 之间的拟均匀随机数(SEED 为种子,缺省时取当前计算
机时间)。该函数只能用在数据段,拟均匀随机数可以认为是“超均匀”的随机数。 @RAND(SEED) 返回 0 与 1 之间的伪均匀随机数(SEED 为种子)。

2.7 文件输入输出函数

@DUAL( variable_or_row_name)
返回解答中变量的判别数(reduced cost)或约束行的对偶(影子)价格(dual prices).
@FILE(filename)
当前模型引用其他 ASCII 码文件中的数据或文本时可以采用该语句(但不允许嵌套使
用), 其中filename为存放数据的文件名,该文件中记录之间用“~”分开。例如:

MODEL:
SETS:
MYSET / @FILE(myfile.txt) / : @FILE(myfile.txt);
ENDSETS
MIN = @SUM( MYSET( I):
SHIPPED( I) * COST( I));
@FOR( MYSET( I):
SHIPPED( I) > NEED( I);
SHIPPED( I) < SUPPLY( I));
DATA:
COST = @FILE( myfile.txt);
NEED = @FILE( myfile.txt);
SUPPLY = @FILE( myfile.txt);
ENDDATA
END

myfile.txt 文件的内容可以是如下格式: Seattle,Detroit,Chicago,Denver~ COST,NEED,SUPPLY,SHIPPED~ 12,28,15,20~ 1600,1800,1200,1000~ 1700,1900,1300,1100
@ODBC 和@OLE
分别提供 LINGO 与 ODBC 和 OLE 的接口,这里不详细介绍了。
@POINTER( N)
在 Windows 下使用 LINGO 的动态连接库(Dynamic Link Library,简写为 DLL) ,
直接从共享的内存中传送数据。这里不详细介绍了。
@RANGED( variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量(参见第 3 章 3.3
节敏感性分析中的 allowable decrease)。
@RANGEU( variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量(参见第 3 章 3.3
节敏感性分析中的 allowable increase)。
@STATUS()
返回 LINGO 求解模型结束后的最后状态:
0 Global Optimum (全局最优)
1 Infeasible(不可行)
2 Unbounded (无界)
3 Undetermined (不确定)
4 (LINGO 中没有使用该值)
5 Infeasible or Unbounded (通常需要关闭“预处理”选项后重新求解模型,
以确定究竟是不可行还是无界)
6 Local Optimum(全局最优)
7 Locally Infeasible(局部不可行)
8 Cutoff(目标函数达到了 Cutoff 水平)
9 Numeric Error (约束中遇到了无定义的数学操作)
@TEXT( [‘filename’])
用于数据段中将解答结果送到文本文件 filename 中。当省略 filename 时,结果送到
标准的输出设备(通常就是屏幕)。

2.8其他函数

@IF( logical_condition, true_result, false_result)
当逻辑表达式 logical_condition 的结果为真时,返回 true_result,否则返回 false_result。例如@IF( X #LT# 100, 20, 15)语句,当 X<100 时,返回 20,否则 返回 15。
@WARN(‘text’, logical_condition )
当如果逻辑表达式 logical_condition 的结果为真,显示’text’信息。
@USER( user_determined_arguments)
该函数是允许用户自己编写的函数(DLL 或 OBJ 文件),该用户函数可能应当用 C 或
FORTRAN 等其他语言编写并编译,返回值为用户函数计算的结果。从编程角度来看,@USER 函数包含两个参数:第一个用于指定参数个数,第二个用于指定参数向量;而在 LINGO 中调 用@USER 时则直接指定对应的参数(类似于 C 语言中的 main(argc, argv)的编程和运行 方式)。

猜你喜欢

转载自blog.csdn.net/qq_39481214/article/details/81813122