0

내가 제약CPLEX 콘서트 기술 DUALS

이 C++로 구현 된 코드 인의 DUALS를 얻기 위해 노력 :

IloEnv env; 
    IloModel MasterProblem(env); 

    IloNumVarArray XX(env,Create_routes.size(),0,IloInfinity,ILOFLOAT); 
    IloNumVarArray t(env,m,0,IloInfinity,ILOFLOAT); 
    IloExpr expr(env); 

    ////defining ojective of problem 

    IloObjective masterObj(env,expr,IloObjective::Maximize); 
    expr.end(); 
    MasterProblem.add(masterObj); 

    IloRangeArray const1(env); //hala yeki yeki mahdudiyatha ro misazim  

    for (int i=0; i<n; i++){ 
     IloExpr expr(env); 
     for (int j=0; j<Create_routes.size(); j++){ 
      if (Create_routes[j]->internalnodes[i+m]==1) 
       expr+=XX[j]; 
     } 
     const1.add(1==expr); 
     MasterProblem.add(const1[i]); 
     expr.end(); 
    } 
    IloRangeArray const2(env);  
    IloRangeArray const4(env);//mahdudiate depohaye open shode 


    for (i=0; i<m; i++){ 
     IloExpr expr(env); 
     for (int j=0; j<Create_routes.size(); j++){ 
      if (Create_routes[j]->depot==i){ 
       expr+=XX[j]*Create_routes[j]->demand_collected; 
      } 
     } 

     expr-=t[i]*g[i]->QF; 
     const2.add(0>=expr); 
     MasterProblem.add(const2[i]); 
     expr.end(); 
    } 

    IloRangeArray2 const3(env,m); 

    for (i=0; i<m; i++){ 
     const3[i]=IloRangeArray(env); 
    } 

    for (int f=0; f<m; f++){ 
     for (i=0; i<n; i++){ 
      IloExpr expr(env); 
      for (int j=0; j<Create_routes.size(); j++){ 
       if ((Create_routes[j]->depot==f)&&(Create_routes[j]->internalnodes[i+m]==1)){ 
        expr+=XX[j]; 
       } 
      } 
      expr-=t[f]; 
      const3[f].add(0>=expr); 
      MasterProblem.add(const3[f][i]); 
      expr.end(); 
     }  
    } 

    IloCplex cplexM(MasterProblem); 
    cplexM.setParam(IloCplex::RootAlg, IloCplex::Barrier); 
    cplexM.setParam(IloCplex::Threads, 4); 

    if (!cplexM.solve()){ 
     env.error() << "Failed to optimize LP." << endl; 
     nodee->uperbound=0; 
     env.end(); 
     return; 
    } 
    else{ 
     if (!cplexM.isPrimalFeasible()){//agar infeasible bud bia birun 
     nodee->uperbound=0; 
     return; 
     } 
     cout<<"MasterProblem Solved"<<endl; 
     cout<<"objective="<<cplexM.getObjValue()<<endl; 
     javab=cplexM.getObjValue(); 
    } 

    IloNumArray duall(env,n); 
    IloNumArray duall1(env,m); 

    cplexM.getDuals(duall,const1); 
    cplexM.getDuals(duall1,const2); 

    IloNumArray2 duall2(env,m); 
    for (i=0; i<m; i++){ 
     duall2[i]=IloNumArray(env,n); 
     for (j=0;j<n;j++){ 
      duall2[i][j]=cplexM.getDual(const3[i][j]); 
     } 
    } 

태초의 장벽 같은 CPLEX의 다른 방법으로이 LP 문제를 해결, 듀얼, 네트워크 완전히 다른 듀얼 값과 다른 솔루션이 있습니다. 왜이게 이런거야? 내 문제에 동등한 제약이 있기 때문에 그럴 수 있습니까? 실제 값이 cplex를 통과하는지 어떻게 확인할 수 있습니까?

정말 도움이됩니다.

+1

이것은 차량 라우팅 애플리케이션의 일종 인 열 생성 마스터처럼 보입니다. 이 주인들은 고도로 타락하다. 그래서 다윗의 대답은 아래에있다. 새로운 컬럼을 추가 할 때 처음부터 재 최적화 할 필요가 없기 때문에 Simplex를 사용하는 것이 좋습니다 (장벽에 해당). 이러한 모델의 경우, 나는 좋은 결과를 얻었습니다. (sifting) (https://www.ibm.com/support/knowledgecenter/SS9UKU_12.6.1/com.ibm.cplex.zos.help/CPLEX/UsrMan/topics/cont_optim /simplex/10_sifting.html) 옵티마이 저를 사용하십시오. – Ioannis

+0

@ Ioannis : 도움이되는 의견을 보내 주셔서 감사합니다. 심플 렉스를 사용하면 무엇을 의미합니까?! – math2014

+0

심플 렉스는 CPLEX가 사용하는 선형 프로그래밍의 기본 알고리즘입니다. 듀얼 심플 렉스 (Dual Simplex), 원초적 심플 렉스 (Premal Simplex) 및 네트워크 심플 렉스 (Network Simplex)와 같은 변종이 있는데, 동일한 원칙에 힌지하지만 원색, 이중 또는 네트워크 구조를 각각 활용합니다. [CPLEX는 기본적으로 이중 Simplex 방법을 사용합니다.] (http://www-01.ibm.com/support/docview.wss?uid=swg21399934) 변경할 수 있습니다. – Ioannis

답변

1

최적의 이중 솔루션이 가능합니다 : 모든 가능한 솔루션이며 최적의 목표 값과 동일한 목표 값을가집니다. 이것은 똑같이 제약 조건이 있거나없는 경우에도 발생할 수 있으며 고유 한 최적 원색 솔루션이 있더라도 발생할 수 있습니다.

+0

고마워, 네 그것은 사실 일 수 있지만 내가 가지고있는 또 다른 문제는 모델에서 제로 값을 가진 몇몇 경로가 있고, 계산 된 값이 줄어들 었다는 것입니다. – math2014