1. 0/1规划
LINGO 提供了另一种定义稀疏集合的方法,这就是“元素过滤”法, 能够从构成派生集合的父集合的笛卡儿积中系统地过滤下来一些真正的元素。
问题:
某班 8 名同学准备分成 4 个调查队(每队两人)前往 4 个地区进行社会调查。假设这 8 名同学两两之间组队的效率如表 4-3 所示(由于对称性,只列出了上三角部分),问如何组队 可以使总效率最高?
这是一个典型的匹配(MATCHING)问题。把上面的效率矩阵记为 BENEFIT,用 MATCH (Si,Sj)=1 表示同学 Si,Sj 组成一队,而 0 表示不组队。由于对称性,只需考虑 i 小于j 共 32 个 0-1 变量。
显然,目标函数为 BENEFIT(Si,Sj)* MATCH(Si,Sj)之和;约束条件是每 个同学只能(而且必须在)某一组,即对于任意 i 有:只要 MATCH 属性的某个下标为 i 就加 起来,此和=1。显然,这是一个 0-1 线性规划。
1.1解析:
model:
sets:
students/s1..s8/;
parts(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 6
8 7 6
2 3
4;
enddata
[objective] max = @sum(parts(i, j): benefit(i ,j) * match(i, j));
@for(students(i):[constraints]
@sum(parts(j,k) | j #eq# i #or# k #eq# i: match(j,k))=1);
@for(parts(i,j): @bin(match(i,j)));
end
其中 STUDENTS 集合的元素列表“S1..S8”等价于写成“S1 S2 S3 S4 S5 S6 S7 S8”, 它没有相关的属性列表,主要用于表示下标集合。我们看到在派生集合 PAIRS 的定义中,增加了过滤条件,即逻辑关系式“&2#GT#&1”,意思是第 2 个父集合的元素的索 引值(用“&2”表示)大于第 1 个父集合的元素的索引值(用“&1”表示)。
1.2结果:
选择菜单命令“LINGO|SOLVE”运行这个程序,可以得到全局最优值=30。
Global optimal solution found.
Objective value: 32.00000
Objective bound: 32.00000
Infeasibilities: 0.000000
Extended solver steps: 0
Total solver iterations: 0
Model Class: PILP
Total variables: 28
Nonlinear variables: 0
Integer variables: 28
Total constraints: 9
Nonlinear constraints: 0
Total nonzeros: 84
Nonlinear nonzeros: 0
Variable Value Reduced Cost
BENEFI