Reading a MIP Solver Log

Interpret the running output of a branch-and-bound MIP solver: identify the incumbent and best bound, track their convergence, compute the relative MIP gap, and determine which termination condition was triggered.

Step 1 of 157%

Tutorial

Anatomy of a MIP Solver Log

A MIP solver log is the stream of text a branch-and-bound solver prints while it runs. Each row summarizes the solver's state at one moment in the search. Although the exact column names differ between solvers (Gurobi, CPLEX, CBC, SCIP), every log reports the same five core quantities:

  1. Nodes — the number of subproblems examined so far.
  2. Incumbent — the objective value of the best integer-feasible solution found so far. We denote it zz^*.
  3. Best Bound — the tightest bound on the optimal objective coming from unsolved nodes. For a minimization problem this is a lower bound z\underline{z}; for a maximization problem it is an upper bound z\overline{z}.
  4. Gap — a relative distance between the incumbent and the best bound.
  5. Time — elapsed wall-clock time.

A typical minimization log line looks like:

NodesIncumbentBest BoundGapTime1247138.0125.49.13%12.3s\begin{array}{|c|c|c|c|c|} \hline \text{Nodes} & \text{Incumbent} & \text{Best Bound} & \text{Gap} & \text{Time} \\ \hline 1247 & 138.0 & 125.4 & 9.13\% & 12.3\text{s} \\ \hline \end{array}

This line says: after exploring 12471247 nodes, the best integer-feasible solution has objective 138.0,138.0, the tightest lower bound across the remaining open nodes is 125.4,125.4, and the relative gap between them is 9.13%.9.13\%. Because this is a minimization problem, the true optimum zoptz^{\mathrm{opt}} is sandwiched between the bound and the incumbent:

125.4zopt138.0.125.4 \le z^{\mathrm{opt}} \le 138.0.

For a maximization problem the inequality flips: the incumbent is a lower bound on zoptz^{\mathrm{opt}} and the best bound is an upper bound, so zzoptz.z^* \le z^{\mathrm{opt}} \le \overline{z}.

navigate · Enter open · Esc close · ⌘K/Ctrl K toggle