Cplex Концертная технология duals

Я пытался получить двойственные ограничения

Это код, реализованный на 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 shodefor (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]);
}
}

Решая эту проблему LP с помощью различных методов cplex, таких как Barrier, Primal, Dual, Network, я в итоге получил совершенно разные значения Dual и разные решения. почему это так?
Это потому, что у меня есть проблемы равенства в моей проблеме?
Как я могу быть уверен, что истинные значения проходят через cplex?

любая помощь действительно ценится.

0

Решение

Скорее всего, у вас есть несколько оптимальных двойных решений: все решения, которые возможны и имеют одинаковое объективное значение, равное оптимальному объективному значению. Это может происходить с одинаковыми ограничениями или без них, и даже если существует единственное оптимальное первичное решение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]