2017-05-05 128 views
0

使用addMIPStart()时遇到问题。首先,为了测试目的,我采用了广义指派问题(只有一组二进制决策变量x [i] [] j),并使用addMIPStart()添加一个边界。它工作完美。在CPLEX C++中使用addMIPStart()时出错

但是,当我试图在我自己的问题一样,我得到了一个错误的问题CPLEX:“IloExtractable 189 IloNumVarl尚未被Iloalgorithm 000001ECF89B160提取”。

在我的问题,有四种类型的变量:

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 

现在,我已经添加下面的代码.................. ....

/*************************************************/ 
    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(); 
/*************************************************/ 

作为起始溶液,我使所有的X变量的z变量到。和基于某些逻辑一些的y变量是有的,而一些瓦特变量被分配给全容量Q [P],而其它的是。

它具有我遵循的相同的逻辑,但可以找到我在这里错过的东西。你可以帮我吗?

回答

0

大多数情况下,当我看到这种错误时,这是​​因为我正在尝试为不在我的问题中的变量添加mipstart值。例如,变量被声明,但不涉及任何约束或目标,所以cplex在其提取的模型中不具有它们。