I am trying to run a DRLP within CPLEX. My parameters are in a sperate file. As I don´t have much experience with OPL, I don´t know what I am doing wrong. In my understanding the model should give a solution but I guess, that maybe my running indexes to determine the decision variables and the relations between them are wrong. I attached the code for better understanding my problem.
int I= 6;
range Komplett=1..I;
range I1=1..(I-1);
int R=2;
range Reihen=1..R;
// Parameter
float f[i in 1..I][j in 1.. I]=...;
int d=1;
int M=50;
int N=50;;
float w[i in 1..I]=...;
float c_ij[i in 1..I][j in 1..I]=...;
float a_r[i in 1..I]= ...;
float a_l[j in 1..I]=...;
int b[i in 1..I]=...;
w=[1.5,3,3.5,2,2.5,1];
c_ij=[[0, 1.5, 1.5, 2, 1, 0.5],
[1.5, 0, 1.5, 1.5, 1, 1],
[1.5, 1.5, 0, 2, 1.5, 1],
[2, 1.5, 2, 0, 0.5, 0.5],
[1, 1, 1.5, 0.5, 0, 1.5],
[0.5, 1, 1, 0.5 ,1.5 ,0]];
f=[[0, 3.5, 6, 7, 0.5, 6.5],
[6, 0, 8, 4, 6.5, 6.5],
[6, 1, 0, 2.5, 0, 5],
[3.5, 1.5, 1.5, 0, 7.5, 6],
[4, 9, 9, 0.5, 0, 5],
[0.5, 7.5, 5.5, 2.5, 2.5, 0]];
a_r=[1,0.5,0.5,1.5,0,1.5];
a_l=[0,0,0,0,1,1.5];
b=[0,0,0,0,0,1];
// Variablen
dvar float+ x[Komplett];
dvar float+ a[ Komplett][Komplett];
dvar boolean y[Komplett][Reihen];
dvar boolean z[Komplett ][Komplett][Reihen];
dvar boolean q[Komplett][Komplett];
dvar boolean p_l[Komplett ];
dvar boolean p_r[Komplett ];
dvar int+ l[Komplett][Reihen];
dvar boolean s[Komplett ][Komplett ][Reihen ];
dvar boolean e[Komplett ][Komplett ][Reihen];
dvar float+ minVal1[Komplett][Komplett];
dvar float+ minVal2[Komplett][Komplett];
// Zielfunktion
minimize sum(i in I1, j in (i+1)..I) (f[i][j] + f[j][i]) * (abs(x[j] - x[i]) + d * (1 - q[i][j]));
// Nebenbedingungen
subject to {
c1:forall(i in Komplett)
sum(r in Reihen) y[i][r] == 1;
c2: forall(i in I1, j in (i+1)..I, r in Reihen)
(w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[j][i][r] + a[i][j] <= x[i] - x[j] + (M * (1 - z[j][i][r]));
c3:forall(i in I1, j in (i+1)..I, r in Reihen)
(w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[i][j][r] + a[i][j] <= x[j] - x[i] + M * (1 - z[i][j][r]);
//NB5
c6: forall(i in I1, j in (i+1)..I, r in Reihen)
M*(1-z[i][j][r]) + a[i][j] >=a_r[i] * p_r[i] + a_l[j] * p_l[j]-minVal1[i][j]*s[i][j][r];
// //NB6
c7: forall(i in I1, j in (i+1)..I, r in Reihen)
M*(1-z[j][i][r]) + a[i][j] >=a_r[j] * p_r[j] + a_l[i] * p_l[i]-minVal2[j][i]*s[j][i][r];
//NB7
c5: forall(i in I1, j in (i+1)..I, r in Reihen)
a[i][j] <= a_r[i] * p_r[i] + a_l[j] * p_l[j] - minVal1[i][j] * s[i][j][r] + M * (1 - z[i][j][r]);
forall(i in I1, j in (i+1)..I, r in Reihen)
{minVal1[i][j]<=a_r[i];
minVal1[i][j]<=a_l[j];
minVal1[i][j] >= a_r[i] + a_l[j] - M;}
// NB 8
c4:forall(i in I1, j in (i+1)..I, r in Reihen)
a[i][j] <= a_r[j] * p_r[j] + a_l[i] * p_l[i] - minVal2[j][i] * s[j][i][r] + M * (1 - z[j][i][r]);
forall(i in I1, j in (i+1)..I, r in Reihen)
{minVal2[j][i]<=a_r[j];
minVal2[j][i]<=a_l[i];
minVal2[j][i] >= a_r[j] + a_l[i] - M;}
c8:forall(i in I1, j in (i+1)..I)
M * q[i][j] >= a[i][j];
c9:forall(i in 1..I, r in 1..R)
sum(j in Komplett : j != i) z[j][i][r] == l[i][r];
c10:forall(i in Komplett,j in Komplett:j != j, r in Reihen )
N * (1 - z[i][j][r]) + l[j][r] - l[i][r] + e[i][j][r] >= 2;
c11:forall(i in Komplett, j in Komplett: j!=i, r in Reihen)
e[i][j][r] <= z[i][j][r];
c12:forall(r in Reihen)
sum(i in Komplett, j in Komplett: j != i) e[i][j][r] <= sum(i in Komplett) y[i][r] - 1;
c13:forall(i in Komplett, j in Komplett: j != i, r in Reihen)
s[i][j][r] <= e[i][j][r];
c14: forall(i in Komplett, j in Komplett: j != i, r in Reihen)
s[i][j][r] >= p_r[i] + p_l[j] + e[i][j][r] - 2;
c15:forall(i in Komplett)
sum(j in Komplett: j != i,r in Reihen ) s[i][j][r] <= p_r[i];
c16:forall(j in Komplett)
sum( i in Komplett: i != j,r in Reihen) s[i][j][r] <= p_l[j];
c17:forall(i in Komplett)
p_l[i]+p_r[i] >= b[i] + 1;
c18: forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
z[i][j][r] + z[j][i][r] <= y[i][r];
c19:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
z[i][j][r] + z[j][i][r] <= y[j][r];
c20:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
z[i][j][r] + z[j][i][r] + 1 >= y[i][r] + y[j][r];
c21:forall(i in Komplett, j in Komplett:j!=i)
q[i][j] == sum(r in 1..R) (z[i][j][r] + z[j][i][r]);
c22: forall(i in Komplett)
x[i] - 0.5 * w[i] - a_l[i] * p_l[i] >= 0;
}
I tried to change the running indexes but whatever I am doing, it doesn´t help.
In your model you have many times the product of a binary decision variable and an integer decision variable. You should change that into a way CPLEX could handle.
// suppose we want b * x <= 7
dvar int x in 2..10;
dvar boolean b;
dvar int bx;
maximize x;
subject to
{
// Linearization
bx<=7;
2*b<=bx;
bx<=10*b;
bx<=x-2*(1-b);
bx>=x-10*(1-b);
// if we use CP we could write directly
// b*x<=7
// or rely on logical constraints within CPLEX
// (b==1) => (bx==x);
// (b==0) => (bx==0);
}