MISOCP Example with Portfolio Optimization

Gurobi Live Barcelona

Pierre Bonami - Gurobi

Portfolio optimization

  • Model proposed by Markowitz in 1952
  • Foundation of modern portfolio optimization

\[ \begin{aligned} & \max \mu^T x - \gamma \frac{x^T \Sigma x}{2} \\ & \text{s.t.}\\ & \sum_{i=1}^n x_i = 1\\ & x \ge 0 \end{aligned} \]

  • \(\mu\): vector of expected returns, \(\Sigma\): return covariance matrix
  • \(x\) represents the fraction of wealth invested in each asset
  • \(\gamma \geq 0\) is the risk aversion coefficient (fixed parameter)

Robust portfolio optimization with cardinality constraint

The basic problem has many variants used in practice and is one of the main applications for MISOCP.

Here we use in particular an instance constructed by Vielma (2008) with:

  • A cardinality constraint on the number of assets that can be held in the portfolio
  • A second order cone constraint to mitigate errors in estimation of variance.

Statistics of the model

(note: formulation is slightly different and objective is put in constraints)

import gurobipy as gp
model = 'models/robust_50_1.cbf.mps.bz2'
m = gp.read(model)
m.printStats()
Read MPS format model from file models/robust_50_1.cbf.mps.bz2
Reading time = 0.06 seconds
UNKNOWN: 365 rows, 311 columns, 5668 nonzeros

Statistics for model UNKNOWN:
  Linear constraint matrix    : 365 Constrs, 311 Vars, 5668 NZs
  Variable types              : 260 Continuous,
51 Integer
  Quadratic constraints       : 2 Constrs, 104 NZs
  Matrix coefficient range    : [ 7.93393e-06, 1.19315 ]
  Objective coefficient range : [ 1, 1 ]
  Variable bound range        : [ 0, 0 ]
  RHS coefficient range       : [ 0.2, 11 ]

Solve the model with QCP branch-and-bound

Set MIQCPMethod to 0 and optimize

m = gp.read(model)
m.params.MIQCPMethod = 0
m.optimize()
Read MPS format model from file models/robust_50_1.cbf.mps.bz2
Reading time = 0.03 seconds
UNKNOWN: 365 rows, 311 columns, 5668 nonzeros
Set parameter MIQCPMethod to value 0
Gurobi Optimizer version 11.0.0 build v11.0.0beta2 (mac64[x86] - macOS 13.6 22G120)

CPU model: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads

