加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

lingo使用说明

(2016-07-12 14:09:04)
分类: 其他软件

 一、Lingo模型结构:

lingo优化模型主要由五个组成部分:集合定义部分、目标函数与约束部分、数据输入部门、初值设定部分、计算部分。
1、集合定义部分:
set:
    <集合名>/<集合中元素列表>/:数组1,数组2,...,数组N;
endsets
例子:
set:
    /1,2,3,4/:X,Y,W,K;
endsets 
 
在一个模型中,原始集是基本的对象,不能再被拆分成更小的组分。原始集可以由显式罗列和隐式罗列两种方式来定义。当用显式罗列方式时,需在集成员列表中逐个输入每个成员。当用隐式罗列方式时,只需在集成员列表中输入首成员和末成员,而中间的成员由LINGO产生。
派生集合:
sets:
    j1/1,2/;
    j2/1..3/;
    j3(j1,j2):c;
endsets
其中J3为二维元素,第一元来自J1,第二元来自J2,它们成为基本集合,而J3成为派生集合,且定义了属性(二维数组),其定义格式为:
<集合名>(<基本集合1>,....<基本集合N>):属性1,属性2,...,属性N;
在数据输入部分中使用的格式为:
<属性变量名>=数组元素1第一元,...,数据元素1第M元,
                         .......,
                         .......,
                         数据元素N第一元,...,数据元素N第M元,;
稠密集合:像J3这样以基本集合的笛卡尔积作为元素的派生集合的称为稠密集合;
稀疏集合:派生集合也可以只是基本集合笛卡尔积的一个真子集,这样的派生集合称为稀疏集合;定义稀疏集合可以采用枚举的方法。
如果数据量大,稀疏集合定义是可以采用过滤条件
sets:
    j1/1..3/;
   j2/1..4/;
   J3(j1,j2)|&2#gt#&1:c;
endsets
其中&2表示第2个基本集合元素的索引值,同样&1表示第一个基本集合元素的索引值。

2、目标和约束部分:
输入模型的目标函数和约束条件
例子:
min=@sum(jihe:400*X+450*Y+20*W);
@for(jihe(i):x(i)<40);
@for(jihe(i)|i#GT#1:W(i)=W(i-1)+X(i)+Y(i)-K(i));
W(1)=10+X(1)+Y(1)-K(1)

3、数据输入部分:
对变量或集合的属性输入常数值,在数据部分也可以指定一些标量变量(scalar variables)。当一个标量变量在数据部分确定时,称之为参数。
DATA:
       <属性名>=常数1,常数2,...,常数N;
ENDDATA
例子:
data:
    K=40,60,75,25;
enddata
 
实时数据处理
在某些情况,对于模型中的某些数据并不是定值。譬如模型中有一个通货膨胀率的参数,我们想在2%至6%范围内,对不同的值求解模型,来观察模型的结果对通货膨胀的依赖有多么敏感。我们把这种情况称为实时数据处理(what if analysis)。LINGO有一个特征可方便地做到这件事。
data:
interest_rate,inflation_rate = .085 ?;
enddata
 
数据部分的未知数值
有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以便让LINGO去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格。
sets:
years/1..5/: capacity;

endsets
data:
capacity = ,34,20,,;
enddata

 

4、初值设定部分:
对集合的属性定义初始值,对于数值计算来说,往往使用迭代算法,因此如果能给出一个比较好的初始值可以提高计算的速度和准确度
INIT:
   <属性名>=常数1,常数2,...,常数N;
ENDINIT
 
一个初始部分以“init:”开始,以“endinit”结束。初始部分的初始声明规则和数据部分的数据声明规则相同。也就是说,我们可以在声明的左边同时初始化多个集属性,可以把集属性初始化为一个值,可以用问号实现实时数据处理,还可以用逗号指定未知数值。

5、计算部分:
在开始正式计算之前对原始数据进行预处理,因为输入的一些原始数据在计算中不一定能够直接使用,因此这部分的格式为
CALC:
     语句1;
     语句2;
     ....;
ENDCALC
 

Lingo运算函数

算术运算符:^ 乘方﹡ 乘/ 除﹢加﹣减     LINGO唯一的一元算术运算符是取反函数“﹣”

 

逻辑运算符:

#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
 
 

关系运算符:“=”、“<=”和“>=”。LINGO并不支持严格小于和严格大于关系运算符,然而,如果需要严格小于和严格大于关系,比如让A严格小于B:把它变成如下的小于等于表达式:
   A+ε<=B,这里ε是一个小的正数,它的值依赖于模型中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):自由度为ndF分布的累积分布函数;

@pfs(a,x,c):当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。当c和(或)x不是整数时,采用线性插值进行计算

@phg(pop,g,n,x):超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出nnpop)件。popgnx都可以是非整数,这时采用线性插值进行计算。

@ppl(a,x):Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为aPoisson分布

@pps(a,x):均值为aPoisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算;

@psl(x):单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布;

@psn(x):标准正态分布的累积分布函数;

@ptd(n,x):自由度为nt分布的累积分布函数;

@qrand(seed):产生服从(0,1)区间的拟随机数。@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。通常,声明一个m×n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的

@rand(seed):返回01间的伪随机数,依赖于指定的种子。典型用法是U(I+1)=@rand(U(I))。注意如果seed不变,那么产生的随机数也不变。

变量界定函数:变量界定函数实现对变量取值范围的附加限制,共4种:
@bin(x)
限制x01
@bnd(L,x,U)
限制LxU
@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落在区间[1limit]内。该函数相当于indexlimit再加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 求向量[5134610]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

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有