Почему я не получаю правильный ответ - PullRequest
0 голосов
/ 13 мая 2019

Я думаю, что логически следующий код правильный, но я получаю неправильный ответ:

.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) является самым отрицательным.

1 Ответ

2 голосов
/ 13 мая 2019

Ваш синтаксис для целевой функции неверен;это должно быть

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
;
...