在 CPLEX 中求解线性规划,无需剪切和预处理

Solve a linear program in CPLEX without the cuts and preprocessing

本文关键字:预处理 CPLEX 线性规划      更新时间:2023-10-16

我愿意解决我拥有的ILP模型的线性松弛。
因此,我将所有{0,1}变量都设置为IloNumVar,并调用了 CPLEX 的函数solve()

但是,此调用解决了执行昂贵的预处理并插入大量切割的根节点,但我想做的只是获得模型线性松弛的解决方案。

我设置了上述所有参数。但是,由于 CPLEX 预处理,线性松弛求解速度不够快。

cplex->setParam(IloCplex::Cliques, -1);
cplex->setParam(IloCplex::Covers, -1);
cplex->setParam(IloCplex::DisjCuts, -1);
cplex->setParam(IloCplex::FlowCovers, -1);
cplex->setParam(IloCplex::FlowPaths, -1);
cplex->setParam(IloCplex::GUBCovers, -1);
cplex->setParam(IloCplex::ImplBd, -1);
cplex->setParam(IloCplex::MIRCuts, -1);
cplex->setParam(IloCplex::FracCuts, -1);
cplex->setParam(IloCplex::ZeroHalfCuts, -1);

如何摆脱这种预处理并仅获得线性弛豫的解?

如果要求解线性松弛,则必须将模型作为 LP 求解,而不是作为 MIP。为此,请将所有变量转换为连续变量。这可以通过为每个变量添加一个 IloConversion 来完成。有关 CPLEX 附带的示例iloadmipex6.cpp中的函数solveRelaxed示例:

void solveRelaxed(IloModel mdl, IloNumVarArray vars, IloNumArray rel) {
IloEnv env = mdl.getEnv();
IloModel relax(env);
relax.add(mdl);
relax.add(IloConversion(env, vars, ILOFLOAT));
IloCplex cplex(relax);
cplex.solve();
env.out() << "Solution status = " << cplex.getStatus() << endl;
cplex.getValues(rel, vars);
cplex.end();
relax.end();
}

顺便说一句,禁用所有切割平面的一种更简单的方法是设置参数CutPass

另请注意,即使作为 LP 求解,CPLEX 也会进行预求解。可以通过参数PreInd禁用 Presolve 。