cplexopl

no solution in OPL CPLEX for DRLP


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.


Solution

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

    See this example I wrote

    // 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);
    }