lingo集合的三种最常用经典用法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
lingo集合的三种最常用经典用法
热度11已有392 次阅读2010-8-10 12:24 |个人分类:lingo小经验|
!集合的使用初步,eg供求问题;
MODEL:
SETS:
QUARTERS/1,2,3,4/:DEM,RP,OP,INV;
ENDSETS
MIN=@SUM(QUARTERS:400*RP+450*OP+20*INV);
@FOR(QUARTERS(I):RP(I)<40);
@FOR(QUARTERS(I)|I#GT#1:
INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););
INV(1)=10+RP(1)+OP(1)-DEM(1);
DATA:
DEM=40,60,75,25;
ENDDATA
END
!稀疏集合的使用方法, 经典最短路问题,;
model:
sets:
cities/S,A1,A2,A3,B1,B2,C1,C2,T/:L; !cities到城市s的距离,索引使用时自动把S,A1..编成了1,2..;
roads(cities,cities)/
S,A1 S,A2 S,A3
A1,B1 A1,B2 A2,B1 A2,B2, A3,B1 A3,B2
B1,C1 B1,C2 B2,C1 B2,C2
C1,T C2,T/:D;
endsets
data:
D= 6 3 3
6 5 8 6
7 4
6 7 8 9
5 6; !数据段集合的赋值,必须对应集合所有属性,形成一一照应,否则就不要再数据段赋值,在求解段付部分集合的值
也是可以的。;
enddata
L(1)=0; !这里的索引不能用L(S)=0,只能用L(1)=0,或者用L(index(s))=0 ;
@for(cities(i)|i#gt#1:
L(i)=@min(roads(j,i):L(j)+D(j,i));
);
end
!稀疏集合的一种好的方法,元素过滤法,体会对索引的操作,以及相应的复制方式,最有配对eg;
model:
sets:
students/s1..s8/;
pairs(students,students)|&2#gt#&1:
benefit,match;
endsets
data:
benefit=
9 3 4 2 1 5 6
1 7 3 5
2 1
4 4 2 9 2
1 5 5 2
8 7 6
2 3
4;
enddata
max=@sum( pairs(i,j):benefit(i,j)*match(i,j) );
@for(students(i):
@sum(pairs(j,k)|(j#eq#i)#or#(k#eq#i):match(j,k))=1);
@for(pairs(i,j):@bin(match(i,j)));
end