Lingo学习笔记(二)

您所在的位置:网站首页 常用函数名称及功能 Lingo学习笔记(二)

Lingo学习笔记(二)

2023-08-07 09:34| 来源: 网络整理| 查看: 265

常用函数 基本数学函数集合循环函数集合操作函数变量定界函数参考文献

基本数学函数

@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的符号值(x0时返回+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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3