Home > Back-end >  CPLEX Studio - Robust Optimization
CPLEX Studio - Robust Optimization

Time:06-23

I'm currently working on a robust optimization of the VRP with CPLEX Studio and at the moment I'm not getting anywhere.

Setting up the deterministic problem is no problem so far, but I am failing at implementing the uncertainty. I am working with uncertainty sets and would like to secure my tour plan against all worst case scenarios. Does anyone have an idea how I can make sure that all possible scenarios are considered? So far, my optimization does calculate a random deviation, but this only affects one scenario and thus does not result in a robust tour plan.

In detail, this means, for example: Transportation time t[1,2] = 300 in the normal case. In addition, there are 30 minutes of delay - but in each scenario only at Γ edges.

The original language of the program is OPL, but if you have any hints for Python or Excel, I would be very grateful too.

CodePudding user response:

a tiny robust optimization model to start with https://github.com/AlexFleischerParis/zooopl/blob/master/zoorobust.mod in Easy optimization

int nbKids=300;

{int} nbKidsScenarii={nbKids i*10 | i in -10..2};
float proba[nbKidsScenarii]=[ 1, 1, 2, 2, 2 ,3 ,3 ,4,  5 ,10 ,50 ,10, 7];

assert sum(s in nbKidsScenarii) proba[s]==100; // total probability is 100

float costBus40=500;
float costBus30=400;

int alpha=80; // We want the constraint to be ok with probability 0.95


dvar int  nbBus40;
dvar int  nbBus30;


 
minimize
 costBus40*nbBus40   nbBus30*costBus30;
 
subject to
{
 ctKids:alpha<=sum(nbKids in nbKidsScenarii)
   (40*nbBus40 nbBus30*30>=nbKids)*proba[nbKids];
}

execute
{
writeln("nbBus40 = ",nbBus40);
writeln("nbBus30 = ",nbBus30);
}

CodePudding user response:

// parameters & sets
int n = ...; // amount of customers 

{int} N = asSet(1..n);  // set of customers

{int} N0 = {0} union N union {n 1}; // set of customer incl. depots

int m = ...; // amount of vehicles

{int} M = asSet(1..m); // set of vehicles

float Q = ...; // capacity

int r[N]= ...; // demand

int b[N]= ...;// deadline 
 
int K = 9999;   // large number
float d [N0,N0]= ...;           // max. deviation of travel time

float o [N]= ...;           // max. deviation of demand

float G = ...;  // uncertainty budget of travel time                

float L = ...;  // uncertainty budget of demand

/*execute{                                      // indicator function
    for (var i in N0){
      for (var j in N0){
      
        if (t[i][j] == td[i][j]){
          u[i][j] = 0;
        }
        else {
          u[i][j] = 1;
        }
      }
    }
};*/
 
float t[N0, N0] = ...;              // travel time matrix

int c[N0, N0] = ...;                // distance matrix

{float} td ={t[i,j]  * (1 d[i,j]) | i,j in N0};                     
    float proba[td]=...;                                            

 // optimization model
// decision variables
dvar boolean x[N0, N0, M];
dvar float  s[N0, M];
dvar float  p[N,M];
dvar float  z[M];
dvar boolean u [N0,N0];

// objective function
minimize sum(k in M) sum(i in N0) sum(j in N0) c[i,j]*x[i,j,k];


// constraints
subject to {
  // (2)
  NB2:forall (i in N) {
  sum (k in M) sum (j in N) x[i,j,k] == 1;
  };
  
  // (3) 
  NB3:forall (k in M) {
   sum (j in N0: j !=0) x[0,j,k] == 1;
  };

  // (4)
  NB4:forall (i in N, k in M) {
   sum (j in N0) x[i,j,k] - sum (j in N0: j!=i) x[j,i,k] == 0;
  };   
  
  // (5)
  NB5:forall (k in M) {
     sum (i in N0: i!=6) x[i,(n 1),k] == 1;
  };
  
   // (11)
   NB11: forall (k in M) {
    sum (i in N) r[i] * sum (j in N0) x[i,j,k]   L*z[k]   sum (i in N) p [i,k] <= Q ;
  };    
  // (12)
  NB12: forall (k in M, i,j in N) {
    z[k]   p [i,k] >= o[i] * t[i,j]  * sum (j in N0) x[i,j,k];
  };    
  // (13)
  NB13: forall (i,j in N0: i!=j, k in M) {                                          
    s[i,k]   t[i,j] * (1 d[i,j]) * u [i,j] - K * (1 - x [i,j,k]) <= s[j,k]  ;       
  };
  // (14)
  NB14: forall (i in N, k in M) {                                   
    0 <= s[i,k] <= b[i];  
  };    
    // (15)                                                                         
    NB15: forall (k in M, i in N0, j in N0: i==j) {
   x[i,j,k] == 0;  
  };
    // (16)                                                         
    NB16: forall (i in N0, k in M) {
      s[0,k] == 0;
    };
    
    // (17)
    NB17: forall (i,j in N0: i== j) {
      u[i,j] == 0;
    }
};
  • Related