我认为从逻辑上讲,下面的代码是正确的,但我得到了错误的答案:
.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,即使V[2,r]最小化obj函数。
我只想得到V[2,r]=1,因为-20 + (-8.1-7.2 -16-6.8)是最负面的。
发布于 2019-05-13 13:12:03
目标函数的语法不正确;它应该是
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
;https://stackoverflow.com/questions/56104279
复制相似问题