在没有切割和预处理的情况下求解 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
.
禁用预求解
我愿意解决我拥有的 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
.