2017-05-05 2 views
0

J'ai rencontré un problème lors de l'utilisation de addMIPStart(). Dans un premier temps, à des fins de test, j'ai pris un problème d'assignation généralisée (j'ai seulement un ensemble de variables de décision binaires x [i] [] j) et j'ajoute une borne en utilisant addMIPStart(). Cela a fonctionné parfaitement.Erreur lors de l'utilisation de addMIPStart() dans CPLEX C++

Mais, quand je tentais même sur mon propre problème, je me suis un problème d'erreur CPLEX: « IloExtractable 189 IloNumVarl n'a pas été extraite par Iloalgorithm 000001ECF89B160 ».

Dans mon problème, il existe quatre types de variables:

x[k][p][t] = IloNumVar(env, 0.0, 1, ILOINT, name.str().c_str()); //binary 
y[p][t] = IloNumVar(env, 0.0, 1, ILOINT, name.str().c_str()); //binary 
z[k][p][t] = IloNumVar(env, 0.0, 1, ILOINT, name.str().c_str()); //binary 
w[p][t] = IloNumVar(env, 0.0, IloInfinity, ILOINT, name.str().c_str()); //pure integer 

Maintenant, j'ai ajouté le morceau de code suivant .................. ....

/*************************************************/ 
    IloNumVarArray startVar(env); 
    IloNumArray startVal(env); 
    IloNum remExtResource = 0; 
    IloInt cutOffTime = 0; 
    IloInt totExtResource = 0; 

    for (k = 0; k < K; k++) { 
     for (p = 0; p<P; p++) { 
      for (t = 0; t<T + 2; t++) { 
       startVar.add(x[k][p][t]); 
       startVal.add(0); 
      } 
     } 
    } 
    for (k = 0; k < K; k++) { 
     for (p = 0; p<P2; p++) { 
      for (t = 0; t<T + 1; t++) { 
       startVar.add(z[k][p][t]); 
       startVal.add(0); 
      } 
     } 
    } 
    for (p = 0; p<P2; p++) { 
     totExtResource = ceil(D[p]/a_e[p]); 
     cutOffTime = ceil(totExtResource/Q[p]); 
     for (t_p = 0; t_p<T + 2; t_p++) { 
      if (t <= cutOffTime){ 
       startVar.add(y[p][t]); 
       startVal.add(0); 
      } 
      if (t > cutOffTime){ 
       startVar.add(y[p][t]); 
       startVal.add(1); 
      } 
     } 
     totExtResource = 0; 
     cutOffTime = 0; 
    } 
    for (p = 0; p<P2; p++) { 
     remExtResource = ceil(D[p]/a_e[p]); 
     for (t = 0; t<T + 1; t++) { 
      if (t == 0) { 
       startVar.add(w[p][t]); 
       startVal.add(0); 
      } 
      else { 
       if (remExtResource == 0) { 
        startVar.add(w[p][t]); 
        startVal.add(0); 
       } 
       else if ((remExtResource > 0) && (remExtResource <= Q[p])) { 
        startVar.add(w[p][t]); 
        startVal.add(remExtResource); 
        remExtResource = 0; 
       } 
       else { 
        startVar.add(w[p][t]); 
        startVal.add(Q[p]); 
        remExtResource = remExtResource - Q[p]; 
       } 
      } 
     } 
     remExtResource = 0; 
    } 
    // cplex.addMIPStart(startVar, startVal, IloCplex::MIPStartAuto, "secondMIPStart"); 
    cplex.addMIPStart(startVar, startVal); 
    startVal.end(); 
    startVar.end(); 
/*************************************************/ 

en tant que solution de départ, je fais toutes les variables x et variables z à . Et sur la base de la logique des variables y sont et certains sont , alors que certains w-les variables sont affectés à pleine capacité Q [p], tandis que d'autres sont .

J'ai la même logique que celle que j'ai suivie mais j'ai pu trouver ce que j'ai manqué ici. Pourrais-tu m'aider s'il te plaît?

Répondre

0

Le plus souvent, lorsque j'ai vu ce genre d'erreur, c'est parce que j'essaie d'ajouter une valeur mipstart pour une variable qui n'est pas dans mon problème. Par exemple, les variables sont déclarées mais ne sont impliquées dans aucune contrainte ou dans l'objectif, donc cplex ne les a pas dans son modèle extrait.