0

I am trying to understand the meaning of the display output when using SCIP to solve an MILP using Branch-and-cut code. I use the TSP example as a reference.

 time | node  | left  |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr|  dualbound   | primalbound  |  gap   | compl. 
p 1.9s|     1 |     0 |     0 |     - | vbounds|   0 |1861 | 130 | 126 |   0 |  0 |   3 |   0 | 0.000000e+00 | 5.523000e+03 |    Inf | unknown
  2.2s|     1 |     0 |  1320 |     - |    15M |   0 |1861 | 130 | 126 |   0 |  0 |   3 |   0 | 9.795000e+02 | 5.523000e+03 | 463.86%| unknown
  2.2s|     1 |     0 |  1321 |     - |    15M |   0 |1861 | 130 | 126 |   0 |  0 |   3 |   0 | 9.800000e+02 | 5.523000e+03 | 463.57%| unknown
  4.6s|     1 |     0 |  1341 |     - |    15M |   0 |1861 | 130 | 128 |   2 |  1 |   3 |   0 | 9.800000e+02 | 5.523000e+03 | 463.57%| unknown
  4.6s|     1 |     0 |  1393 |     - |    15M |   0 |1861 | 130 | 129 |   3 |  2 |   3 |   0 | 9.800000e+02 | 5.523000e+03 | 463.57%| unknown
  4.7s|     1 |     0 |  1422 |     - |    15M |   0 |1861 | 130 | 136 |  10 |  3 |   3 |   0 | 9.800000e+02 | 5.523000e+03 | 463.57%| unknown
  4.8s|     1 |     0 |  1472 |     - |    16M |   0 |1861 | 130 | 139 |  13 |  4 |   3 |   0 | 9.860000e+02 | 5.523000e+03 | 460.14%| unknown
  4.8s|     1 |     0 |  1472 |     - |    16M |   0 |1861 | 130 | 139 |  13 |  4 |   3 |   0 | 9.860000e+02 | 5.523000e+03 | 460.14%| unknown
  4.9s|     1 |     0 |  1479 |     - |    17M |   0 |1861 | 130 | 144 |  18 |  5 |   3 |   0 | 9.925000e+02 | 5.523000e+03 | 456.47%| unknown
  4.9s|     1 |     0 |  1480 |     - |    17M |   0 |1861 | 130 | 144 |  18 |  5 |   3 |   0 | 9.930000e+02 | 5.523000e+03 | 456.19%| unknown
  5.0s|     1 |     0 |  1489 |     - |    17M |   0 |1861 | 130 | 148 |  22 |  6 |   3 |   0 | 9.930000e+02 | 5.523000e+03 | 456.19%| unknown
  5.0s|     1 |     0 |  1530 |     - |    17M |   0 |1861 | 130 | 151 |  25 |  7 |   3 |   0 | 9.930000e+02 | 5.523000e+03 | 456.19%| unknown
  5.1s|     1 |     0 |  1558 |     - |    17M |   0 |1861 | 130 | 153 |  27 |  8 |   3 |   0 | 9.957500e+02 | 5.523000e+03 | 454.66%| unknown
  5.1s|     1 |     0 |  1559 |     - |    17M |   0 |1861 | 130 | 153 |  27 |  8 |   3 |   0 | 9.960000e+02 | 5.523000e+03 | 454.52%| unknown
  5.2s|     1 |     0 |  1680 |     - |    17M |   0 |1861 | 130 | 160 |  34 |  9 |   3 |   0 | 1.019750e+03 | 5.523000e+03 | 441.60%| unknown
 time | node  | left  |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr|  dualbound   | primalbound  |  gap   | compl. 
  5.2s|     1 |     0 |  1681 |     - |    17M |   0 |1861 | 130 | 160 |  34 |  9 |   3 |   0 | 1.020000e+03 | 5.523000e+03 | 441.47%| unknown
  5.4s|     1 |     0 |  1795 |     - |    17M |   0 |1861 | 130 | 165 |  39 | 10 |   3 |   0 | 1.040500e+03 | 5.523000e+03 | 430.80%| unknown
  5.4s|     1 |     0 |  1796 |     - |    17M |   0 |1861 | 130 | 165 |  39 | 10 |   3 |   0 | 1.041000e+03 | 5.523000e+03 | 430.55%| unknown
  5.5s|     1 |     0 |  1822 |     - |    17M |   0 |1861 | 130 | 170 |  44 | 11 |   3 |   0 | 1.041000e+03 | 5.523000e+03 | 430.55%| unknown
  5.6s|     1 |     0 |  1859 |     - |    18M |   0 |1861 | 130 | 162 |  48 | 12 |   3 |   0 | 1.041000e+03 | 5.523000e+03 | 430.55%| unknown
  5.7s|     1 |     0 |  1880 |     - |    18M |   0 |1861 | 130 | 172 |  58 | 13 |   3 |   0 | 1.041000e+03 | 5.523000e+03 | 430.55%| unknown
  5.8s|     1 |     0 |  1917 |     - |    18M |   0 |1861 | 130 | 177 |  63 | 14 |   3 |   0 | 1.044500e+03 | 5.523000e+03 | 428.77%| unknown
  5.8s|     1 |     0 |  1918 |     - |    18M |   0 |1861 | 130 | 177 |  63 | 14 |   3 |   0 | 1.045000e+03 | 5.523000e+03 | 428.52%| unknown
  5.9s|     1 |     0 |  1993 |     - |    18M |   0 |1861 | 130 | 182 |  68 | 15 |   3 |   0 | 1.047643e+03 | 5.523000e+03 | 427.18%| unknown
  5.9s|     1 |     0 |  1994 |     - |    18M |   0 |1861 | 130 | 182 |  68 | 15 |   3 |   0 | 1.048000e+03 | 5.523000e+03 | 427.00%| unknown
  6.0s|     1 |     0 |  2022 |     - |    18M |   0 |1861 | 130 | 171 |  70 | 16 |   3 |   0 | 1.048750e+03 | 5.523000e+03 | 426.63%| unknown
  6.0s|     1 |     0 |  2023 |     - |    18M |   0 |1861 | 130 | 171 |  70 | 16 |   3 |   0 | 1.049000e+03 | 5.523000e+03 | 426.50%| unknown
  6.1s|     1 |     0 |  2106 |     - |    18M |   0 |1861 | 130 | 176 |  75 | 17 |   3 |   0 | 1.052250e+03 | 5.523000e+03 | 424.88%| unknown
  6.1s|     1 |     0 |  2107 |     - |    18M |   0 |1861 | 130 | 176 |  75 | 17 |   3 |   0 | 1.053000e+03 | 5.523000e+03 | 424.50%| unknown
  6.3s|     1 |     0 |  2148 |     - |    19M |   0 |1861 | 130 | 178 |  77 | 18 |   3 |   0 | 1.053375e+03 | 5.523000e+03 | 424.31%| unknown
 time | node  | left  |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr|  dualbound   | primalbound  |  gap   | compl. 
  6.3s|     1 |     0 |  2149 |     - |    19M |   0 |1861 | 130 | 178 |  77 | 18 |   3 |   0 | 1.054000e+03 | 5.523000e+03 | 424.00%| unknown
  6.4s|     1 |     0 |  2210 |     - |    20M |   0 |1861 | 130 | 162 |  81 | 19 |   3 |   0 | 1.054167e+03 | 5.523000e+03 | 423.92%| unknown
  6.5s|     1 |     0 |  2211 |     - |    20M |   0 |1861 | 130 | 162 |  81 | 19 |   3 |   0 | 1.055000e+03 | 5.523000e+03 | 423.51%| unknown
  6.6s|     1 |     0 |  2269 |     - |    20M |   0 |1861 | 130 | 165 |  84 | 20 |   3 |   0 | 1.058111e+03 | 5.523000e+03 | 421.97%| unknown
  6.6s|     1 |     0 |  2270 |     - |    20M |   0 |1861 | 130 | 165 |  84 | 20 |   3 |   0 | 1.059000e+03 | 5.523000e+03 | 421.53%| unknown
  6.7s|     1 |     0 |  2276 |     - |    20M |   0 |1861 | 130 | 166 |  85 | 21 |   3 |   0 | 1.059000e+03 | 5.523000e+03 | 421.53%| unknown
  8.3s|     1 |     2 |  2700 |     - |    21M |   0 |1861 | 136 | 166 |  85 | 23 |   9 |  22 | 1.066655e+03 | 5.523000e+03 | 417.79%| unknown
