如何禁用 Cplex 中的所有分支和边界改进?

问题描述

我想在 Cplex 中解决 MIP(使用 IloCplex for C++)仅使用分支和边界功能(即没有所有加速解决的增强功能,如探测、在每个节点运行启发式、添加切割等)。这个想法是为了能够测试我自己的切割的影响,而不会被切割和 Cplex 在分支定界上的各种改进所模糊。

我已经禁用了许多方法,但根松弛仍然比我在所有完整性约束松弛的情况下运行 MIP 时获得的目标值要好,这意味着 Cplex 仍在以任何方式改进分支和边界。

我设置了以下参数:

    cplex.setParam(IloCplex::Param::Preprocessing::Presolve,IloFalse);
    cplex.setParam(IloCplex::Param::MIP::Strategy::Search,IloCplex::Traditional);
    cplex.setParam(IloCplex::Param::MIP::Strategy::Probe,-1);
    cplex.setParam(IloCplex::Param::MIP::Strategy::HeuristicFreq,-1);
    cplex.setParam(IloCplex::Param::Preprocessing::BoundStrength,0);
    cplex.setParam(IloCplex::Param::Preprocessing::CoeffReduce,0);
    cplex.setParam(IloCplex::Param::MIP::Limits::CutPasses,-1);
    cplex.setParam(IloCplex::Param::MIP::Strategy::FPHeur,-1);

我通过以下方式停用所有剪辑:

    cplex.setParam(IloCplex::Param::MIP::Cuts::BQP,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::Cliques,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::Covers,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::disjunctive,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::FlowCovers,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::Gomory,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::GUBCovers,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::Implied,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::LiftProj,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::LocalImplied,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::MCFCut,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::MIRCut,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::PathCut,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::RLT,-1);
    cplex.setParam(IloCplex::Param::MIP::Cuts::ZeroHalfCut,-1);

我错过了什么?

解决方法

正如 Erwin 所指出的,不可能禁用所有 Cplex 增强功能以​​获得“vanilla”分支和边界。提供了更详细的说明here