2015-11-04 88 views
0

我有一个非常大的LP问题需要解决并且必须多次解决。如何修改C++中的现有cplex模型

每一次,我只需要改变一些系数并重新运行。

所以我的策略是制定基本问题的模型并保存。

每一次,我都会得到一个基本模型的副本,并尝试更改系数。

问题是如何更改新副本的系数。

我知道如何在创建模型时更改系数。但我不想重复创建过程,因为它花费了很多时间。

有没有直接的方法来改变系数而无需再次创建模型?

回答

1

我修改该附带CPLEX以下ilolpex1.cpp例如:

#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

非常感谢。得到它了。 –