在没有 运行 内存不足的情况下处理 cplex c++ concert api++ 中的非常大的问题

Handling very large problems in cplex c++ concert api++ without running out of memory

我有一个非常大的 LP 问题,我正尝试使用 c++ concert api 在 cplex 中解决它。这是我的代码的简化版本:

// Get environment
IloEnv env = model.getEnv();

// Set x variable
for(int i = 0; i <= 10000; i++){
    x.add(IloBoolVar(env));
}

// Set objective
IloNumExpr objective(env);
objective += x[0];
model.add(IloMinimize(env, objective));

// Add constraints
for (int i = 0; i < 1000000; i++) {
    IloNumExpr some_expr(env);
    for (int j = 0; j < 10000; j++){
        some_expr += x[j];
    }
    IloRange constraint(env,0,some_expr,0);
    c.add(constraint);
}

model.add(x);
model.add(c);

// store
IloCplex cplex(model);
cplex.exportModel("lpex1.lp");

当我 运行 它时,我的电脑所用的内存很快就会变大,导致一切崩溃。有没有办法处理像这样的大问题?

考虑以下完整示例:

#include <ilcplex/ilocplex.h>
ILOSTLBEGIN

int
main (int argc, char **argv)
{
   IloEnv env;
   IloNumVarArray x(env);

   int numVars = 10000;
   int numCons = 1000000;

   if (argc == 3) {
      stringstream nvars(argv[1]);
      stringstream ncons(argv[2]);
      nvars >> numVars;
      ncons >> numCons;
   }

   // Set x variable
   for(int i = 0; i <= numVars; i++) {
      x.add(IloBoolVar(env));
   }

   // Set objective
   IloModel model(env);
   IloNumExpr objective(env);
   objective += x[0];
   model.add(IloMinimize(env, objective));

   // Add constraints
   IloRangeArray c(env);
   for (int i = 0; i < numCons; i++) {
      IloNumExpr some_expr(env);
      for (int j = 0; j < numVars; j++) {
         some_expr += x[j];
      }
      c.add(some_expr == 0.0);
      some_expr.end();
   }

   model.add(c);

   std::cout << "Memory usage after creating constraints: "
             << env.getMemoryUsage() / (1024. * 1024.)
             << " MB" << std::endl;

   env.end();
   return 0;
}  // END main

它与您的示例基本相同,只是我们使用 getMemoryUsage() 方法打印出我们正在使用的内存量。如果我们编译并运行这个,我们得到如下输出:

$ ./test 10000 1000
Memory usage after creating constraints: 229.827 MB

注意,这仅适用于 1000 个约束。如果我的计算正确,您将需要 1000 倍的内存来从您的示例片段构建模型,这将是 ~230 GB 的 RAM!这甚至不包括提取模型然后尝试求解它真正需要多少内存。

您的 4 GB 计算机不支持此操作。通常,使用 CPLEX Callable Library(又名 C API)需要的内存占用较小,但您必须使用 lower-level 函数。但是,在这种情况下,这对您也不起作用,因为您正在尝试构建一个对您的机器来说太大的模型。