常用函数
基本数学函数集合循环函数集合操作函数变量定界函数参考文献基本数学函数
@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软件. 北京:清华大学出版社,.
如果觉得《Lingo学习笔记(二)——常用函数》对你有帮助,请点赞、收藏,并留下你的观点哦!