匹配问题的1stOpt与Lingo解法[转贴]
Lingo是国际上大名鼎鼎的优化软件。下面以一实例对比两者的实现过程。问题:
8个专家,4个办公室,需将专家分成4组,每组两人使用一间办公室。专家们的相处融洽度如下表,不相容等级从1到10。1表示两专家相处很好、10最差,如何安排专家使专家匹配不相容等级的总和最小?
1 2 3 4 5 6 7 8
1 0 9 3 4 2 1 5 6
2 9 0 1 7 3 5 2 1
3 3 1 0 4 4 2 9 2
4 4 7 4 0 1 5 5 2
5 2 3 4 1 0 8 7 6
6 1 5 2 5 8 0 2 3
7 5 2 9 5 7 2 0 4
8 6 1 2 2 6 3 4 0
1stOpt:目标是求出x1至x8的值,使得组合(x1,x2),(x3,x4),(x5,x6),(x7,x8)不相容等级的总和最小。
代码:
*********************************
Constant Rating(1:8,1:8)=
[0,9,3,4,2,1,5,6,
9,0,1,7,3,5,2,1,
3,1,0,4,4,2,9,2,
4,7,4,0,1,5,5,2,
2,3,4,1,0,8,7,6,
1,5,2,5,8,0,2,3,
5,2,9,5,7,2,0,4,
6,1,2,2,6,3,4,0];
Parameter x(1:8)=;
Exclusive = True;
Minimum;
StartProgram ;
Procedure MainModel;
var i: integer;
temD: double;
Begin
temD := 0;
for i := 1 to 4 do
temD := temD + Rating,x];
FunctionResult := temD;
End;
EndProgram;
*************************
运行结果:
x1: 5
x2: 4
x3: 7
x4: 2
x5: 1
x6: 6
x7: 8
x8: 3
即(5,4),(7,2),(1,6)和(8,3)匹配成组。
Lingo:
代码:
**********************
Data:
Rating=
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
Min = @Sum(Paris(i,j): Rating(i,j)*Match(i,j));
@For(Experts(i):
@Sum(Paris(j,k) | J # EQ # I # OR # K # EQ #I:
Match(j,k))=1);
@For(Paris(i,j): @Bin(Match(i,j)));
******************************
运行可得到相同的结果。
个人看法:Lingo的语法不是太直观,不大好明白;1stOpt的编程模式是其亮点,能解决很多工程上复杂的优化问题。
来自:simwe--shamohu
页:
[1]