我愿意解决我拥有的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);
如何摆脱这种预处理,仅获得线性松弛的解?
答案 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。