在没有 运行 内存不足的情况下处理 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 函数。但是,在这种情况下,这对您也不起作用,因为您正在尝试构建一个对您的机器来说太大的模型。
我有一个非常大的 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 函数。但是,在这种情况下,这对您也不起作用,因为您正在尝试构建一个对您的机器来说太大的模型。