I want to solve a MIP in Cplex (with IloCplex for C++) using only the branch & bound feature (i.e. without all the enhancements that speed up the solving like probing, running heuristics at each node, adding cuts etc.). The idea is to be able to test the impact of my own cuts without the results being blurred by the cuts and the various improvements of Cplex on the branch & bound.
I have already disabled many methods but the root relaxation is still better than the objective value I get when I run my MIP with all integrity constraints relaxed meaning that Cplex is still improving the branch & bound by any means.
I set the following parameters:
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);
and I deactivate all cuts by:
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);
What am I missing?
As point out by Erwin, it is not possible to disable all Cplex enhancements in order to obtain a "vanilla" branch & bound. A more detailed explanation is available here