2015-11-04 2 views
0

У меня очень большая проблема с LP, чтобы решить ее и решить ее много раз.Как пересмотреть существующую модель cplex в C++

Каждый раз мне нужно только изменить коэффициент и запустить его снова.

Итак, моя стратегия - сформулировать модель для основной проблемы и сохранить ее.

Каждый раз, когда я получаю копию базовой модели и пытаюсь изменить коэффициент.

Проблема в том, как изменить коэффициент для новой копии.

Я знаю, как изменить коэффициент при создании модели. Но я не хочу повторять процесс создания, так как он требует много времени.

Есть ли какой-либо прямой метод для изменения коэффициента без создания модели снова?

ответ

1

Я изменил ilolpex1.cpp пример, который поставляется с CPLEX ниже:

#include <ilcplex/ilocplex.h> 
ILOSTLBEGIN 

static void 
    populatebyrow  (IloModel model, IloNumVarArray var, IloRangeArray con); 

int 
main (int argc, char **argv) 
{ 
    IloEnv env; 
    try { 
     IloModel model(env); 
     IloNumVarArray var(env); 
     IloRangeArray con(env); 

     populatebyrow (model, var, con); 

     IloCplex cplex(model); 
     cplex.exportModel("lpex1.1.lp"); 

     // Optimize the problem and obtain solution. 
     if (!cplex.solve()) { 
     env.error() << "Failed to optimize LP" << endl; 
     throw(-1); 
     } 

     env.out() << "Solution status = " << cplex.getStatus() << endl; 
     env.out() << "Solution value = " << cplex.getObjValue() << endl; 

     // Modify one of the coefficients and solve again. 
     con[0].setLinearCoef(var[2], 2); 
     cplex.exportModel("lpex1.2.lp"); 

     // Optimize the problem and obtain solution. 
     if (!cplex.solve()) { 
     env.error() << "Failed to optimize LP" << endl; 
     throw(-1); 
     } 

     env.out() << "Solution status = " << cplex.getStatus() << endl; 
     env.out() << "Solution value = " << cplex.getObjValue() << endl; 
    } 
    catch (IloException& e) { 
     cerr << "Concert exception caught: " << e << endl; 
    } 
    catch (...) { 
     cerr << "Unknown exception caught" << endl; 
    } 

    env.end(); 

    return 0; 
} // END main 


// To populate by row, we first create the variables, and then use them to 
// create the range constraints and objective. 

static void 
populatebyrow (IloModel model, IloNumVarArray x, IloRangeArray c) 
{ 
    IloEnv env = model.getEnv(); 

    x.add(IloNumVar(env, 0.0, 40.0)); 
    x.add(IloNumVar(env)); 
    x.add(IloNumVar(env)); 

    model.add(IloMaximize(env, x[0] + 2 * x[1] + 3 * x[2])); 

    c.add(- x[0] +  x[1] + x[2] <= 20); 
    c.add( x[0] - 3 * x[1] + x[2] <= 30); 

    x[0].setName("x1"); 
    x[1].setName("x2"); 
    x[2].setName("x3"); 

    c[0].setName("c1"); 
    c[1].setName("c2"); 
    model.add(c); 

} // END populatebyrow 

Я использовал метод setLinearCoef, чтобы изменить один из коэффициентов. Вы можете сравнить два файла LP («lpex1.1.lp» и «lpex1.2.lp»), чтобы увидеть/проверить изменения.

+0

спасибо. Понял. –

Смежные вопросы