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

lingo常用字符及函数

(2013-04-19 11:13:59)
标签:

学习笔记

分类: 技术帖

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

下面给出以上三类操作符的优先级:

#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) 返回常数ex 次方

@log(x) 返回x 的自然对数

@lgm(x) 返回xgamma 函数的自然对数

@mod(x)

@sign(x) 如果x<0 返回-1;否则,返回1

@floor(x) 返回x 的整数部分。当x>=0 时,返回不超过x 的最大整数;当x<0 时,返回不低于x 的最大整数。

@smax(x1,x2,,xn) 返回x1x2,…,xn 中的最大值

@smin(x1,x2,,xn) 返回x1x2,…,xn 中的最小值

目前LINGO 提供了两个金融函数。

1@fpa(I,n)

返回如下情形的净现值:单位时段利率为I,连续n 个时段支付,每个时段支付单

位费用。若每个时段支付x 单位的费用,则净现值可用x 乘以@fpa(I,n)算得。

净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。

5.4 贷款买房问题 贷款金额50000 元,贷款年利率5.31%,采取分期付款方

式(每年年末还固定金额,直至还清)。问拟贷款10 年,每年需偿还多少元?

LINGO 代码如下:

50000 = x * @fpa(.0531,10);

答案是x=6573.069 元。

2@fpl(I,n)

返回如下情形的净现值:单位时段利率为I,第n 个时段支付单位费用。

概率函数

1@pbn(p,n,x)

二项分布的累积分布函数。当n 和(或)x 不是整数时,用线性插值法进行计算。

2@pcx(n,x)

自由度为nx2 分布的累积分布函数。

3@peb(a,x)

当到达负荷为a,服务系统有x 个服务器且允许无穷排队时的Erlang 繁忙概率。

4@pel(a,x)

当到达负荷为a,服务系统有x 个服务器且不允许排队时的Erlang 繁忙概率。

5@pfd(n,d,x)

自由度为ndF 分布的累积分布函数。

6@pfs(a,x,c)

当负荷上限为a,顾客数为c,平行服务器数量为x 时,有限源的Poisson 服务系

统的等待或返修顾客数的期望值。a 是顾客数乘以平均服务时间,再除以平均返修时间。

c 和(或)x 不是整数时,采用线性插值进行计算。

7@phg(pop,g,n,x)

超几何(Hypergeometric)分布的累积分布函数。pop 表示产品总数,g 是正品数。

从所有产品中任意取出nnpop)件。popgnx 都可以是非整数,这时采用线

性插值进行计算。

8@ppl(a,x)

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

均值为aPoisson 分布。

9@pps(a,x)

均值为aPoisson 分布的累积分布函数。当x 不是整数时,采用线性插值进行计

算。

10@psl(x)

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

正态分布。

11@psn(x)

标准正态分布的累积分布函数。

12@ptd(n,x)

自由度为nt 分布的累积分布函数。

13@qrand(seed)

产生服从(0,1)区间的拟随机数。@qrand 只允许在模型的数据部分使用,它将用拟

随机数填满集属性。通常,声明一个m×n 的二维表,m 表示运行实验的次数,n 表示每

次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均

匀的。这些随机数是用“分层取样”的方法产生的。

如果没有为函数指定种子,那么LINGO 将用系统时间构造种子。

14@rand(seed)

返回01 间的伪随机数,依赖于指定的种子。典型用法是U(I+1)=@rand(U(I))

注意如果seed 不变,那么产生的随机数也不变。

5.6 利用@rand 产生15 个标准正态分布的随机数和自由度为2t 分布的随机

数。

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

变量界定函数实现对变量取值范围的附加限制,共4 种:

@bin(x) 限制x01

@bnd(L,x,U) 限制LxU

@free(x) 取消对变量x 的默认下界为0 的限制,即x 可以取任意实数

@gin(x) 限制x 为整数

在默认情况下,LINGO 规定变量是非负的,也就是说下界为0,上界为+∞。@free

取消了默认的下界为0 的限制,使变量也可以取负值。@bnd 用于设定一个变量的上下

,它也可以取消默认下界为0 的约束。

LINGO 提供了几个函数帮助处理集。

1@in(set_name,primitive_index_1 [,primitive_index_2,])

如果元素在指定集中,返回1;否则返回0

5.7 全集为IBI 的一个子集,CB 的补集。

sets:

I/x1..x4/;

B(I)/x2/;

C(I)|#not#@in(B,&1):;

Endsets

2@index([set_name,] primitive_set_element)

该函数返回在集set_name 中原始集成员primitive_set_element 的索引。如果

set_name 被忽略,那么LINGO 将返回与primitive_set_element 匹配的第一个原始集

成员的索引。如果找不到,则产生一个错误。

5.8 如何确定集成员(B,Y)属于派生集S3

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));

看下面的例子,表明有时为@index 指定集是必要的。

5.9

sets:

girls/debble,sue,alice/;

boys/bob,joe,sue,fred/;

endsets

I1=@index(sue);

I2=@index(boys,sue);

I1 的值是2I2 的值是3。我们建议在使用@index 函数时最好指定集。

3@wrap(index,limit)

该函数返回j=index-k*limit,其中k 是一个整数,取适当值保证j 落在区间[1

limit]内。该函数在循环、多阶段计划编制中特别有用。

4@size(set_name)

该函数返回集set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。

