在没有切割和预处理的情况下求解 CPLEX 中的线性程序

Solve a linear program in CPLEX without the cuts and preprocessing

我愿意解决我拥有的 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.

禁用预求解