Lingo函数
Posted lgxo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,否则为 false。
#or# 仅当两个参数都为 false 时,结果为 false,否则为 true。
关系运算符
在 Lingo 中,关系运算符主要用在模型中来指定一个表达式的左边是否等于、小于等于或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符 #eq#、#le#、#ge# 截然不同,逻辑运算符仅仅判断一个关系是否被满足,满足为真,不满为假。
Lingo 有三种关系运算符:"="、"<="和">="。
Lingo中还能用"<“表示小于等于关系,”>"表示大于等于关系。Lingo 并不支持严格小于和严格大于关系运算符。
数学函数
Lingo 提供了大量的标准数学函数:
@abs(x) 返回 x 的绝对值
@sin(x) 返回 x 的正弦值,x 采用弧度制
@cos(x) 返回 x 的余弦值,x 采用弧度制
@tan(x) 返回 x 的正切值,x 采用弧度制
@exp(x) 返回常数 e 的 x 次幂
@log(x) 返回 x 的自然对数
@lgm(x) 返回 x 的 gamma 函数的自然对数
@mod(x, y) 返回 x 的除以 y 的余数
@sign(x) 如果 x<0 返回 -1;如果 x>0 返回 1;如果 x=0 返回0
@floor(x) 返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回不低于 x 的最小整数
@smax(x1, x2, ···, xn) 返回 x1, x2, ···, xn 中的最大值
@smin(x1, x2, ···, xn) 返回 x1, x2, ···, xn 中的最小值
变量界定函数
变量界定函数实现对变量取值范围的附加限制,共4种:
@bin(x) 限制 x 为 0 或 1
@bnd(L, x, U) 限制 L <= x <= U
@free(x) 取消对变量 x 的默认下界为 0 的限制,即 x 可以取任意实数
@gin(x) 限制 x 为整数
在默认情况下,Lingo 规定变量是非负的,也就是说下界为 0,上界为
+
∞
+\\infty
+∞。
@free取消了默认的下界为 0 的限制,使变量也可以取负值。
@bnd用于设定一个变量的上下界,它也可以取消默认下界为 0 的约束。
集循环函数
@for: 该函数用来产生对集成员的约束
@sum: 该函数返回遍历指定的集成员的一个表达式的和。
@min 和 @max: 返回指定的集成员的一个表达式的最小值和最大值。
例:求向量[5, 1, 3, 4, 6, 10]前5个数的最小值,后3个数的最大值。
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
概率函数
- @pbn(p, n, x)
二项分布的累积分布函数。当 n 和(或)x 不是整数时,用线性插值法进行计算。 - @pcx(n, x)
自由度为 n 的 χ 2 \\chi^2 χ2 分布的累积分布函数。 - @peb(a, x)
当到达负荷为 a ,服务系统有 x 个服务器且允许无穷排队时的 Erlang 繁忙概率。 - @pel(a, x)
当到达负荷为 a ,服务系统有 x 个服务器且不允许排队时的 Erlang 繁忙概率。 - @pfd(n, d, x)
自由度为 n 和 d 的 F 分布的累积分布函数。 - @pfs(a, x, c)
当负荷上限为 a,顾客数为 c,平行服务器数量为 x 时,有限源的 Poisson 服务系统的等待或返修顾客数的期望值。a 是顾客数乘以平均服务时间,再除以平均返修时间。当 c 和(或)x 不是整数时,采用线性插值进行计算。 - @phg(pop, g, n, x)
超几何(Hypergeometric)分布的累积分布函数。pop 表示产品总数,g 是正品数。从所有产品中任意取出 n (n ≤ \\le ≤ pop) 件。pop、g、n 和 x 都可以是非整数,这里采用线性插值进行计算。 - @ppl(a, x)
Poisson 分布的线性损失函数,即返回 max (0, z-x) 的期望值,其中随机变量 z 服从均值为 a 的 Poisson 分布。 - @pps(a, x)
均值为 a 的 Poisson 分布的累积分布函数。当 x 不是整数时,采用线性插值进行计算。 - @psl(x)
单位正态线性损失函数,即返回 max (0, z-x) 的期望值,其中随机变量 z 服从标准正态分布。 - @psn(x)
标准正态分布的累积分布函数。 - @ptd(n, x)
自由度为 n 的 t 分布的累积分布函数。 - @qrand(seed)
产生服从(0, 1)区间的伪随机数。@qrand 只允许在模型的数据部分使用,它将用伪随机数填满集属性。通常,声明一个 m × n m\\times n m×n 的二维表,m 表示运行实验的次数,n 表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。
例:
model: data: M = 4; N = 2; seed = 1234567; enddata sets: rows /1 .. M/; cols /1 .. N/; table(rows, cols): x; endsets data: X = @qrand(seed); enddata end
- @rand(seed)
返回 0 和 1 间的伪随机数,依赖于指定的种子 seed。典型用法是lingo U(I + 1) = @rand(U(I))
。注意:如果 seed 不变,那么产生的随机数也不变。
例:利用 @rand 产生 15 个标准正态分布的随机数和自由度为 2 的 t 分布的随机数。
model: !产生一列正态分布和 t 分布的随机数; sets: series /1 .. 15/: u, znorm, zt; endsets !第一个均匀分布随机数是任意的; u(1) = @rand(.1234); !产生其余的均匀分布的随机数; @for(series(I) | I #GT# 1: u(I) = @rand(u(I - 1))); @for( series(I): !正态分布随机数; @psn(znorm(I)) = u(I); !和自由度为 2 的 t 分布随机数; @ptd(2, zt(I)) = u(I); !znorm 和 zt 可以是负数; @free(znorm(I)); @free(zt(I)) ); end
集操作函数
LIngo 提供了几个函数帮助处理集。
- @in(set_name, primitive_index_1 [, primitive_index_2, …])
如果元素在指定集中,返回 1,否则返回 0。
例:全集为 I I I,B是 I I I的一个子集,C是B的补集。
sets: I /x1 .. x4/: x; B(I) /x2/: y; c(I) | #not# @in(B, &1): z; endsets
- @index([set_name, ] primitive_set_element)
该函数返回在集 set_name 中原始集成员 primitive_set_element 的索引。如果 set_name 被忽略,那么 Lingo 将返回与 primitive_set_element 匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。
例:如何确定集成员(B, Y)属于派生集 S3。
sets: S1 /A B C/; S2 /X Y Z/; S3 (S1, S2) /A X, A Z, B Y, C X/; endsets L = @in(S3, @index(S1, B), @index(S2, Y));
看下面的例子,表明有时为 @index 指定集是必要的。
例:
sets: girls /debble, sue, alice/; boys /bob, joe, sue, fres/; endsets I1 = @index(sue); I2 = @index(boys, sue);
- @wrap(index, limit)
该函数返回 j = index - k*limit
,其中 k 是一个整数,取适当值保证 j 落在区间 [1, limit] 内。该函数在循环、多阶段计划编制中特别有用。 - @size(set_name)
该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据独立,集大小改变时也更易维护。
以上是关于Lingo函数的主要内容,如果未能解决你的问题,请参考以下文章