*14.4s|    30 |    25 |  4452 |  75.0 |    LP  |   7 |1861 | 136 | 138 | 125 |  0 |   9 | 167 | 1.067000e+03 | 5.459000e+03 | 411.62%|   0.86%
 29.9s|   100 |    91 |  6915 |  46.9 |    23M |  17 |1861 | 147 | 145 | 288 |  2 |  20 | 654 | 1.067000e+03 | 5.459000e+03 | 411.62%|   1.46%
*33.4s|   131 |   100 |  7858 |  42.9 |strongbr|  18 |1861 | 153 | 144 | 349 |  1 |  26 | 788 | 1.067000e+03 | 1.530000e+03 |  43.39%|   1.53%
 42.5s|   200 |   155 |  9970 |  38.7 |    24M |  18 |1861 | 170 | 142 | 455 |  2 |  43 |1097 | 1.067000e+03 | 1.530000e+03 |  43.39%|   2.17%
 51.6s|   300 |   237 | 13159 |  36.4 |    26M |  18 |1861 | 224 | 139 | 640 |  2 |  97 |1277 | 1.067000e+03 | 1.530000e+03 |  43.39%|   2.33%
 57.4s|   400 |   309 | 15846 |  34.0 |    27M |  19 |1861 | 238 | 152 | 820 |  2 | 113 |1426 | 1.067000e+03 | 1.530000e+03 |  43.39%|   3.10%
 63.4s|   500 |   391 | 19168 |  33.9 |    29M |  24 |1861 | 319 | 145 | 926 |  2 | 195 |1560 | 1.067000e+03 | 1.530000e+03 |  43.39%|   3.22%
