在CPLEX中解决线性程序,无需进行切割和预处理

时间:2019-09-02 21:22:04

标签: c++ linear-programming cplex

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

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

1 个答案:

答案 0 :(得分:2)

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

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。