Search code examples
optimizationmathematical-optimizationcplexgurobiinteger-programming

keep cutting without branching in MIP solver (Gurobi)


I have a MIP which I know the solution almost for certain. I want to use gurobi to prove that the true solution (even if it is not the one I provide) shall not lie more than 0.5% deviated from the solution I gave. I believe that simply keeping the cutting without branching would possibly save much more time. Do you know a way that I could simply do cutting without branching in gurobi? Here's the code performance:

Changed value of parameter LogFile to Prev: gurobi.log Default: Changed value of parameter MIPFocus to 3 Prev: 0 Min: 0 Max: 3 Default: 0 Changed value of parameter Cuts to 3 Prev: -1 Min: -1 Max: 3 Default: -1 Optimize a model with 1794 rows, 673 columns and 4180 nonzeros Found heuristic solution: objective -22.8549 Presolve removed 18 rows and 17 columns Presolve time: 0.01s Presolved: 1776 rows, 656 columns, 4464 nonzeros

Loaded MIP start with objective -342.641

Variable types: 592 continuous, 64 integer (64 binary) Presolved: 1776 rows, 656 columns, 4464 nonzeros

Root relaxation: objective -6.775689e+02, 682 iterations, 0.02 seconds

   Nodes    |    Current Node    |     Objective Bounds      |     Work
 Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time

     0     0 -677.56892    0   64 -342.64109 -677.56892  97.7%     -    0s
     0     0 -666.45290    0   72 -342.64109 -666.45290  94.5%     -    0s
     0     0 -658.68050    0   72 -342.64109 -658.68050  92.2%     -    1s
     0     0 -540.92023    0   72 -342.64109 -540.92023  57.9%     -    3s
     0     0 -503.36031    0   72 -342.64109 -503.36031  46.9%     -    4s
     0     0 -485.13025    0   72 -342.64109 -485.13025  41.6%     -    6s
     0     0 -472.73790    0   72 -342.64109 -472.73790  38.0%     -    8s
     0     0 -461.23185    0   72 -342.64109 -461.23185  34.6%     -    9s
     0     0 -453.99476    0   72 -342.64109 -453.99476  32.5%     -   10s

     0     0 -452.23014    0   72 -342.64109 -452.23014  32.0%     -   10s
     0     3 -452.23014    0   72 -342.64109 -452.23014  32.0%     -   11s
   642   586 -397.07656   12   54 -342.64109 -429.76289  25.4%   120   15s
  1425  1290 -397.34606   11   60 -342.64109 -422.53417  23.3%   114   20s
  1716  1553 -382.83438   18   72 -342.64109 -420.42709  22.7%   111   25s
  1727  1560 -376.17473   16   72 -342.64109 -420.42709  22.7%   110   30s
  1733  1564 -410.28764   10   72 -342.64109 -420.42709  22.7%   110   35s
  1744  1571 -382.83438   18   72 -342.64109 -420.42709  22.7%   109   40s
  1750  1577 -412.59771   12   69 -342.64109 -416.84728  21.7%   113   45s
  1817  1602 -380.32997   19   60 -342.64109 -404.73090  18.1%   120   50s
  2618  2045 -375.99924   18   62 -342.64109 -391.32863  14.2%   126   55s
  3159  2315 -369.40052   22   59 -342.64109 -386.33088  12.8%   127   60s
  3808  2595 -362.27693   20   60 -342.64109 -382.29310  11.6%   127   65s
  4503  2903 -350.90325   24   54 -342.64109 -379.52932  10.8%   126   71s
  4895  3078 -349.90847   23   55 -342.64109 -378.33598  10.4%   126   78s
  5339  3242 -363.26836   21   59 -342.64109 -376.77299  10.0%   126   80s

....


Solution

  • To avoid branching in Gurobi (Cplex), you can set the parameter NodeLimit (NodLim in Cplex) to 1. To do what you ultimately want, simply verify that your solution is within 0.5% or optimal, you can load the known solution as an incument (mip start, as you are already doing) set the MIPFocus parameter to 3 (move bound) and set the MIPGap paramter to 0.005, which will make Gurobi (cplex) stop when the conditions you want are found.

    If you are confident that your solution is better than anything the solver will find, then you might also turn off heuristics, with the Heuristics parameter. Gurobi will typically take around 5% of the time to look for better solutions, which won't help the bound unless any solution it finds is better than the incumbent you provided. In Cplex, the parameter is HeurFreq, which you set to -1 to turn off.

    You might also turning up presolve which can improve the bound, especially at the root. Try turning up Presolve to 2, PreDual to 2. There's also a Symmetry paramter that does additional reductions at the root. Usually the default settings are best, but in your case, they are probably worth at least trying.

    For CPLEX only, there is a Probing parameter, which you can set to 3. This will on average, slow solution time down, but might also improve your bound at the root.