0

Ich versuchte, die duals von EinschränkungenCplex Konzert Technologie duals

Dies ist der Code zu bekommen, implementiert in C++:

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

wenn diese LP Problem durch verschiedene Methoden der cplex wie Barrier zu lösen, Primal, Dual, Network Ich habe am Ende ganz andere Dual-Werte und unterschiedliche Lösungen bekommen. Warum ist das so? Ist es, weil ich Gleichheitsbedingungen in meinem Problem habe? Wie kann ich sicher sein, dass wahre Werte durch cplex gehen?

jede Hilfe wird wirklich geschätzt.

+1

Dies sieht wie eine Spalte Generation Master aus einer Art von Vehicle Routing-Anwendungen. Diese Meister sind stark entartet, daher ist Davids Antwort unten genau richtig. Ich würde vorschlagen, dass Sie Simplex verwenden, denn wenn Sie neue Spalten hinzufügen, müssen Sie nicht von Grund auf neu optimieren (was für die Barriere gilt). Für solche Modelle hatte ich einige gute Ergebnisse beim Testen der [Sichten] (https://www.ibm.com/support/knowledgecenter/SS9UKU_12.6.1/com.ibm.cplex.zos.help/CPLEX/UsrMan/topics/cont_optim /simplex/10_sifting.html) Optimierer in der Vergangenheit. – Ioannis

+0

@ Ioannis: Danke für den hilfreichen Kommentar, was meinst du mit Simplex ?! – math2014

+0

Simplex ist der Standardalgorithmus für die lineare Programmierung, den CPLEX verwendet. Es gibt Varianten wie Dual Simplex, Primal Simplex und Network Simplex, die nach dem gleichen Prinzip arbeiten, aber die Ur-, Doppel- oder Netzwerkstruktur nutzen. [CPLEX verwendet standardmäßig die duale Simplex-Methode] (http://www-01.ibm.com/support/docview.wss?uid=swg21399934), aber das kann geändert werden. – Ioannis

Antwort

1

Sie haben wahrscheinlich mehrere optimale duale Lösungen: Lösungen, die alle machbar sind und den gleichen objektiven Wert haben, der dem optimalen Zielwert entspricht. Dies kann mit oder ohne gleichwertige Einschränkungen geschehen, und selbst wenn es eine einzigartige optimale ursprüngliche Lösung gibt.

+0

Danke, ja es kann wahr sein, aber ein anderes Problem, das ich habe, ist, dass einige Zeiten mit Null-Wert im Modell, ihre reduzierten Kosten positiv sind, wenn sie berechnen! – math2014