2017-05-05 13 views
0

addMIPStart()를 사용하는 동안 문제가 발생했습니다.CPLEX C++에서 addMIPStart()를 사용하는 중 오류가 발생했습니다.

처음에는 테스트 목적으로 일반 할당 문제 (이진 결정 변수 x [i] [] j가 하나만 있음)를 사용하고 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(); 
/*************************************************/ 

, I는 모두 X-변수0에 Z-변수 만든다. 그리고 어떤 로직에 기초 0 일부이다 일부 , Y 변수는 1을 반면 일부 w-변수 다른 0을 반면, 전체 용량 Q [P]에 할당.

내가 따라야 할 논리는 동일하지만 여기에서 놓친 것을 찾을 수 있습니다. 저 좀 도와 주 시겠어요?

답변

0

대부분 이런 종류의 오류가 발생했을 때 내 문제가 아닌 변수에 mipstart 값을 추가하려고하기 때문에 발생합니다. 예를 들어, 변수는 선언되었지만 어떤 제약이나 목적에 포함되지 않으므로 cplex는 추출 된 모델에서 변수를 갖지 않습니다.