Search code examples
optimizationjuliagurobijulia-jump

Julia - Understanding JuMP Gurobi outputs


I am often using Gurobi with JuMP and I noticed that there are still parts of its outputs that I don't understand. Unless it is documented somewhere and the link would be most welcome, could you help understand the following? :)

Found heuristic solution: objective 5820.0000000
Presolve removed 33 rows and 11 columns
Presolve time: 0.00s
Presolved: 607 rows, 331 columns, 2445 nonzeros
Variable types: 111 continuous, 220 integer (220 binary)

Root relaxation: objective 1.157500e+03, 64 iterations, 0.00 seconds

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

     0     0 1157.50000    0   25 5820.00000 1157.50000  80.1%     -    0s
H    0     0                    2535.0000000 1157.50000  54.3%     -    0s
     0     0 1236.00000    0   23 2535.00000 1236.00000  51.2%     -    0s
     0     0 1273.65351    0   41 2535.00000 1273.65351  49.8%     -    0s
     0     0 1274.59375    0   41 2535.00000 1274.59375  49.7%     -    0s
     0     0 1274.69841    0   42 2535.00000 1274.69841  49.7%     -    0s
     0     0 1309.98305    0   42 2535.00000 1309.98305  48.3%     -    0s
     0     0 1310.26027    0   42 2535.00000 1310.26027  48.3%     -    0s
     0     0 1340.01176    0   47 2535.00000 1340.01176  47.1%     -    0s
     0     0 1342.47826    0   49 2535.00000 1342.47826  47.0%     -    0s
     0     0 1342.60000    0   49 2535.00000 1342.60000  47.0%     -    0s
     0     0 1362.32468    0   50 2535.00000 1362.32468  46.3%     -    0s
     0     0 1363.08000    0   49 2535.00000 1363.08000  46.2%     -    0s
     0     0 1363.13077    0   49 2535.00000 1363.13077  46.2%     -    0s
     0     0 1370.79545    0   53 2535.00000 1370.79545  45.9%     -    0s
     0     0 1375.50000    0   52 2535.00000 1375.50000  45.7%     -    0s
     0     0 1375.50000    0   52 2535.00000 1375.50000  45.7%     -    0s
     0     0 1376.70025    0   52 2535.00000 1376.70025  45.7%     -    0s
     0     0 1376.70122    0   53 2535.00000 1376.70122  45.7%     -    0s
     0     0 1376.70122    0   53 2535.00000 1376.70122  45.7%     -    0s
     0     2 1376.98418    0   53 2535.00000 1376.98418  45.7%     -    0s
*  255   157              14    2457.0000000 1473.00000  40.0%  22.5    0s
H  407   223                    2397.0000000 1548.00000  35.4%  20.3    0s
* 1962   758              22    2355.0000000 1772.85714  24.7%  16.8    0s
*14326  2205              27    2343.0000000 2088.50000  10.9%  15.7    3s

From what I think I already know, in order of apparition:


Presolve

  • Found heuristic solution: objective 5820, Gurobi launched a presolve and found a solution of value 5820
  • Presolve removed 33 redundant or useless variables as well as 11 constraints?
  • Presvoled: sizes of the model presolved
  • Types of variables: some are binary and some are continuous.
  • Root relaxation: LP relaxation has an objective of 1 157.5

Nodes

  • Expl (1): * empty or H, I don't know the difference when there is these symbols but I noticed all rows with a given symbol (H, *, or empty) will have same outputs.
  • Expl and Unexpl number of explored nodes and unexplored nodes in the solving tree.

Current Node

  • Obj: objective of current node being explored?
  • Depth: tree's depth where solving is currently
  • IntInf: I have no idea for this one

Objective Bounds

  • Incumbent: current value of best valid solution found
  • BestBd: Best lower bound currently found
  • Gap: This is probably a gap between current best solution and best bound but I couldn't deduce how it is computed.

Work

  • It/Node: Here we need to find what is an iteration
  • Time: Time spent in solving until then.

Solution

  • The details can be found at https://www.gurobi.com/documentation/9.1/refman/mip_logging.html.

    Let me just cite those that answer your question:

    The Nodes section (the first two columns) provides general quantitative information on the progress of the search. The first column shows the number of branch-and-cut nodes that have been explored to that point, while the second shows the number of leaf nodes in the search tree that remain unexplored. At times, there will be an H or * character at the beginning of the output line. These indicate that a new feasible solution has been found, either by a MIP heuristic (H) or by branching (*).

    The Current Node section provides information on the specific node that was explored at that point in the branch-and-cut tree. It shows the objective of the associated relaxation, the depth of that node in the branch-and-cut tree, and the number of integer variables that have non-integral values in the associated relaxation.

    The Objective Bounds section provides information on the best known objective value for a feasible solution (i.e., the objective value of the current incumbent), and the current objective bound provided by leaf nodes of the search tree. The optimal objective value is always between these two values. The third column in this section (Gap) shows the relative gap between the two objective bounds. When this gap is smaller than the MIPGap parameter, optimization terminates.

    The Work section of the log provides information on how much work has been performed to that point. The first column shows the average number of simplex iterations performed per node in the branch-and-cut tree. The final column shows the elapsed time since the solve began.

    Looking at your log you are approaching very quickly to optimality and you get the Gap=0.01% solution in probably half minute or so.