2.3 模型的集部分

集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。

2.3.1 定义原始集

为了定义一个原始集,必须详细声明:

·集的名字

·可选,集的成员

·可选,集成员的属性

定义一个原始集,用下面的语法:

setname[/member_list/][:attribute_list];

注意:用“[]”表示该部分内容可选。下同,不再赘述。

Setname是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。

注意:该命名规则同样适用于集成员名和属性名等的命名。

Member_list是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。

① 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。

例2.1 可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age:

sets:

students/John Jill, Rose Mike/: sex, age;

endsets

② 当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:

setname/member1..memberN/[: attribute_list];

这里的member1是集的第一个成员名,memberN是集的最末一个成员名。LINGO将自动产生中间的所有成员名。LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。列表如下:

隐式成员列表格式

示例

所产生集成员

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

MonthM..MonthN

Oct..Jan

Oct,Nov,Dec,Jan

MonthYearM..MonthYearN

Oct2001..Jan2002

Oct2001,Nov2001,Dec2001,Jan2002

③ 集成员不放在集定义中,而在随后的数据部分来定义。

例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分别给出了值。

集成员无论用何种字符标记,它的索引都是从1开始连续计数。在attribute_ list可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。

可以把集、集成员和集属性同C语言中的结构体作个类比。如下图:

集 ←→ 结构体

集成员 ←→ 结构体的域

集属性 ←→ 结构体实例

LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LINGO求解器求解。因此,集属性的值一旦在模型中被确定,就不可能再更改。在LINGO中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的。