当前位置:首页 > lingo8.0完美教程
列表如下:
隐式成员列表格式示例所产生集成员 1..n 1..5 1,2,3,4,5
StringM..StringN Car2..car14 Car2,Car3,Car4,?,Car14 DayM..DayN Mon..Fri Mon,Tue,Wed,Thu,Fri
5
③集成员不放在集定义中,而在随后的数据部分来定义。 例2.2 !集部分; sets:
students:sex,age;!注意无成员定义,仅由集的名称和成员的属性; endsets !数据部分; data:
students,sex,age= John 1 16 Jill 0 14 Rose 0 17 Mike 1 13; enddata
注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行。
在集部分只定义了一个集students,并未指定成员。在数据部分罗列了集成员John、 Jill、Rose 和Mike,并对属性sex 和age 分别给出了值。 2.2.2 定义派生集
为了定义一个派生集,必须详细声明:
[1]集的名字[2]父集的名字[3]集的成员(可选)[4]集成员的属性(可选) 可用下面的语法定义一个派生集:
setname(parent_set_list)[/member_list/][:attribute_list];
setname 是集的名字。parent_set_list 是已定义的集的列表,多个时必须用逗号隔开。 如果没有指定成员列表,那么LINGO 会自动创建父集成员的所有组合作为派生集的成员,相 当于由父集形成的完全集。派生集的父集既可以是原始集,也可以是其它的派生集。 例2.3 sets:
product/A B/; machine/M N/;
week/1..2/;!此三个集合均没有定义属性; allowed(product,machine,week):x; endsets
LINGO 生成了三个父集的所有组合共八组作为allowed 集的成员。列表如下: 编号成员 1 (A,M,1) 2 2 (A,M,2) 3 3 (A,N,1) 4 4 (A,N,2) 5 5 (B,M,1)
6 6 (B,M,2)
7 7 (B,N,1) 8 8 (B,N,2)
成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。 如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集 成为稀疏集。同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列 表有两种方式生成:①显式罗列;②设置成员资格过滤器。当采用方式①时,必须显式罗列 出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子, 显式罗列派生集的成员:
allowed(product,machine,week)/A M 1,A N 2,B N 1/;
如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌。幸运地是许多稀疏集的成员都 满足一些条件以和非成员相区分。我们可以把这些逻辑条件看作过滤器,在LINGO 生成派生 集的成员时把使逻辑条件为假的成员从稠密集中过滤掉。 例2.4 sets:
6
!学生集:性别属性sex,1 表示男性,0 表示女性;年龄属性age. ; students/John,Jill,Rose,Mike/:sex,age;
!男学生和女学生的联系集:友好程度属性friend,[0,1]之间的数。;
linkmf(students,students)|sex(&1) #eq# 1 #and# sex(&2) #eq# 0: friend;
!男学生和女学生的友好程度大于0.5 的集;
linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x; endsets data:
sex,age = 1 16 0 14
0 17 0 13;
friend = 0.3 0.5 0.6;
enddata
用竖线(|)来标记一个成员资格过滤器的开始。#eq#是逻辑运算符,用来判断是否“相 等”,可参考§4. &1 可看作派生集的第1 个原始父集的索引,它取遍该原始父集的所有成 员;&2 可看作派生集的第2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,??, 以此类推。注意如果派生集B 的父集是另外的派生集A,那么上面所说的原始父集是集A 向 前回溯到最终的原始集,其顺序保持不变,并且派生集A 的过滤器对派生集B 仍然有效。因 此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作 限制的总和。
§3 模型的数据部分
在处理模型的数据时,需要为集指派一些成员并且在LINGO 求解模型之前为集的某些属 性指定值(如例1.2 程序中的第6-15 行)。
3.1 数据部分入门
数据部分提供了模型相对静止部分和数据分离的可能性。显然,这对模型的维护和维数 的缩放非常便利。
数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定集成 员、集的属性。其语法如下: object_list = value_list;
对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格 隔开。一个对象列中至多有一个集名,而属性名可以有任意多。如果对象列中有多个属性名, 那么它们的类型必须一致。如果对象列中有一个集名,那么对象列中所有的属性的类型就是 这个集。
数值列(value_list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注意属 性值的个数必须等于集成员的个数。看下面的例子。 例3.1 sets:
set1/A,B,C/: X,Y; endsets data: X=1,2,3; Y=4,5,6;
enddata
在集set1 中定义了两个属性X 和Y。X 的三个值是1、2 和3,Y 的三个值是4、5 和6。 也可采用如下例子中的复合数据声明(data statement)实现同样的功能。 例3.2 sets:
set1/A,B,C/: X,Y; endsets data: X,Y=1 4 2 5 3 6;
7
enddata
看到这个例子,可能会认为X 被指定了1、4 和2 三个值,因为它们是数值列中前三个, 而正确的答案是1、2 和3。假设对象列有n 个对象,LINGO 在为对象指定值时,首先在n 个对象的第1 个索引处依次分配数值列中的前n 个对象,然后在n 个对象的第2 个索引处依 次分配数值列中紧接着的n 个对象,??,以此类推。
模型的所有数据——属性值和集成员——被单独放在数据部分,这可能是最规范的数据 输入方式。 3.2 参数
在数据部分也可以指定一些标量变量(scalar variables)。当一个标量变量在数据部 分确定时,称之为参数。假设模型中用利率8.5%作为一个参数,就可以象下面一样输入一 个利率作为参数。 例3.3 data:
interest_rate = .085; enddata
也可以同时指定多个参数。
例3.4
data:
interest_rate,inflation_rate = .085 .03; enddata
3.3 实时数据处理
在某些情况,对于模型中的某些数据并不是定值。譬如模型中有一个通货膨胀率的参数, 我们想在2%至6%范围内,对不同的值求解模型,来观察模型的结果对通货膨胀的依赖有多 么敏感。我们把这种情况称为实时数据处理(what if analysis)。LINGO 有一个特征可方 便地做到这件事。
在本该放数的地方输入一个问号(?)。 例3.5 data:
interest_rate,inflation_rate = .085 ?; enddata
每一次求解模型时,LINGO 都会提示为参数inflation_rate 输入一个值。在WINDOWS 操作 系统下,将会接收到一个类似下面的对话框:
直接输入一个值再点击OK 按钮,LINGO 就会把输入的值指定给inflation_rate,然后继续 求解模型。
除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。
3.4 数据部分的未知数值
有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以 便让LINGO 去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成 员的属性值未知。两个逗号间可以有空格。 例3.8 sets:
years/1..5/: capacity; endsets
8
data:
capacity = ,34,20,,;
enddata
属性capacity 的第2 个和第3 个值分别为34 和20,其余的未知。
§4 LINGO 函数
在编写程序的时候,可能会碰到某些函数,在这对这些函数我们仅简单的介绍一下,以 便查询。
LINGO 有9 种类型的函数:
1.基本运算符:包括算术运算符、逻辑运算符和关系运算符 2.数学函数:三角函数和常规的数学函数 3.金融函数:LINGO 提供的两种金融函数
4.概率函数:LINGO 提供了大量概率相关的函数
5.变量界定函数:这类函数用来定义变量的取值范围
6.集操作函数:这类函数为对集的操作提供帮助
7.集循环函数:遍历集的元素,执行一定的操作的函数
8.数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入输出
共分享92篇相关文档