簡體   English   中英

CPLEX Studio - 穩健優化

[英]CPLEX Studio - Robust Optimization

我目前正在使用 CPLEX Studio 對 VRP 進行強大的優化,目前我還沒有取得任何進展。

到目前為止,設置確定性問題沒有問題,但我未能實現不確定性。 我正在處理不確定性設置,並希望確保我的旅行計划免受所有最壞情況的影響。 有誰知道我如何確保考慮所有可能的情況? 到目前為止,我的優化確實計算了一個隨機偏差,但這只會影響一種情況,因此不會產生一個穩健的旅游計划。

詳細地說,這意味着,例如:正常情況下的運輸時間 t[1,2] = 300。 此外,還有 30 分鍾的延遲 - 但在每種情況下僅在 Γ 邊緣。

該程序的原始語言是 OPL,但如果您對 Python 或 Excel 有任何提示,我也將非常感激。

// 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 

tuple Kanten {int i ; int j;};

{Kanten} A  = {<i,j> | i in N0, j in N0}; // Kantenmenge A

execute {writeln (A);}

//{Kanten} B = {<i,j> | i in N0, j in N0}; // Kantenmenge B
//execute {writeln (B);}

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


float t[N0, N0] = ...;              // travel time matrix

{float} td ={t[i,j]  * (1+d[i,j]) | i,j in N0};                     // Depotverbindung ausblenden
    float proba[N0,N0]=...;                                         // wie i,j == j,i?

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


 // 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];

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

// 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: j!=i) 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: j!=i) 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: i!=j) {
    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) {                                          // if else Befehl für td und t?
    s[i,k] + t[i,j] + d[i,j] * u [i,j] - K * (1 - x [i,j,k]) <= s[j,k]  ;       // Wie A + B berücksichtigen? U berücksichtigen notwendig?
  };
  
  /*execute{                                        // indicator function
    for (var i in N0){
      for (var j in N0){
        for (var k in M){
      
        if (t[i][j] == td[i][j]){
          s[i,k] + t[i,j] - K * (1 - x [i,j,k]) <= s[j,k];
        }
        else {
          s[i,k] + t[i,j] + d[i,j] * u [i,j] - K * (1 - x [i,j,k]) <= s[j,k]
        }
      }
    }
  }    
};*/
  
  
  
  // (14)
  NB14: forall (i in N, k in M) {                                   // N oder N0?
    0 <= s[i,k] <= b[i];  
  };    
  //eigene Ergänzungen
  /*  // (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;
    }
    // (18)
    NB18: forall (i,j in N0, k in M){
      x[0,6,k] == 0;
    }*/
};

https://github.com/AlexFleischerParis/zooopl/blob/master/zoorobust.modEasy 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM