我在逻辑上认为以下代码是正确的,但是我得到了错误的答案:
.mod文件:
set R := {1,2};
set D1 := {1,2,4,5};
set P1 := {1,2,3,4,5};
var V{D1,R}, binary;
param Ud{D1,R} ;
param U{P1,R} ;
minimize obj{p in D1, r in R}: V[p,r] * (Ud[p,r]+ sum{j in P1: j!=p} U[j,r]);
s.t. a10{ r in R }: sum{p in D1} V[p,r]=2 ;
.dat文件:
param Ud: 1 2:=
1 -10 -6
2 -20 -4
4 1 -10
5 -4 -4;
param U: 1 2 :=
1 -8.1 -3
2 -6.8 -8
3 -7.2 1
4 -16 -4
5 -6.8 -4;
基本上对于每个r和两个p,我想最小化(Ud[p,r] + sum{j in P: j!=p} U[j,r])
但是即使V[1,r]=v[5,r]=1
最小化obj函数,它也总是给我V[2,r]
。
我除了得到V[2,r]=1
是因为-20 + (-8.1-7.2 -16-6.8)
是最负面的。
答案 0 :(得分:2)
您的目标函数语法不正确;应该是
minimize obj: sum {p in D1, r in R} V[p,r] * (Ud[p,r]+ sum{j in P1: j != p} U[j,r]);
(请注意冒号(:
的位置,以及sum
的存在。)说实话,我不确定AMPL针对您的目标函数在做什么,但我只是将结果视为不可预测。
通过修改后的目标函数,最佳解决方案是:
ampl: display V;
V :=
1 1 1
1 2 1
2 1 1
2 2 0
4 1 0
4 2 1
5 1 0
5 2 0
;