Двойные технологии Cplex Concert

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

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

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

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


person math2014    schedule 17.05.2017    source источник
comment
Это похоже на мастер генерации столбцов, поступающий из каких-то приложений маршрутизации транспортных средств. Эти мастера сильно выродились, поэтому приведенный ниже ответ Дэвида верен. Я бы посоветовал вам использовать Simplex, потому что по мере добавления новых столбцов вам не нужно будет повторно оптимизировать с нуля (что верно для барьера). Для таких моделей у меня были хорошие результаты, попробовав просеивание оптимизатора в прошлом.   -  person Ioannis    schedule 19.05.2017
comment
@ Иоаннис: Спасибо за полезный комментарий, что вы имеете в виду под симплексом ?!   -  person math2014    schedule 21.05.2017
comment
Симплекс - это алгоритм по умолчанию для линейного программирования, который использует CPLEX. Существуют такие варианты, как двойной симплекс, простой симплекс и сетевой симплекс, которые основаны на том же принципе, но используют преимущества основной, двойной или сетевой структуры соответственно. CPLEX по умолчанию использует двойной симплексный метод, но это может быть измененный.   -  person Ioannis    schedule 22.05.2017


Ответы (1)


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

person David Nehme    schedule 18.05.2017
comment
Спасибо, да, это может быть правдой, но еще одна проблема, которая у меня есть, заключается в том, что иногда некоторые маршруты с нулевым значением в модели, их приведенная стоимость положительна при расчете! - person math2014; 21.05.2017