Lingo学习笔记(二)——常用函数

基本数学函数

@abs(x):绝对值函数,返回x的绝对值;
@cos(x):余弦函数,返回x的余弦值(x的单位是弧度);
@exp(x):指数函数,返回 e x e^x ex的值(其中e为自然对数的底);
@floor(x):取整函数,返回x的整数部分(向最靠近0的方向取整);
@lgm(x):返回x的伽马(Gamma)函数的自然对数值(当x为整数时,lgm(x)=log(x-1);当x不为整数时,采用线性插值得到结果);
@log(x):自然对数函数,返回x的自然对数值;
@mod(x,y):模函数,返回x对y取模结果,即x除以y的余数,这里x和y应该是整数;
@pow(x,y):指数函数,返回 x y x^y xy的值。
@sign(x):符号函数,返回x的符号值(x<0时返回-1,x=0时返回0,x>0时返回+1);
@sin(x):正弦函数,返回x的正弦值(x的单位是弧度);
@smax(list):最大值函数,返回一列数(list)的最大值;
@smin(list):最小值函数,返回一列数(list)的最小值;
@sqr(x):平方函数,返回x的平方(即x*x)的值;
@sqrt(x):平方根函数,返回x的正的平方根的值;
@tan(x):正切函数,返回x的正切值(x的单位是弧度)。

集合循环函数

集合循环函数是指对集合上的元素(下标)进行循环操作的函数。一般用法如下:

@function(setname[(set_index_list)[|condition]]:expression_list);

其中:
function是集合函数名,是for,max,min,prod,sum五种之一;
setname是集合名;
set_index_list是集合索引列表(不需使用索引时可以省略);
condition是用逻辑表达式描述的过滤条件(通常含有索引,无条件时可以省略);
expression_list是一个表达式(对@for函数,可以是一组表达式);
五个集合函数名的含义如下:
@for(集合元素的循环函数):对集合setname的每个元素独立地生成表达式,表达式由expression_list描述(通常是优化问题的约束)。
@max(集合属性的最大值函数):返回集合setname上的表达式的最大值。
@min(集合属性的最小值函数):返回集合setname上的表达式的最小值。
@prod(集合属性的乘积函数):返回集合setname上的表达式的积;
@sum(集合属性的求和函数):返回集合setname上的表达式的和。

集合操作函数

集合操作函数是指对集合进行操作的函数,主要有@in,@index,@wrap,@size四种,下面分别简要介绍其一般的用法。

@index([set_name,]primitive_set_element);

这个函数给出元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号)。如果省略集合名set_name,lingo按模型中定义的集合顺序找到第一个含有元素primitive_set_element的集合,并返回索引值。如果在所有集合中都没有找到该元素,会给出错误信息。
请注意,按照上面所说的索引值的含义,集合set_name的一个索引值是一个正整数(即对集合中一个对应元素的顺序编号),且只能位于1和集合的元素个数(即@size(set_name),该函数的含义见后面)之间,超出这个范围就没有意义了。
例如:

sets:
	girls/debbie,sue,alice/;
	boys/bob,joe,sue,fred/;
endsets

可以看到女孩和男孩中都有名为sue的小孩。这是调用函数@index(sue)将返回索引值2,这相当于@index(girls,sue),因为集合girls的定义出现在集合Boys之前。如果真的要找男孩中名为sue的小孩的索引,应该使用@index(boys,sue),这时将返回索引值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),则可以利用以下语句:

X=@in(C,@index(A,2),@index(B,Y));

对本例,这里的X既是集合B的元素,后来又对X赋值1。在lingo中这是允许的,因为前者的X是集合的元素,后者X是变量,二者逻辑上没有任何关系(除了同名外),所以不会出现混淆,更谈不上后者会冲掉前者的问题。

@wrap(I,N);

当I位于区间[1,N]内时直接返回I,一般地,返回J=I-K*N,其中J位于区间[1,N],K为整数。可见这个函数类似于数学上用I对N取模,即当@mod(I,N)>1时,@wrap(I,N)=@mod(I,N),但当@mod(I,N)=0时,@wrap(I,N)=N。此函数对N<1无定义。
此函数的目的之一是可以用来防止集合的索引值越界。这是因为前面说过:任何一个集合S的索引值只能位于1和@size(S)之间,超过这个范围就没有意义了,所以用户在编写lingo程序时,应注意避免lingo模型求解时,出现集合的索引值越界的错误。

@size(set_name);

返回数据集set_name中包含元素的个数。

变量定界函数

变量定界函数对变量的取值范围附加限制,共有以下四种函数:
@bnd(L,X,U):限制L<=X<=U。
@bin(X):限制X为0或1。
@free(X):取消对X的符号限制(即可取负数,0或正数)。
@gin(X):限制X为整数。

参考文献

谢金星,薛毅. 优化建模与LINDO/LINGO软件. 北京:清华大学出版社,2018.

  • 14
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值