Lingo_知识补充
1.集成员不放在集定义中,而在随后的数据部分来定义。
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.语法定义一个派生集:
setname(parent_set_list)[/member_list/][:attribute_list];
setname是集的名字。parent_set_list是已定义的集的列表,多个时必须用逗号隔开。如果没有指定成员列表,那么LINGO会自动创建父集成员的所有组合作为派生集的成员。派生集的父集既可以是原始集,也可以是其它的派生集。
sets:
product/A B/;
machine/M N/;
week/1..2/;
allowed(product,machine,week):x;
endsets
成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。
如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集。
同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列表有两种方式生成:①显式罗列;②设置成员资格过滤器。
当采用方式①时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子,显式罗列派生集的成员:
allowed(product,machine,week)/A M 1,A N 2,B N 1/;
如果需要生成一个大的、稀疏的集,可以把这些逻辑条件看作过滤器,把使逻辑条件为假的成员从稠密集中过滤掉。用竖线(|)来标记一个成员资格过滤器的开始。
sets:
students/John,Jill,Rose,Mike/:sex,age;
! sex(&1)第一个元素的sex属性,sex(&2)第二个元素的sex属性;
linkmf(students,students)|sex(&1) #eq# 1 #and# sex(&2) #eq# 0: friend;
!男学生和女学生的友好程度大于0.5的集;
linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : goodfriend;
endsets
data:
sex,age =
1 16
0 14
0 17
0 13;
friend = 0.3 0.5 0.6;
enddata
3.实时数据处理
在某些情况,模型中的某些数据并不是定值,我们把这种情况称为实时数据处理。LINGO可以通过在本该放数的地方输入一个问号(?)。
data:
X,Y = .085 ?;
enddata
每一次求解模型时,LINGO都会提示为参数Y输入一个值。在WINDOWS操作系统下,将会接收到一个对话框,直接输入一个值再点击OK按钮,LINGO就会把输入的值指定给Y,然后继续求解模型。
除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。
4.指定属性为一个值
可以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值。
sets:
days /MO,TU,WE,TH,FR,SA,SU/:needs;
endsets
data:
needs = 20;
enddata
LINGO将用20指定days集的所有成员的needs属性。
sets:
days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;
endsets
data:
needs cost = 20 100;
enddata
5.数据部分的未知数值
有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以便让LINGO去求出它们的最优值。
在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格。
sets:
years/1..5/: capacity;
endsets
data:
capacity = ,34,20,,;
enddata
属性capacity的第2个和第3个值分别为34和20,其余的未知。
模型的初始部分
在初始部分输入的值仅被LINGO求解器当作初始点来用,并且仅仅对非线性模型有用。
一个初始部分以“init:”开始,以“endinit”结束。
init:
X, Y = 0, .1;
endinit
Y=@log(X);
X^2+Y^2<=1;