它的使用使模型更加数据中立,集大小改变时也更易维护。

集循环函数

1@for

该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不

@for 函数允许只输入一个约束,然后LINGO 自动产生每个集成员的约束。

5.10 产生序列{1,4,9,16,25}

model:

sets:

number/1..5/:x;

endsets

@for(number(I): x(I)=I^2);

end

2@sum

该函数返回遍历指定的集成员的一个表达式的和。

5.11 求向量[5134610]5 个数的和。

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 #le# 5: x);

end

3@min@max

返回指定的集成员的一个表达式的最小值或最大值。

5.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

5.13 职员时序安排模型 一项工作一周7 天都需要有人(比如护士工作),每

天(周一至周日)所需的最少职员数为20161316191412,并要求每个职

员一周连续工作5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定

后的情况。

model:

sets:

days/mon..sun/: required,start;

endsets

data:

!每天所需的最少职员数;

required = 20 16 13 16 19 14 12;

enddata

!最小化每周所需职员数;

min=@sum(days: start);

@for(days(J):@sum(days(I) | I #le# 5:

start(@wrap(J+I-5,7))) >= required(J));

end

计算的部分结果为

Global optimal solution found at iteration: 0

Objective value: 22.00000

Variable Value Reduced Cost

REQUIRED( MON) 20.00000 0.000000

REQUIRED( TUE) 16.00000 0.000000

REQUIRED( WED) 13.00000 0.000000

REQUIRED( THU) 16.00000 0.000000

REQUIRED( FRI) 19.00000 0.000000

REQUIRED( SAT) 14.00000 0.000000

REQUIRED( SUN) 12.00000 0.000000

START( MON) 8.000000 0.000000

START( TUE) 2.000000 0.000000

START( WED) 0.000000 0.3333333

START( THU) 6.000000 0.000000

START( FRI) 3.000000 0.000000

START( SAT) 3.000000 0.000000

START( SUN) 0.000000 0.000000

从而解决方案是:每周最少需要22 个职员,周一安排8 人,周二安排2 人,周三无需

安排人,周四安排6 人,周五和周六都安排3 人,周日无需安排人。

输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起

来。

1@file 函数

该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为

@file(filename)。这里filename 是文件名,可以采用相对路径和绝对路径两种表

示方式。@file 函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样

的,这一点必须注意。

2@text 函数

该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性

值。其语法为

@text([filename])

这里filename 是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略

filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕)。@text 函数仅

能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)

或集属性名(用来输出该集属性的值)。

3@ole 函数

@OLE 是从EXCEL 中引入或输出数据的接口函数,它是基于传输的OLE 技术。OLE

传输直接在内存中传输数据,并不借助于中间文件。当使用@OLE 时,LINGO 先装载EXCEL

再通知EXCEL 装载指定的电子数据表,最后从电子数据表中获得Ranges。为了使用OLE

函数,必须有EXCEL5 及其以上版本。OLE 函数可在数据部分和初始部分引入数据。

4@status()

返回LINGO 求解模型结束后的状态:

0 Global Optimum(全局最优)

1 Infeasible(不可行)

2 Unbounded(无界)

3 Undetermined(不确定)

4 Feasible(可行)

5 Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,

以确定模型究竟是不可行还是无界)

6 Local Optimum(局部最优)

7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO 并没有

找到一个)

8 Cutoff(目标函数的截断值被达到)

9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)

通常,如果返回值不是046 时,那么解将不可信,几乎不能用。该函数仅被

用在模型的数据部分来输出数据。

5.9 辅助函数

1@if(logical_condition,true_result,false_result)

@if 函数将评价一个逻辑表达式logical_condition,如果为真,返回true_

result,否则返回false_result

2@warn(text,logical_condition)

如果逻辑条件logical_condition 为真,则产生一个内容为’text’的信息框。

1LINGO 信息

Cat 显示所有命令类型

Com 按类型显示所用LINGO 命令

Help 显示所需命令的简要帮助信息

Mem 显示内存变量的信息

2. 输入(Input)

model 以命令行方式输入一个模型

take 执行一个文件的命令正本或从磁盘中读取某个模型文件

3. 显示(Display)

look 显示当前模型的内容

genl 产生LINGO 兼容的模型

gen 生成并显示整个模型

hide 为模型设置密码保护

pause 暂停屏幕输出直至再次使用此命令

4. 文件输出(File Ouput)

div 将模型结果输出到文件

svrt 将模型结果输出到屏幕

save 将当前模型保存到文件

smps 将当前模型保存为MPS 文件

5. 求解模型(Solution)

go 求解当前模型

solu 显示当前模型的求解结果

6. 编辑模型(Problem Editing)

del 从当前模型中删除指定的某一行或某两行之间(包括这两行)的所有行

ext 在当前模型中添加几行

alt 用新字符串替换掉某一行中、或某两行之间的所有行中的旧字符串

7. 退出系统(Quit)

quit 退出LINGO 系统

8. 系统参数(System Parameters)

page 以“行”为单位设置每页长度

ter 以简略方式输出结果

ver 以详细方式输出结果

wid 以“字符”为单位设置显示和输出宽度

set 重新设置默认参数

freeze 保存当前参数设置,以备下一次重新启动LINGO 系统时还是这样的设置

time 显示本次系统的运行时间

0

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

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

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

新浪公司 版权所有