c++ - 如何在 C++ 中修改现有的 cplex 模型

标签 c++ cplex

我有一个非常大的 LP 问题需要解决并且必须解决很多次。

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

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

每次,我都得到一个基本模型的拷贝,并尝试改变系数。

问题是如何更改新拷贝的系数。

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

有没有不用重新创建模型直接改变系数的方法?

最佳答案

我在下面修改了 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”)以查看/验证更改。

关于c++ - 如何在 C++ 中修改现有的 cplex 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33513437/

相关文章:

python - model.solve() 方法对于 Python 的 DOcplex 不起作用 ("CPLEX DLL not found")

java - 我如何使用 Java 解决 CPLEX : Infeasibility row 'c2' : 0 = -3

routes - 车辆路径的线性规划

java - 是否可以使用 java 为 CPLEX 创建 .dat 文件?

c++ - std::thread 的 drd 和 helgrind 支持的当前状态

c++ - Lambda:未评估上下文中未捕获的对象

c++ - 如果我为 float 定义自定义比较函数,std::sort 是否会正常工作?

c++ - FindFirstChangeNotification 锁定父文件夹

c++ - 如何分块读取文件直到 EOF (C++)

c++ - Cplex Concert 技术 double