Search code examples
optimizationlinear-programmingamplglpk

Why I do not get the right answer


I think logically the following code is right but I get the wrong answer:

.mod file:

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 file:

 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;

Basically for each r and for two p , I want to minimize (Ud[p,r] + sum{j in P: j!=p} U[j,r])

But it always give me V[1,r]=v[5,r]=1 even if V[2,r] minimize obj function.

I except to get V[2,r]=1 because -20 + (-8.1-7.2 -16-6.8) is the most negative.


Solution

  • Your syntax for the objective function is incorrect; it should be

    minimize obj: sum {p in D1, r in R} V[p,r] * (Ud[p,r]+ sum{j in P1: j != p} U[j,r]); 
    

    (Note the location of the colon (:), and the presence of the sum.) To be honest I'm not exactly sure what AMPL was doing in response to your objective function, but I would just treat the results as unpredictable.

    With the revised objective function, the optimal solution is:

    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
    ;