在 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
禁用 Presolve 。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 保存CPLEX预处理/聚合