L68.4s|   584 |   111 | 22609 |  34.9 |    rins|  26 |1861 | 330 | 149 |1016 |  1 | 256 |1619 | 1.067000e+03 | 1.127000e+03 |   5.62%|  10.59%

I also used display display to get some idea about what the column headers in the display output mean.

cons is just the globally valid constraints in the problem

rows is number of LP rows in current node

cuts is total number of cuts applied to the LPs

sepa is number of separation rounds performed at the current node

So I have a a few questions about this. I assumed rows should be 0 when the problem starts but I am not sure why there at 126 rows at the beginning of the problem. I add LP rows using the following function:

SCIP_ROW *row;
SCIP_CALL(SCIPcreateEmptyRowConshdlr(scip, &row, conshdlr, "subtour_elimination", -SCIPinfinity(scip), tour.size(), FALSE, FALSE, TRUE));

Are cuts added by SCIP automatically?

How does SCIP add globally valid constraints to the constraints pool? Does it take from the rows or from the cuts or from both? Is there a way to add globally valid constraints directly from the constraint handler?

Morpheus
  • 3,285
  • 4
  • 27
  • 57

1 Answers1

1

The TSP example is one of the most popular examples that the SCIP team uses to highlight SCIP's constraint capabilities. You can find the mathematical model of this example in the slides of this introduction to SCIP, Section Constraint Integer Programming.

The LP relaxation initially consists of the so-called node-degree constraints, which require that each node is adjacent to exactly two edges in a solution. The subtour elimination constraint is present as a single constraint without row in the LP, but only adds actual linear rows to the LP relaxation if necessary.

Other general-purpose separators such as Gomory or CMIR cuts are active throughout the search. You can use display statistics and browse the "Separators" section to learn which cutting plane methods were enabled.

In order to inspect the initial LP relaxation, you may use the various writing possibilities that SCIP has to dump the current model into an LP file.

You can, for example, stop SCIP after the initial root LP relaxation (just press CTRL + C timely) and use

  • write lp tsp.lp for the LP relaxation
  • write mip tsp.lp for the MIP relaxation
  • write transproblem tsp.cip for the current transformed problem

The first two methods are restricted to the LP format, which is nicely readable. Only the last format, SCIP's own CIP format, will print the subtour-elimination constraints, as well. Rows/Cuts that were added to the current LP relaxation may not be part of the transformed problem.

tldr; choose wisely in which format you print the relaxation :)

Gregor
  • 1,333
  • 9
  • 16