Skip to content

3.2 Reading the results

Class: implementation · Script: python/cap06_gurobi.py

Open in Colab

Status, SolCount, ObjVal, ObjBound, MIPGap, NodeCount: what they mean and which ones may be read, including the case where the solver has not finished.

Reading the results

The reading order never changes: Status, then SolCount, then ObjVal and ObjBound, then MIPGap, NodeCount, Runtime.

Status value SolCount What can be said
OPTIMAL 2 \(\ge 1\) $z(\mathit{MILP}) = $ ObjVal, proved
INFEASIBLE 3 0 the model has no feasible solution
UNBOUNDED 5 0 a constraint, or a bound on a variable, is missing
TIME_LIMIT 9 0 nothing: neither a solution nor, in general, a useful bound
TIME_LIMIT 9 \(\ge 1\) ObjBound \(\le z(\mathit{MILP}) \le\) ObjVal
SOLUTION_LIMIT 10 \(\ge 1\) as above

The four cases on the assignment instance

  • Normal solve. Status = 2, SolCount = 2, ObjVal = ObjBound = 11, MIPGap = 0, NodeCount = 0.
  • Infeasible. With availability \((1,1,1)\): Status = 3, SolCount = 0.
  • Stopped immediately. With TimeLimit = 0: Status = 9, SolCount = 0, ObjBound \(= -\infty\). There is nothing to report.
  • Stopped at the first solution. With SolutionLimit = 1: Status = 10, SolCount = 1, ObjVal = 12, ObjBound = 10, MIPGap = 0.1667. This is the case where an interval is reported: the optimum lies between \(10\) and \(12\). Saying "the optimum is \(12\)" would be false.

What is not reported

One does not write "the optimum is ObjVal" if Status is not OPTIMAL. One does not write a gap if SolCount is \(0\). One does not compare the Runtime of two models solved with different settings. And one does not read ObjBound at the end of the solve thinking it is the root relaxation: for that, relax() is needed.