lingo使用说明
(2016-07-12 14:09:04)分类: 其他软件 |
interest_rate,inflation_rate = .085 ?;
enddata
years/1..5/: capacity;
endsets
data:
capacity = ,34,20,,;
enddata
Lingo运算函数
算术运算符:^ 乘方﹡ 乘/
除﹢加﹣减
逻辑运算符:
#not# 否定该操作数的逻辑值,#not#是一个一元运算符#eq# 若两个运算数相等,则为true;否则为flase
#ne# 若两个运算符不相等,则为true;否则为flase
#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase
#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase
#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase
#and# 仅当两个参数都为true时,结果为true;否则为flase
#or# 仅当两个参数都为false时,结果为false;否则为true
关系运算符:“=”、“<=”和“>=”。LINGO并不支持严格小于和严格大于关系运算符,然而,如果需要严格小于和严格大于关系,比如让A严格小于B:把它变成如下的小于等于表达式:
数学函数:
@abs(x) 返回x的绝对值
@sin(x) 返回x的正弦值,x采用弧度制
@cos(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) 返回x1,x2,…,xn中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值
金融函数:
@fpa(I,n):返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用。若每个时段支付x单位的费用,则净现值可用x乘以@fpa(I,n)算得。@fpa的计算公式为
净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用
@fpl(I,n):返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用。@fpl(I,n)的计算公式为(1+I)^(-n)
概率函数:
@pbn(p,n,x):二项分布的累积分布函数。当n和(或)x不是整数时,用线性插值法进行计算;
@pcx(n,x):自由度为n的χ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≤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表示运行实验的次数,n表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的
@rand(seed):返回0和1间的伪随机数,依赖于指定的种子。典型用法是U(I+1)=@rand(U(I))。注意如果seed不变,那么产生的随机数也不变。
变量界定函数:变量界定函数实现对变量取值范围的附加限制,共4种:
@bin(x) 限制x为0或1
@bnd(L,x,U) 限制L≤x≤U
@free(x)
取消对变量x的默认下界为0的限制,即x可以取任意实数
@gin(x) 限制x为整数
集操作函数:
@in(set_name,primitive_index_1 [,primitive_index_2,…])
如果元素在指定集中,返回1;否则返回0
sets:
I/x1..x4/;
B(I)/x2/;
C(I)|#not#@in(B,&1):;
endsets
@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 ));
@wrap(index,limit)
该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]内。该函数相当于index模limit再加1。该函数在循环、多阶段计划编制中特别有用;
@size(set_name)
该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护
集循环函数:
@for:该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束
model:
sets:
number/1..5/:x;
endsets
@for(number(I): x(I)=I^2);
end
@sum:该函数返回遍历指定的集成员的一个表达式的和
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#5:x );
end
@min和@max:返回指定的集成员的一个表达式的最小值或最大值
例4.12 求向量[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