Optimize a model with 365 rows, 311 columns and 5668 nonzeros
Model fingerprint: 0x97dee3ae
Model has 2 quadratic constraints
Variable types: 260 continuous, 51 integer (0 binary)
Coefficient statistics:
  Matrix range     [8e-06, 1e+00]
  QMatrix range    [1e+00, 1e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [0e+00, 0e+00]
  RHS range        [2e-01, 1e+01]
Presolve removed 211 rows and 108 columns
Presolve time: 0.02s
Presolved: 156 rows, 303 columns, 5447 nonzeros
Presolved model has 100 quadratic constraint(s)
Variable types: 252 continuous, 51 integer (51 binary)
Root relaxation presolve removed 51 rows and 51 columns
Root relaxation presolve time: 0.03s
Root relaxation presolved: 484 rows, 452 columns, 6024 nonzeros
Root relaxation presolved model has 100 second-order cone constraints
Root barrier log...

Ordering time: 0.00s

Barrier statistics:
 AA' NZ     : 1.132e+04
 Factor NZ  : 1.700e+04 (roughly 1 MB of memory)
 Factor Ops : 1.523e+06 (less than 1 second per iteration)
 Threads    : 4

                  Objective                Residual
Iter       Primal          Dual         Primal    Dual     Compl     Time
   0  -8.14250076e+00 -2.35798354e+01  3.97e+02 1.38e-01  7.21e-01     0s
   1  -5.02961303e-01 -2.00521636e+01  1.65e+02 4.16e-05  2.81e-01     0s
   2  -3.52687244e-02 -8.78839737e+00  5.94e+00 4.58e-11  1.92e-02     0s
   3  -5.09534423e-02 -1.49533942e+00  4.13e-01 4.16e-12  2.21e-03     0s
   4  -6.33437696e-02 -3.92751355e-01  4.98e-02 6.75e-13  4.48e-04     0s
   5  -7.49835377e-02 -1.75071373e-01  3.63e-03 1.84e-13  1.29e-04     0s
   6  -8.19839145e-02 -1.22785145e-01  6.12e-04 7.35e-14  5.21e-05     0s
   7  -8.50406435e-02 -8.91071375e-02  7.18e-05 4.77e-15  5.20e-06     0s
   8  -8.58100110e-02 -8.60277556e-02  7.90e-11 1.58e-15  2.77e-07     0s
   9  -8.58566172e-02 -8.58659752e-02  3.07e-11 2.80e-14  1.19e-08     0s
  10  -8.58618793e-02 -8.58624582e-02  2.84e-09 4.91e-13  7.37e-10     0s

Barrier solved model in 10 iterations and 0.07 seconds (0.03 work units)
Optimal objective -8.58618793e-02


Root relaxation: objective -8.586188e-02, 0 iterations, 0.04 seconds (0.01 work units)

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

     0     0   -0.08586    0   13          -   -0.08586      -     -    0s
     0     0   -0.08586    0   51          -   -0.08586      -     -    0s
     0     0   -0.08586    0   51          -   -0.08586      -     -    0s
     0     0   -0.08586    0   51          -   -0.08586      -     -    0s
     0     2   -0.08586    0   51          -   -0.08586      -     -    0s
H  194   202                       0.0000000   -0.08586      -   0.0    1s
H  204   200                      -0.0573676   -0.08586  49.7%   0.0    1s
H  242   221                      -0.0835976   -0.08586  2.71%   0.0    1s
H  288   192                      -0.0836875   -0.08586  2.60%   0.0    1s
H  289   192                      -0.0854908   -0.08586  0.43%   0.0    1s
H  290   192                      -0.0854909   -0.08586  0.43%   0.0    1s
*  316   173              14      -0.0854910   -0.08586  0.43%   0.0    1s
H  359   162                      -0.0856168   -0.08586  0.29%   0.0    1s
*  390   137              14      -0.0856169   -0.08586  0.29%   0.0    2s
*  447   127              18      -0.0856170   -0.08586  0.29%   0.0    2s
*  478   127              15      -0.0856173   -0.08586  0.29%   0.0    2s
*  482   127              34      -0.0856889   -0.08586  0.20%   0.0    2s
*  506   107              35      -0.0856930   -0.08586  0.20%   0.0    2s
*  511   107              35      -0.0856950   -0.08586  0.19%   0.0    2s

Cutting planes:
  MIR: 4
  Flow cover: 4

Explored 618 nodes (0 simplex iterations) in 2.47 seconds (3.55 work units)
Thread count was 8 (of 8 available processors)

Solution count 10: -0.085695 -0.085693 -0.0856889 ... -0.0836875

Optimal solution found (tolerance 1.00e-04)
Warning: max constraint violation (1.1084e-06) exceeds tolerance
Best objective -8.569500013891e-02, best bound -8.569500013891e-02, gap 0.0000%

Remarks

  • Initial relaxation value is -0.08586
  • Not improved during the root
  • Solution has a violation slightly above the default 1.1084e-06

Solve the model with OA branch-and-cut

Set MIQCPMethod to 1 and optimize

m = gp.read(model)
m.params.MIQCPMethod = 1
m.optimize()
Read MPS format model from file models/robust_50_1.cbf.mps.bz2
Reading time = 0.03 seconds
UNKNOWN: 365 rows, 311 columns, 5668 nonzeros
Set parameter MIQCPMethod to value 1
Gurobi Optimizer version 11.0.0 build v11.0.0beta2 (mac64[x86] - macOS 13.6 22G120)

CPU model: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads

Optimize a model with 365 rows, 311 columns and 5668 nonzeros
Model fingerprint: 0x97dee3ae
Model has 2 quadratic constraints
Variable types: 260 continuous, 51 integer (0 binary)
Coefficient statistics:
  Matrix range     [8e-06, 1e+00]
  QMatrix range    [1e+00, 1e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [0e+00, 0e+00]
  RHS range        [2e-01, 1e+01]
Presolve removed 211 rows and 108 columns
Presolve time: 0.01s
Presolved: 156 rows, 303 columns, 5447 nonzeros
Presolved model has 100 quadratic constraint(s)
Variable types: 252 continuous, 51 integer (51 binary)

Root relaxation: objective -2.020047e-01, 108 iterations, 0.00 seconds (0.00 work units)

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

     0     0   -0.20200    0    -          -   -0.20200      -     -    0s
     0     0   -0.14578    0    -          -   -0.14578      -     -    0s
     0     0   -0.11167    0    2          -   -0.11167      -     -    0s
     0     0   -0.09372    0    3          -   -0.09372      -     -    0s
     0     0   -0.09372    0    3          -   -0.09372      -     -    0s
     0     0   -0.08864    0    4          -   -0.08864      -     -    0s
     0     0   -0.08863    0    4          -   -0.08863      -     -    0s
     0     0   -0.08812    0    5          -   -0.08812      -     -    0s
     0     0   -0.08808    0    6          -   -0.08808      -     -    0s
     0     0   -0.08784    0    5          -   -0.08784      -     -    0s
     0     0   -0.08784    0    5          -   -0.08784      -     -    0s
     0     0   -0.08783    0    5          -   -0.08783      -     -    0s
H    0     0                      -0.0828927   -0.08783  5.96%     -    0s
     0     0   -0.08783    0    5   -0.08289   -0.08783  5.96%     -    0s
H    0     0                      -0.0856874   -0.08783  2.50%     -    0s
     0     2   -0.08656    0    5   -0.08569   -0.08656  1.01%     -    0s
H    7     4                      -0.0856928   -0.08646  0.90%   9.9    0s
*    7     4               4      -0.0856928   -0.08646  0.90%  10.1    0s
H   29     0                      -0.0856947   -0.08579  0.11%  18.0    0s
*   29     0               8      -0.0856947   -0.08578  0.10%  18.8    0s
*   41     0               8      -0.0856983   -0.08571  0.01%  15.0    0s

Cutting planes:
  Implied bound: 1
  MIR: 3
  Flow cover: 1

Explored 42 nodes (1019 simplex iterations) in 0.49 seconds (0.38 work units)
Thread count was 8 (of 8 available processors)

Solution count 4: -0.0856983 -0.0856947 -0.0856928 -0.0828927 

Optimal solution found (tolerance 1.00e-04)
Warning: max constraint violation (1.8144e-06) exceeds tolerance
Best objective -8.569825332774e-02, best bound -8.570543461248e-02, gap 0.0084%

Remarks

  • Initial relaxation value is weaker -0.20200 (LP relaxation)
  • Improved during the root to be similar to QCP: -0.08656
  • Overall solution time, much faster: 0.44 seconds vs 2.33
  • Solution still has a violation slightly above the default 1.8144e-06
  • If we had left MIQCPMethod to default settings we would have the same for this model.

Try to get a more feasible solution

Decrease FeasibilityTol.

m = gp.read(model)
m.params.FeasibilityTol = 1e-7
m.optimize()
Read MPS format model from file models/robust_50_1.cbf.mps.bz2
Reading time = 0.03 seconds
UNKNOWN: 365 rows, 311 columns, 5668 nonzeros
Set parameter FeasibilityTol to value 1e-07
Gurobi Optimizer version 11.0.0 build v11.0.0beta2 (mac64[x86] - macOS 13.6 22G120)

CPU model: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads

Optimize a model with 365 rows, 311 columns and 5668 nonzeros
Model fingerprint: 0x97dee3ae
Model has 2 quadratic constraints
Variable types: 260 continuous, 51 integer (0 binary)
Coefficient statistics:
  Matrix range     [8e-06, 1e+00]
  QMatrix range    [1e+00, 1e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [0e+00, 0e+00]
  RHS range        [2e-01, 1e+01]
Presolve removed 211 rows and 108 columns
Presolve time: 0.01s
Presolved: 156 rows, 303 columns, 5447 nonzeros
Presolved model has 100 quadratic constraint(s)
Variable types: 252 continuous, 51 integer (51 binary)

Root relaxation: objective -2.020047e-01, 108 iterations, 0.00 seconds (0.00 work units)

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

     0     0   -0.20200    0    -          -   -0.20200      -     -    0s
     0     0   -0.14578    0    -          -   -0.14578      -     -    0s
     0     0   -0.11167    0    2          -   -0.11167      -     -    0s
     0     0   -0.09372    0    3          -   -0.09372      -     -    0s
     0     0   -0.09372    0    3          -   -0.09372      -     -    0s
     0     0   -0.08864    0    4          -   -0.08864      -     -    0s
     0     0   -0.08863    0    4          -   -0.08863      -     -    0s
     0     0   -0.08812    0    5          -   -0.08812      -     -    0s
     0     0   -0.08808    0    6          -   -0.08808      -     -    0s
     0     0   -0.08784    0    5          -   -0.08784      -     -    0s
     0     0   -0.08784    0    5          -   -0.08784      -     -    0s
     0     0   -0.08783    0    5          -   -0.08783      -     -    0s
H    0     0                      -0.0856874   -0.08783  2.50%     -    0s
     0     1   -0.08656    0    5   -0.08569   -0.08656  1.01%     -    0s
H    8     4                      -0.0856947   -0.08646  0.90%   7.6    0s
*    8     4               5      -0.0856947   -0.08646  0.90%   8.5    0s

Cutting planes:
  Implied bound: 1
  MIR: 3
  Flow cover: 1

Explored 35 nodes (1169 simplex iterations) in 0.42 seconds (0.38 work units)
Thread count was 8 (of 8 available processors)

Solution count 2: -0.0856947 -0.0856874 

Optimal solution found (tolerance 1.00e-04)
Best objective -8.569474489716e-02, best bound -8.570145202443e-02, gap 0.0078%

Remarks

  • That worked and it was not even really slower (it’s pure luck!)
  • We can get the maximal violation of the solution with the attribute MaxVio
m.MaxVio
3.206999110716424e-10

Disable cone disaggregation

This model has long quadratic constraints. Cone disaggregation is usually performed on these.

It’s good for performance but in this case it was the cause for the small violation.

We can disable the disaggregation with the parameter PreMIQCPForm

m = gp.read(model)
m.params.PreMIQCPForm = 1
m.optimize()
Read MPS format model from file models/robust_50_1.cbf.mps.bz2
Reading time = 0.03 seconds
UNKNOWN: 365 rows, 311 columns, 5668 nonzeros
Set parameter PreMIQCPForm to value 1
Gurobi Optimizer version 11.0.0 build v11.0.0beta2 (mac64[x86] - macOS 13.6 22G120)

CPU model: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads

Optimize a model with 365 rows, 311 columns and 5668 nonzeros
Model fingerprint: 0x97dee3ae
Model has 2 quadratic constraints
Variable types: 260 continuous, 51 integer (0 binary)
Coefficient statistics:
  Matrix range     [8e-06, 1e+00]
  QMatrix range    [1e+00, 1e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [0e+00, 0e+00]
  RHS range        [2e-01, 1e+01]
Presolve removed 211 rows and 108 columns
Presolve time: 0.01s
Presolved: 256 rows, 305 columns, 5549 nonzeros
Presolved model has 2 quadratic constraint(s)
Variable types: 254 continuous, 51 integer (51 binary)
Root relaxation presolve removed 151 rows and 151 columns
Root relaxation presolve time: 0.03s
Root relaxation presolved: 282 rows, 155 columns, 5425 nonzeros
Root relaxation presolved model has 2 second-order cone constraints
Root barrier log...

Ordering time: 0.00s

Barrier statistics:
 AA' NZ     : 2.205e+04
 Factor NZ  : 2.678e+04
 Factor Ops : 3.145e+06 (less than 1 second per iteration)
 Threads    : 4

                  Objective                Residual
Iter       Primal          Dual         Primal    Dual     Compl     Time
   0  -2.15743096e+00 -1.10900378e+01  9.98e+01 5.75e-01  8.29e-01     0s
   1  -3.81184924e-01 -1.43739011e+01  1.78e+01 6.33e-07  1.62e-01     0s
   2  -9.11593201e-02 -5.38835630e+00  1.77e+00 6.97e-13  2.26e-02     0s
   3  -3.65086440e-02 -1.05640189e+00  1.95e-06 4.10e-14  2.64e-03     0s
   4  -5.65249132e-02 -2.96792390e-01  1.04e-07 8.24e-15  6.22e-04     0s
   5  -7.01928841e-02 -1.26961320e-01  1.14e-13 1.39e-15  1.47e-04     0s
   6  -8.44475308e-02 -8.93648693e-02  1.24e-14 2.22e-16  1.27e-05     0s
   7  -8.56738257e-02 -8.64257570e-02  1.33e-14 2.22e-16  1.95e-06     0s
   8  -8.58587744e-02 -8.58809223e-02  2.74e-14 2.22e-16  5.74e-08     0s
   9  -8.58621945e-02 -8.58632060e-02  5.27e-13 4.00e-15  2.62e-09     0s

Barrier solved model in 9 iterations and 0.06 seconds (0.03 work units)
Optimal objective -8.58621945e-02


Root relaxation: objective -8.586219e-02, 0 iterations, 0.03 seconds (0.01 work units)

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

     0     0   -0.08586    0   13          -   -0.08586      -     -    0s
     0     0   -0.08586    0   51          -   -0.08586      -     -    0s
     0     0   -0.08586    0   51          -   -0.08586      -     -    0s
H    0     0                       0.0000000   -0.08586      -     -    0s
H    0     0                      -0.0458804   -0.08586  87.1%     -    0s
     0     2   -0.08586    0   50   -0.04588   -0.08586  87.1%     -    0s
H   28    32                      -0.0458804   -0.08586  87.1%   0.0    0s
H   29    32                      -0.0501315   -0.08586  71.3%   0.0    0s
H   53    56                      -0.0520809   -0.08586  64.9%   0.0    0s
H   59    64                      -0.0536589   -0.08586  60.0%   0.0    0s
H   59    64                      -0.0536589   -0.08586  60.0%   0.0    0s
H   60    64                      -0.0599932   -0.08586  43.1%   0.0    0s
H   61    64                      -0.0692581   -0.08586  24.0%   0.0    0s
H   69    72                      -0.0711611   -0.08586  20.7%   0.0    1s
*   78    74              13      -0.0770387   -0.08586  11.5%   0.0    1s
H   93    78                      -0.0770387   -0.08586  11.5%   0.0    1s
*  216   204              49      -0.0802887   -0.08586  6.94%   0.0    1s
*  217   204              49      -0.0808685   -0.08586  6.17%   0.0    1s
*  243   204              49      -0.0808687   -0.08586  6.17%   0.0    1s
*  245   204              49      -0.0809975   -0.08586  6.01%   0.0    1s
*  246   204              49      -0.0810161   -0.08586  5.98%   0.0    1s
H  385   226                      -0.0811462   -0.08586  5.81%   0.0    2s
H  450   216                      -0.0839754   -0.08586  2.25%   0.0    2s
*  452   216              49      -0.0839755   -0.08586  2.25%   0.0    2s
H  636    47                      -0.0856947   -0.08586  0.19%   0.0    3s
   705    42   -0.08586   20   40   -0.08569   -0.08586  0.19%   0.0    5s
  2316   591   -0.08578   37   23   -0.08569   -0.08586  0.19%   0.0   10s
  3934   407     cutoff   36        -0.08569   -0.08578  0.10%   0.0   15s

Cutting planes:
  Implied bound: 4
  MIR: 7
  Flow cover: 2

Explored 4817 nodes (0 simplex iterations) in 17.60 seconds (19.80 work units)
Thread count was 8 (of 8 available processors)

Solution count 10: -0.0856947 -0.0839755 -0.0811462 ... -0.0770387

Optimal solution found (tolerance 1.00e-04)
Best objective -8.569474447765e-02, best bound -8.569476214813e-02, gap 0.0000%

Remarks

  • This was considerably slower!
  • Root bound is actually good but it takes a lot of nodes to close the small gap
  • Violation looks OK
m.MaxVio
2.0794477251229182e-13

Disable cone disaggregation again

We had set PreMIQCPForm to 1 that still reformulate quadratic constraints as second-order-cone.

Gurobi actually chose to use QCP branch-and-bound.

We can try to set it to 0.

m = gp.read(model)
m.params.PreMIQCPForm = 0
m.optimize()
Read MPS format model from file models/robust_50_1.cbf.mps.bz2
Reading time = 0.04 seconds
UNKNOWN: 365 rows, 311 columns, 5668 nonzeros
Set parameter PreMIQCPForm to value 0
Gurobi Optimizer version 11.0.0 build v11.0.0beta2 (mac64[x86] - macOS 13.6 22G120)

CPU model: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads

Optimize a model with 365 rows, 311 columns and 5668 nonzeros
Model fingerprint: 0x97dee3ae
Model has 2 quadratic constraints
Variable types: 260 continuous, 51 integer (0 binary)
Coefficient statistics:
  Matrix range     [8e-06, 1e+00]
  QMatrix range    [1e+00, 1e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [0e+00, 0e+00]
  RHS range        [2e-01, 1e+01]
Presolve removed 211 rows and 108 columns
Presolve time: 0.02s
Presolved: 154 rows, 203 columns, 5346 nonzeros
Presolved model has 2 quadratic constraint(s)
Variable types: 152 continuous, 51 integer (51 binary)

Root relaxation: objective -2.020047e-01, 108 iterations, 0.00 seconds (0.00 work units)

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

     0     0   -0.20200    0    -          -   -0.20200      -     -    0s
     0     0   -0.13924    0    -          -   -0.13924      -     -    0s
     0     0   -0.12183    0    -          -   -0.12183      -     -    0s
     0     0   -0.11835    0    -          -   -0.11835      -     -    0s
     0     0   -0.11289    0    -          -   -0.11289      -     -    0s
     0     0   -0.11085    0    2          -   -0.11085      -     -    0s
     0     0   -0.09449    0    2          -   -0.09449      -     -    0s
     0     0   -0.09449    0    -          -   -0.09449      -     -    0s
     0     0   -0.09449    0    2          -   -0.09449      -     -    0s
     0     0   -0.09449    0    -          -   -0.09449      -     -    0s
     0     0   -0.09449    0    2          -   -0.09449      -     -    0s
     0     0   -0.09424    0    3          -   -0.09424      -     -    0s
     0     0   -0.09424    0    3          -   -0.09424      -     -    0s
     0     0   -0.09383    0    3          -   -0.09383      -     -    0s
     0     0   -0.09357    0    3          -   -0.09357      -     -    0s
     0     0   -0.09356    0    3          -   -0.09356      -     -    0s
     0     0   -0.09269    0    3          -   -0.09269      -     -    0s
     0     0   -0.09231    0    3          -   -0.09231      -     -    0s
     0     0   -0.09193    0    2          -   -0.09193      -     -    0s
     0     0   -0.09172    0    3          -   -0.09172      -     -    0s
     0     0   -0.09160    0    4          -   -0.09160      -     -    0s
     0     0   -0.09124    0    2          -   -0.09124      -     -    0s
     0     0   -0.09116    0    3          -   -0.09116      -     -    0s
     0     0   -0.09100    0    3          -   -0.09100      -     -    0s
     0     0   -0.09075    0    3          -   -0.09075      -     -    0s
     0     0   -0.09069    0    4          -   -0.09069      -     -    0s
     0     0   -0.09058    0    4          -   -0.09058      -     -    0s
     0     0   -0.09033    0    3          -   -0.09033      -     -    0s
     0     0   -0.08986    0    2          -   -0.08986      -     -    0s
     0     0   -0.08966    0    2          -   -0.08966      -     -    0s
     0     0   -0.08939    0    3          -   -0.08939      -     -    0s
     0     0   -0.08909    0    3          -   -0.08909      -     -    0s
     0     0   -0.08906    0    2          -   -0.08906      -     -    0s
     0     0   -0.08906    0    3          -   -0.08906      -     -    0s
     0     0   -0.08881    0    3          -   -0.08881      -     -    0s
     0     0   -0.08866    0    3          -   -0.08866      -     -    0s
     0     0   -0.08865    0    3          -   -0.08865      -     -    0s
     0     0   -0.08865    0    3          -   -0.08865      -     -    0s
H    0     0                      -0.0856928   -0.08865  3.45%     -    0s
     0     2   -0.08858    0    3   -0.08569   -0.08858  3.37%     -    0s
H  132    44                      -0.0856947   -0.08783  2.49%   5.6    0s
*  132    44              11      -0.0856947   -0.08783  2.49%   5.6    0s
*  555     1              10      -0.0856981   -0.08570  0.01%   4.8    0s

Cutting planes:
  Implied bound: 3

Explored 557 nodes (2976 simplex iterations) in 0.95 seconds (0.95 work units)
Thread count was 8 (of 8 available processors)

Solution count 2: -0.0856981 -0.0856947 

Optimal solution found (tolerance 1.00e-04)
Best objective -8.569808216221e-02, best bound -8.570418404331e-02, gap 0.0071%

Remarks

  • Now OA was used
  • It’s as fast as defaults without the violations
  • But it’s a small model and it is misleading. On larger models this would usually be much slower.