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.
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
@ Ioannis: Danke für den hilfreichen Kommentar, was meinst du mit Simplex ?! – math2014
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