0

私は制約CPLEXコンサート技術の双対

の双対を取得しようとしました。これはC++で実装コードです:プライマル・バリアのようなCPLEXの異なる方法で、このLP問題を解く際、

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

デュアル、ネットワーク私は最後に完全に異なるデュアル値と異なるソリューションを得ました。なぜこれはこういうの? 私の問題に平等の制約があるからですか? 真の値がプレpleスを通過していることを確認するにはどうすればよいですか?

本当にありがとうございます。

+1

これは、ある種の車両ルーティングアプリケーションから生じる列生成マスタのようです。これらの主人は非常に退化しているので、以下のダビデの答えが上です。新しい列を追加すると、最初から最適化する必要はありません(障壁にも当てはまります)ので、私はSimplexを使用することをお勧めします。そのようなモデルの場合、私は[ふるい分け]を試して良い結果を出しました(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が使用するリニアプログラミングのデフォルトアルゴリズムです。デュアルシンプレックス、プリミティブシンプレックス、ネットワークシンプレックスなどの変形がありますが、これらは同じ原則に基づいていますが、プライマル、デュアル、またはネットワーク構造をそれぞれ利用しています。 [CPLEXはデフォルトでデュアルシンプレックス方式を使用していますが(http://www-01.ibm.com/support/docview.wss?uid=swg21399934)、変更することができます。 – Ioannis

答えて

1

複数の最適なデュアルソリューションがあります。実現可能なすべてのソリューションで、目的の値が最適な目的の値と等しい。これは、同じ制約があってもなくても、固有の最適なプライマル解が存在しても起こる可能性があります。

+0

ありがとうございます、はい、それは真実かもしれませんが、私が持っている別の問題は、いくつかのルートは、モデルでゼロの値を持ついくつかの経路は、その削減コストは計算時にプラスです! – math2014