Mixed-integer nonlinear programming

Knitro provides tools for solving optimization models (both linear and nonlinear) with binary or integer variables. The Knitro mixed-integer programming (MIP) code offers two algorithms for mixed-integer nonlinear programming (MINLP):

  • A nonlinear branch-and-bound (NLPBB) algorithm

  • A mixed-integer sequential quadratic programming (MISQP) algorithm

The desired algorithm can be selected using the mip_method option.

The MISQP algorithm is designed for problems with expensive function evaluations, and can handle non-relaxable integer variables. In the other cases, the NLPBB algorithm should be preferred.

The Knitro MINLP code is designed for convex mixed-integer programming and is only a heuristic for non-convex problems. The MINLP code also handles mixed-integer linear programs (MILP), with specializations applied for this subclass of models.

Setting variables as binary/integer

AMPL example

Using MINLP features in AMPL is very simple: one only has to declare variables as integer in the AMPL model. In our toy example, from Getting started with AMPL let us modify the declaration of variable x as follows:

var x{j in 1..3} >= 0 integer;

and then run the example again. The Knitro log now mentions 3 integer variables, and displays additional statistics related to the MIP solve.

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
The problem is identified as a MIQCQP.
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  quadratic
Number of variables:                                  3
    bounded below only:                               3
    bounded above only:                               0
    bounded below and above:                          0
    fixed:                                            0
    free:                                             0
Number of binary variables:                           0
Number of integer variables:                          3
Number of constraints:                                2
    linear equalities:                                1
    quadratic equalities:                             0
    gen. nonlinear equalities:                        0
    linear one-sided inequalities:                    0
    quadratic one-sided inequalities:                 1
    gen. nonlinear one-sided inequalities:            0
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                       6
Number of nonzeros in Hessian:                        5

Knitro detected 0 GUB constraints
Knitro derived 0 knapsack covers after examining 0 constraints
       Nodes        Best solution      Bound       Gap
   Expl  |  Unexpl      value
      1       0      936.000 LEAF      936.000      0.00%

EXIT: Optimal solution found (assuming convexity).

Final Statistics for MIP
------------------------
Final objective value               =  9.36000000000000e+02
Final bound value                   =  9.36000000000000e+02
Final optimality gap (abs / rel)    =  0.00e+00 / 0.00e+00 (0.00%)
# of nodes processed                =  1
# of subproblems processed          =  1 (0.002s)
# of strong branching evaluations   =  0 (0.000s)
Total program time (secs)           =  0.00366 (0.004 CPU time)
Time spent in evaluations (secs)    =  0.00000

Cuts statistics (computed / added)
----------------------------------
Knapsack cuts                       =  0 / 0
Mixed-Integer Rounding cuts         =  0 / 0

Heuristics statistics (calls / sucesses / time)
-----------------------------------------------
Feasibility pump                    =  0 / 0 / 0.000
Rounding heuristic                  =  0 / 0 / 0.000
MPEC heuristic                      =  0 / 0 / 0.000

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 936; optimality gap 0
1 nodes; 1 subproblem solves

Note that this example is not particularly interesting since the two solutions we know for the continuous version of this problem are already integer “by chance”. As a consequence, the MINLP solve returns the same solution as the continuous solve. However, if for instance you change the first constraint to:

s.t. c1: 8*x[1] + 14*x[2] + 7*x[3] - 50 = 0;

instead of:

s.t. c1: 8*x[1] + 14*x[2] + 7*x[3] - 56 = 0;

you will observe that the integer solution differs from the continuous one.

MATLAB example

To use the MINLP features in MATLAB, one must use the function knitro_minlp (knitro_minlp), for models with nonlinear features or knitro_milp (knitro_milp) for mixed-integer linear programs. The function signature for knitro_minlp is very similar to knitro_nlp (and similarly for knitro_milp compared with knitro_lp), but with the additional xType array to specify which variables are integer or binary.

The array xType sets the variable types and must be the same length as x0 if it is used. Continuous, integer, and binary variables are set with 0, 1, and 2, respectively. Passing an empty array, [], is equivalent to an array of all zeros.

Modifying the toy example in MATLAB to use integer variables can be done as follows:

xType = [2;2;2];

%modify the solver call
x = knitro_minlp(obj, x0, xType, A, b, Aeq, beq, lb, ub, nlcon);

See Knitro / MATLAB reference for more details.

C example

As with AMPL, defining a MIP problem only requires declaring integer variables via the API function KN_set_var_types() (by default, variables are assumed to be continuous).

In order to turn our C toy example into a MINLP problem, it thus suffices to add

/* in the declarations */
int i;

/* mark all variables as integer */
for (i=0; i<n; i++) {
    error = KN_set_var_type (kc, i, KN_VARTYPE_INTEGER);
}

The Knitro log will look similar to what we observed in the AMPL example above. Again, this example is quite unusual in the sense that the continuous solution is already integer, which of course is not the case in general.

Object-oriented C++ example

A MIP problem is defined and solved via the object-oriented interface by adding additional problem information in the problem class.

In the following, we will define how to turn the toy example into a MINLP problem. The ProblemQCQP1 class has to be extended with new definitions:

setVarTypes({ {0, 1, 2}, {KN_VARTYPE_INTEGER, KN_VARTYPE_INTEGER, KN_VARTYPE_INTEGER} });

This is the sparse method of setting variable types. It sets variables 0, 1 and 2 to be integer. As there are only 3 variables, this can be done in a dense fashion:

setVarTypes({ {KN_VARTYPE_INTEGER, KN_VARTYPE_INTEGER, KN_VARTYPE_INTEGER} });

The Knitro log will look similar to what we observed in the AMPL example above. Again, this example is quite unusual in the sense that the continuous solution is already integer, which of course is not the case in general.

Nonlinear branch-and-bound algorithm

Overview

The NLPBB algorithm is a standard branch-and-bound algorithm for nonlinear optimization. This method involves solving a relaxed, continuous nonlinear optimization subproblem at every node of the branch-and-bounds tree. This method is generally the preferred method. It is primarily designed for convex models, and in this case the optimality gap measure can be trusted. It can also be applied to non-convex models, and often works well on these models. However, it may sometimes get stuck at integer feasible points that are not globally optimal solutions when the model is non-convex. In addition, the optimality gap measure may not be accurate since this measure is based on the assumption that the nonlinear optimization subproblems are always solved to global optimality (which may not be the case when the model is non-convex).

Heuristics

In a raw implementation of an NLPBB algorithm, feasible solutions are only found at the end of the algorithm. This behavior is not desirable in practice. To overcome this, heuristics are called regularly during the search. The goal of heuristics is to find good feasible solutions. Knitro implements various heuristics in its NLPBB:

  • Rounding heuristics: Rounding heuristics round the fractional solution of the node subproblem relaxations and solve a new NLP subproblem with integer variables fixed. If a feasible solution to this NLP is found, then it is a feasible solution for the original MINLP. Corresponding option: mip_rounding.

  • An MPEC heuristic: The MPEC heuristic is available for problems with only binary variables and not when a problem has more general integer variables. This heuristic solves an NLP problem where the integrality constraints are handled through complementarity constraints. Corresponding option: mip_heuristic_mpec.

  • A feasibility pump heuristic: The feasibility pump heuristic alternatively solves two NLP subproblems. In this first one, integer variables are fixed at integer values. If this subproblem is infeasible, the second NLP looks for a feasible point (except for the integrality constraints) as close as possible to the integer infeasible point. The solution of this second NLP subproblem is then rounded to fix the values of the integer variables for the first NLP subproblem. Corresponding option: mip_heuristic_feaspump.

  • A local search heuristic: This heuristic iteratively performs small changes to an initial possibly infeasible point to find a feasible or improving solution. Corresponding option: mip_heuristic_localsearch.

  • Diving heuristics: Diving heuristics perform a partial depth-first search exploration of the branch-and-bound tree. Dedicated branching rules aimed at increasing the chances of finding a good feasible solution are used, instead of the regular branching rules aimed at minimizing the number of nodes explored. Corresponding option: mip_heuristic_diving.

  • Large neighborhood search heuristics: Large neighborhood search heuristics fix a large fraction of the binary and integer variables and then solve the resulting MINLP subproblem. Corresponding option: mip_heuristic_lns.

  • An MISQP heuristic: the MISQP heuristic runs the MISQP algorithm on the problem. Note that it is only relevant for a general MINLP, and not for an MIQCQP, since in this case, the subproblem is the same as the original problem. Corresponding option: mip_heuristic_misqp.

The general behavior of heuristics in Knitro can be controlled with the mip_heuristic_strategy option.

In the log, feasible solutions are displayed in the “Best solution value” column. The string next to the solution value indicates how the solution has been found. Additional statistics are available at the end of the log in the “Heuristics statistics” section.

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

No start point provided -- Knitro computing one.

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 0.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Maximize
Objective type:  linear
Number of variables:                                568
    bounded below only:                             489
    bounded above only:                               0
    bounded below and above:                         79
    fixed:                                            0
    free:                                             0
Number of binary variables:                          72
Number of integer variables:                          0
Number of constraints:                              837
    linear equalities:                              388
    quadratic equalities:                             0
    gen. nonlinear equalities:                        0
    linear one-sided inequalities:                  421
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:           28
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                    1892
Number of nonzeros in Hessian:                      108

Knitro using Branch and Bound method with 8 threads.

Root node relaxation
--------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
    1        1442.06          23.0795           7.55016       0.103
    2        1225.73          16.9986           5.82697       0.104
    3        1107.15          14.8133           3.93535       0.106
    4        875.113          9.44474           2.34635       0.107
    5        738.924          6.44912           4.39287       0.109
    6        393.470          2.64552           2.56055       0.110
    7        143.641         0.294228           3.20966       0.120
    8        197.342      9.07371e-02           1.00048       0.123
    9        248.700      3.62049e-02          0.282786       0.124
   10        316.813      2.37936e-02          0.137491       0.126
   11        336.444      8.58772e-03       4.87589e-02       0.127
   12        346.296      9.93823e-04       6.01516e-02       0.129
   13        349.494      4.07988e-04       8.04447e-02       0.132
   14        351.512      8.69325e-05       2.25036e-02       0.133
   15        352.257      2.30812e-05          0.332156       0.136
   16        352.308      1.03624e-05           2.37838       0.137
   17        352.310      1.04646e-05           4.99722       0.139
   18        352.310      8.07938e-07           1.72924       0.141
   19        352.310      1.52211e-07          0.112212       0.142
   20        352.310      6.66994e-10       2.54080e-02       0.150
   21        352.310      7.78636e-11       1.51057e-02       0.153
   22        352.310      1.77726e-12       1.59590e-08       0.155
   23        352.310      1.77726e-12       1.59590e-08       0.156
   24        352.310      1.77726e-12       1.59590e-08       0.159

Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
      1       2                        352.310                0.162
      3       4      256.097   FP      344.264     34.43%     0.334
     74      57      317.494 FCRD      328.320      3.41%     1.368
    145      46      325.555 FCRD      326.926      0.42%     1.498
    165      32      325.555           325.555     -0.00%     1.509

EXIT: Optimal solution found (assuming convexity).

HINT: The problem may be a non-convex mixed-integer problem.  Set
      mip_multistart=1 to enable a mixed-integer multistart heuristic,
      which may improve the chances of finding the global solution.

Final Statistics for MIP
------------------------
Final objective value               =  3.25554562174787e+02
Final bound value                   =  3.25554550653924e+02
Final optimality gap (abs / rel)    =  -1.15e-05 / -3.54e-08 (-0.00%)
# of root cutting plane rounds      =  0
# of restarts                       =  0
# of nodes processed                =  165 (4.342s)
# of strong branching evaluations   =  0 (0.000s)
# of function evaluations           =  3191 (0.038s)
# of gradient evaluations           =  3151 (0.041s)
# of hessian evaluations            =  2897 (0.113s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  129 (4.799s)
Total program time (secs)           =  1.56151 (5.031 CPU time)
Time spent in evaluations (secs)    =  0.19222

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  0 / 0
Mixed-integer rounding cuts         =  0 / 0
Flow-cover cuts                     =  0 / 0
Probing cuts                        =  0 / 0

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  1 / 1 / 0.082s
Rounding heuristic                  =  14 / 13 / 0.152s
MPEC heuristic                      =  1 / 1 / 0.252s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 325.55456217478707; optimality gap -1.15e-05
165 nodes; 129 subproblem solves

In this example, a first feasible solution of value 256.097 is found by the feasibility pump heuristic (FP). Then, two better feasible solutions are found by rounding heuristics (FCRD), the latter being optimal.

Cuts

Cuts are valid constraints that are not in the original problem, but that the solver manages to infer. These constraints are valid for the original problem, but not necessarily for its relaxation. Thus, they might improve the value of the relaxation and lead to smaller branch-and-bound trees.

The solver looks for cuts during node processing after the relaxation has been solved. If it finds cuts violated by the solution of the relaxation, it adds them to the model and re-computes its relaxation.

Knitro includes several strategies to infer cuts that can be controlled with the corresponding options:

The general behavior of cuts in Knitro can be controlled with the mip_cut_strategy option.

The logs contain a dedicated section for the root node cutting plane algorithm that shows the cut loop at the root node. Additional statistics are available at the end of the log in the “Cuts statistics” section.

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

No start point provided -- Knitro computing one.

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
The problem is identified as a convex MIQP.
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 1.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  quadratic
Number of variables:                                960
    bounded below only:                               0
    bounded above only:                               0
    bounded below and above:                        720
    fixed:                                            0
    free:                                           240
Number of binary variables:                         720
Number of integer variables:                          0
Number of constraints:                             5329
    linear equalities:                               24
    quadratic equalities:                             0
    gen. nonlinear equalities:                        0
    linear one-sided inequalities:                 5305
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:            0
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                   11444
Number of nonzeros in Hessian:                      240

Knitro using Branch and Bound method with 8 threads.

Root node relaxation
--------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
    1        195790.          1044.38           43.2671       0.101
    2        195148.          1044.36           25.0342       0.109
    3        748387.          2635.41           25.0342       0.114
    4        658502.          53.7644           43.2671       0.120
    5        656226.         0.690997           43.2671       0.135
    6        652982.         0.497964           43.2671       0.142
    7        637536.         0.104836           43.2671       0.146
    8        634823.      6.18016e-02           43.2671       0.153
    9        630366.      2.21319e-03           28.2639       0.164
   10        627435.      2.50206e-05           5.80827       0.169
   11        621811.      2.16121e-05           3.48621       0.181
   12        589708.      1.63046e-06           1.92004       0.196
   13        576183.      1.68210e-07           1.05835       0.203
   14        574231.      1.02064e-07           1.00229       0.214
   15        570516.      1.22875e-08          0.274724       0.228
   16        569618.      7.81793e-08       5.35004e-02       0.235
   17        569370.      4.93326e-08       1.08262e-02       0.241
   18        569306.      1.54418e-08       2.51111e-03       0.246
   19        569299.      1.11281e-09       9.15305e-05       0.250
   20        569299.      5.38114e-10       6.99464e-05       0.264
   21        569299.      5.38114e-10       6.99464e-05       0.270

Root node cutting planes
------------------------

 Iter     Cuts      Best solution   Best bound      Gap       Time
                        value         value                  (secs)
 ----     ----      -------------   ----------      ---      ------
    0        0                         569299.                0.317
    0       88                         569299.                0.462
    0       88                         576564.                0.535
    1       88                         576564.                0.641
    1       88                         576719.                0.792
    1       88                         576719.                0.886
    2      100       581223.   FP      576719.      0.77%     0.971
    2      100       581223.           576719.      0.77%     1.026
    2      100       581223.           576719.      0.77%     1.059

Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
      1       2      581223.           576759.      0.77%     1.068
      1       2      579254.   FP      577007.      0.39%     1.346
    109     106      578234. FCRD      577982.      0.04%     7.661
    126     123      578177. FCRD      578136.      0.01%     7.940

EXIT: Optimal solution found.

Final Statistics for MIP
------------------------
Final objective value               =  5.78176639004716e+05
Final bound value                   =  5.78135906593907e+05
Final optimality gap (abs / rel)    =  4.07e+01 / 7.04e-05 (0.01%)
# of root cutting plane rounds      =  3
# of restarts                       =  0
# of nodes processed                =  126 (21.191s)
# of strong branching evaluations   =  0 (0.000s)
# of function evaluations           =  0 (0.000s)
# of gradient evaluations           =  0 (0.000s)
# of hessian evaluations            =  0 (0.000s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  214 (22.872s)
Total program time (secs)           =  8.10463 (28.094 CPU time)
Time spent in evaluations (secs)    =  0.00000

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  242 / 214
Mixed-integer rounding cuts         =  489 / 269
Gomory cuts                         =  0 / 0
Flow-cover cuts                     =  128 / 25
Probing cuts                        =  148 / 50

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  2 / 2 / 0.504s
Rounding heuristic                  =  7 / 3 / 0.100s
MPEC heuristic                      =  2 / 1 / 1.170s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 578176.6390047162; optimality gap 40.7
126 nodes; 214 subproblem solves

In this example, three rounds of cutting planes at the root node improve the dual bound from 569299 to 576759.

Restart

Throughout the exploration of the tree, the solver gathers information about the problem. Having this information earlier could lead to better decisions that could make the branch-and-bound tree smaller. To overcome this, Knitro implements a restart mechanism. At some point, Knitro may decide to restart the exploration of the tree. The restart mechanism is enabled by default. It can be disabled with option mip_restart.

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

No start point provided -- Knitro computing one.

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
mip_maxtime_real:        3600
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 0.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  linear
Number of variables:                               3010
    bounded below only:                              10
    bounded above only:                               0
    bounded below and above:                       3000
    fixed:                                            0
    free:                                             0
Number of binary variables:                        1500
Number of integer variables:                          0
Number of constraints:                             1821
    linear equalities:                               10
    quadratic equalities:                             0
    gen. nonlinear equalities:                        0
    linear one-sided inequalities:                 1801
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:           10
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                   12010
Number of nonzeros in Hessian:                     3000

Knitro using Branch and Bound method with 8 threads.

Root node relaxation
--------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
    1        34061.5          34016.5           1.00000       0.056
    2        4618.89          4573.89           1.00000       0.063
    3        565.124          520.124           1.00000       0.069
    4        44.9919          3.37053       8.90075e-02       0.075
    5        44.9842          3.15208       7.05244e-02       0.082
    6        40.2277         0.692171       8.47165e-02       0.088
    7        34.1249         0.393888          0.105463       0.094
    8        23.1634         0.187067       8.88250e-02       0.101
    9        6.44146         0.331273       9.96163e-02       0.107
   10        4.84509          3.68111       3.75953e-02       0.113
   11        4.82270          3.18048       3.11531e-02       0.119
   12        4.72466          2.41894       1.52618e-02       0.126
   13        4.59011         0.655004       2.34789e-03       0.132
   14        4.49568         0.288989       1.26076e-03       0.138
   15        4.44470      5.40446e-02       2.86726e-04       0.145
   16        4.44300          5.89285       1.68812e-05       0.151
   17        4.44302          5.20723       6.88817e-04       0.157
   18        4.44314         0.574396       6.81981e-07       0.164
   19        4.44305         0.368235       7.90967e-07       0.170
   20        4.44301         0.112719       3.07706e-07       0.176
   21        4.44301      0.00000e+00       1.23866e-08       0.183
   22        4.44301      0.00000e+00       1.23866e-08       0.190
   23        4.44301      0.00000e+00       1.23866e-08       0.195
    1    0.00000e+00          7.52575       0.00000e+00       0.200
    2    0.00000e+00          7.52575       0.00000e+00       0.200
    3    0.00000e+00          7.52575       0.00000e+00       0.201
    4    0.00000e+00          7.52575       0.00000e+00       0.202

Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
      1       2                        4.44301                0.203
     15      16                        4.44301                3.286
    122     123                        4.44301               10.809
    283     284                        4.44794               19.249
    414     415      11.6508   FP      4.44794     61.82%    25.678
    449     450      11.6508           4.44822     61.82%    27.210
    601     602      11.6508           4.44845     61.82%    35.207
    770     771      11.6508           4.44846     61.82%    42.804
    930     931      11.6508           4.44894     61.81%    50.144
   1094    1095      11.6508           4.44894     61.81%    57.286
   1249    1250      11.6508           4.44894     61.81%    64.055
   1410    1411      11.6508           4.44894     61.81%    71.031
   1572    1573      11.6508           4.44894     61.81%    77.669
   1731    1732      11.6508           4.44894     61.81%    84.310
   1894    1895      11.6508           4.44894     61.81%    90.982
   2054    2055      11.6508           4.44894     61.81%    97.558
   2215    2216      11.6508           4.44894     61.81%   104.111
   2377    2378      11.6508           4.44894     61.81%   110.587
   2536    2537      11.6508           4.44894     61.81%   117.090
   2697    2698      11.6508           4.44894     61.81%   123.397
   2856    2857      11.6508           4.44894     61.81%   129.571
   3017    3018      11.6508           4.44894     61.81%   135.588
   3177    3178      11.6508           4.44894     61.81%   141.609
   3337    3338      11.6508           4.44894     61.81%   147.451
   3497    3498      11.6508           4.44894     61.81%   153.169
   3657    3658      11.6508           4.44894     61.81%   159.112
   3817    3818      11.6508           4.44894     61.81%   164.826
   3977    3978      11.6508           4.44894     61.81%   170.670
   4137    4138      11.6508           4.44894     61.81%   176.398
   4297    4298      11.6508           4.44894     61.81%   181.984
   4457    4458      11.6508           4.44894     61.81%   187.600
   4617    4618      11.6508           4.44894     61.81%   193.230
   4777    4778      11.6508           4.44894     61.81%   198.934
   4937    4938      11.6508           4.44894     61.81%   204.594
   5097    5098      11.6508           4.44894     61.81%   210.314
   5257    5258      11.6508           4.44894     61.81%   215.912
   5417    5418      11.6508           4.44894     61.81%   221.555
   5577    5578      11.6508           4.44894     61.81%   226.966
   5737    5738      11.6508           4.44894     61.81%   232.583
   5897    5898      11.6508           4.44894     61.81%   238.037
   6057    6059      11.6508           4.44894     61.81%   243.025
   6217    5899      11.6508           4.44894     61.81%   243.032
   6377    5739      11.6508           4.44894     61.81%   243.038
   6537    5579      11.6508           4.44894     61.81%   243.043
   6697    5419      11.6508           4.44894     61.81%   243.047
   6857    5259      11.6508           4.44894     61.81%   243.052
   7017    5099      11.6508           4.44894     61.81%   243.056
   7177    4939      11.6508           4.44894     61.81%   243.060
   7337    4779      11.6508           4.44894     61.81%   243.064
   7497    4619      11.6508           4.44894     61.81%   243.068
   7657    4459      11.6508           4.44894     61.81%   243.072
   7817    4299      11.6508           4.44894     61.81%   243.076
   7977    4139      11.6508           4.44894     61.81%   243.080
   8137    3979      11.6508           4.44894     61.81%   243.085
   8297    3819      11.6508           4.44894     61.81%   243.089
   8457    3659      11.6508           4.44894     61.81%   243.093
   8617    3499      11.6508           4.44894     61.81%   243.098
   8777    3339      11.6508           4.44894     61.81%   243.102
   8937    3179      11.6508           4.44894     61.81%   243.106
   9097    3019      11.6508           4.44894     61.81%   243.111
   9257    2859      11.6508           4.44894     61.81%   243.115
   9417    2699      11.6508           4.44894     61.81%   243.120
   9577    2539      11.6508           4.44894     61.81%   243.125
   9737    2379      11.6508           4.44894     61.81%   243.130
   9897    2219      11.6508           4.44894     61.81%   243.135
  10057    2059      11.6508           4.44894     61.81%   243.139
  10217    1899      11.6508           4.44894     61.81%   243.144
  10377    1739      11.6508           4.44894     61.81%   243.148
  10537    1579      11.6508           4.44894     61.81%   243.153
  10697    1419      11.6508           4.44894     61.81%   243.158
  10857    1259      11.6508           4.44894     61.81%   243.162
  11017    1099      11.6508           4.44894     61.81%   243.167
  11177     939      11.6508           4.44894     61.81%   243.171
  11337     779      11.6508           4.44894     61.81%   243.175
  11497     619      11.6508           4.44894     61.81%   243.179
  11657     459      11.6508           4.44894     61.81%   243.183
  11817     299      11.6508           4.44894     61.81%   243.187
  11977     139      11.6508           4.44894     61.81%   243.191
  12116       0      11.6508           4.44894     61.81%   243.406
  12116       2      11.6508           4.44894     61.81%   253.794
  12120       2      11.6508           4.44894     61.81%   262.165
  12124       4      11.6508           4.44894     61.81%   274.656
  12162      32      11.6508           4.44894     61.81%   283.179
  12194      36      11.6508           4.44894     61.81%   300.978
  12237      95      11.6508           4.44894     61.81%   315.590
  12312     174      11.6508           4.44894     61.81%   325.754
  12423     297      11.6508           4.44894     61.81%   335.146
  12528     400      11.6508           4.44894     61.81%   346.079
  12636     508      11.6508           4.44894     61.81%   356.752
  12745     623      11.6508           4.44894     61.81%   366.650
  12770     650      10.9481 MPEC      4.44894     59.36%   368.223
  12881     757      10.9481           4.44894     59.36%   376.200
  12928     802      5.85612 MPEC      4.44894     24.03%   381.034
  12998     884      5.85612           4.44894     24.03%   384.994
  13085     959      5.83273 MPEC      4.44894     23.72%   390.276
  13142    1026      5.83273           4.44894     23.72%   393.309
  13223    1099      5.21444 MPEC      4.44894     14.68%   397.820
  13268    1138      5.18298 MPEC      4.44894     14.16%   401.126
  13281    1151      5.18298           4.44894     14.16%   401.886
  13294    1164      4.73702 MPEC      4.44894      6.08%   402.669
  13406    1282      4.73702           4.44894      6.08%   409.177
  13544    1420      4.56283 MPEC      4.44894      2.50%   417.010
  13587    1461      4.56283           4.44894      2.50%   428.874
  13717    1593      4.55998 MPEC      4.45089      2.39%   436.419
  13762    1628      4.52585 MPEC      4.45234      1.62%   438.960
  13788    1632      4.52585           4.45234      1.62%   446.854
  13788    1640      4.52585           4.45234      1.62%   459.717
  13853    1727      4.47866 MPEC      4.45234      0.59%   468.984
  13939    1801      4.47866           4.45234      0.59%   477.167
  13974    1844      4.46637 MPEC      4.45283      0.30%   479.064
  14015    1887      4.46604 MPEC      4.45283      0.30%   481.175
  14068    1920      4.46604           4.45283      0.30%   484.296
  14088    1940      4.46395 MPEC      4.45283      0.25%   486.663
  14136    2010      4.46395           4.45283      0.25%   492.502
  14216    2080      4.46395           4.45283      0.25%   500.827
  14254    2112      4.45963 MPEC      4.45283      0.15%   505.449
  14285    2151      4.45963           4.45283      0.15%   508.571
  14313    2177      4.45769 MPEC      4.45283      0.11%   511.031
  14340    2204      4.45607 MPEC      4.45283      0.07%   513.312
  14385    2251      4.45607           4.45283      0.07%   516.411
  14493    2363      4.45607           4.45283      0.07%   523.320
  14512    2378      4.45565 MPEC      4.45283      0.06%   526.122
  14578    2452      4.45565           4.45286      0.06%   531.004
  14652    2510      4.45521 MPEC      4.45286      0.05%   538.755
  14652    2514      4.45521           4.45286      0.05%   539.560
  14748    2626      4.45521           4.45286      0.05%   546.339
  14836    2712      4.45513 MPEC      4.45286      0.05%   550.333
  14879    2745      4.45513           4.45286      0.05%   553.553
  14970    2842      4.45513           4.45286      0.05%   560.513
  14993    2867      4.45471 MPEC      4.45286      0.04%   561.555
  15080    2938      4.45471           4.45286      0.04%   567.541
  15141    3019      4.45420 MPEC      4.45286      0.03%   571.076
  15200    3074      4.45420           4.45286      0.03%   573.572
  15308    3180      4.45420           4.45286      0.03%   580.022
  15430    3292      4.45420           4.45286      0.03%   586.594
  15518    3370      4.45406 MPEC      4.45286      0.03%   592.839
  15523    3377      4.45406           4.45286      0.03%   593.548
  15644    3520      4.45406           4.45286      0.03%   599.171
  15738    3612      4.45406           4.45286      0.03%   605.883
  15806    3682      4.45401 MPEC      4.45286      0.03%   608.823
  15863    3715      4.45397 MPEC      4.45286      0.02%   611.671
  15867    3715      4.45397           4.45286      0.02%   612.634
  15948    3806      4.45377 MPEC      4.45286      0.02%   618.521
  15948    3808      4.45377           4.45286      0.02%   619.484
  16052    3912      4.45375 MPEC      4.45286      0.02%   625.094
  16062    3914      4.45375           4.45286      0.02%   625.939
  16170    4048      4.45375           4.45286      0.02%   631.833
  16200    4074      4.45360 MPEC      4.45286      0.02%   633.053
  16272    4130      4.45356 MPEC      4.45286      0.02%   636.959
  16289    4147      4.45356           4.45286      0.02%   638.045
  16375    4255      4.45343 MPEC      4.45286      0.01%   642.267
  16403    4281      4.45343           4.45286      0.01%   643.365
  16497    4361      4.45333 MPEC      4.45286      0.01%   648.716
  16517    4367      4.45333           4.45286      0.01%   649.950
  16584    4440      4.45326 MPEC      4.45286      0.01%   655.792

EXIT: Optimal solution found (assuming convexity).

HINT: The problem may be a non-convex mixed-integer problem.  Set
      mip_multistart=1 to enable a mixed-integer multistart heuristic,
      which may improve the chances of finding the global solution.

Final Statistics for MIP
------------------------
Final objective value               =  4.45325594185027e+00
Final bound value                   =  4.45285857261477e+00
Final optimality gap (abs / rel)    =  3.97e-04 / 8.92e-05 (0.01%)
# of root cutting plane rounds      =  1
# of restarts                       =  1
# of nodes processed                =  16584 (1683.251s)
# of strong branching evaluations   =  2355 (837.700s)
# of function evaluations           =  359358 (70.532s)
# of gradient evaluations           =  352044 (26.927s)
# of hessian evaluations            =  321563 (108.781s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  15415 (2582.962s)
Total program time (secs)           =  655.80438 (2604.388 CPU time)
Time spent in evaluations (secs)    =  206.24011

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  0 / 0
Mixed-integer rounding cuts         =  0 / 0
Flow-cover cuts                     =  0 / 0
Probing cuts                        =  0 / 0

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  8 / 1 / 13.021s
Rounding heuristic                  =  2 / 0 / 6.890s
MPEC heuristic                      =  89 / 32 / 53.206s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 4.453255941850274; optimality gap 0.000397
16584 nodes; 15415 subproblem solves

In this example, Knitro performs a restart after about 12000 nodes. Before this restart, the value of the dual bound was stuck at 4.44894. Thanks to the information gathered before restarting, Knitro is able to improve the dual bound after the restart and close the optimality gap.

Multi-start strategies

If the problem is convex, the NLPBB algorithm terminates with a provably optimal solution. If the problem is non-convex, the NLPBB algorithm doesn’t provide any guarantee regarding the optimality of the returned solution. That is, it may terminate with a non-optimal solution. To increase the chances of finding an optimal solution, Knitro provides two multi-start strategies for the NLPBB algorithm.

Note that the NLPBB algorithm is not an iterative algorithm like the interior point algorithm or the active-set algorithm. That’s why multi-start is not as straightforward as for these other methods.

Node multi-start

Node multi-start enables multi-start for all continuous subproblems solved by the NLPBB algorithm, in order to increase the chances of finding the global optimum for these subproblems.

Node multi-start can be enabled by setting the ms_enable option to KN_MS_ENABLE_YES as for the continuous algorithms. Option ms_maxsolves specifies how many start points to try in each continuous subproblem.

Since most of the running time of the NLPBB algorithm is spent inside the subproblem solves, using node multi-start will likely multiply the running time of the algorithm by the number of start points. Thus, it might become very expensive and is only recommended for small problems (e.g., less than 32 variables).

Here is an example of the same model solved without multi-start and with node multi-start:

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 0.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  linear
Number of variables:                                  8
    bounded below only:                               0
    bounded above only:                               0
    bounded below and above:                          7
    fixed:                                            0
    free:                                             1
Number of binary variables:                           0
Number of integer variables:                          7
Number of constraints:                               28
    linear equalities:                                0
    quadratic equalities:                             0
    gen. nonlinear equalities:                        0
    linear one-sided inequalities:                    0
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:           28
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                     220
Number of nonzeros in Hessian:                       28

Knitro using Branch and Bound method with 8 threads.

Root node relaxation
--------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
    1       0.792153          8.98537          0.338079       0.096
    2        1.81603          6.80605          0.302838       0.105
    3        6.82792      4.35574e-02          0.302838       0.120
    4        6.29827      3.66802e-02          0.302838       0.135
    5        5.60237         0.189952          0.177556       0.148
    6        5.56369      7.25825e-02       3.05272e-02       0.155
    7        5.58861      2.70482e-03       1.15452e-03       0.169
    8        5.58990      8.77615e-06       4.11680e-06       0.181
    9        5.58990      0.00000e+00       1.71120e-10       0.195
   10        5.58990      0.00000e+00       8.55601e-11       0.208
   11        5.58990      0.00000e+00       1.14219e-09       0.216
    1        5.59170          168.179          0.193187       0.234
    2        5.59171          168.179          0.193187       0.243
    3        5.59171          168.179          0.193187       0.257
    4        5.59171          168.179          0.193187       0.270
    5        5.71839          168.179           168.179       0.295
    6        6.44679          168.179           168.179       0.305
    7        7.40628          168.179           168.179       0.322
    8        10.1344          168.179           168.179       0.332
    9        16.0890          168.179           168.179       0.339
   10        29.5712          168.179           168.179       0.350
   11        85.4312          168.179           168.179       0.365
   12        159.469          168.179           168.179       0.381
   13        306.668          168.179           168.179       0.394
   14        278.315          168.179           168.179       0.409
   15        278.540          168.179           17.4617       0.421
   16        278.453          168.179           15.2425       0.432
   17        278.378          168.179          0.994058       0.446
   18        168.981          168.179          0.998814       0.457
   19        103.287          168.179          0.999987       0.466
   20        62.5597          168.179          0.999988       0.480
   21        31.7630          168.179          0.999988       0.489
   22        21.0812          168.179          0.999988       0.499
   23        13.9296          168.179          0.999998       0.511
   24        12.4336          168.179           1.00000       0.522
   25        8.99448          168.179           1.00000       0.535
   26        7.87001          168.179           1.00000       0.550
   27        7.94507          168.179           1.00000       0.565
   28        7.90012          168.179           1.00000       0.579
   29        7.88889          168.179           1.00000       0.591
   30        7.88636          168.179           1.00000       0.601
   31        7.86577          168.179           1.00000       0.615
   32        7.86577          168.179           1.00000       0.618

WARNING: Evaluations seem expensive and concurrent evaluations are disabled,
         please consider reducing the number of threads for the branch-and-bound
         using option 'mip_numthreads'.
         Recommended value: 'mip_numthreads=1'


Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
      1       2                        5.58990                0.619
     21      22      11.0498   FP      8.02616     27.36%     2.853
     30      25      8.23770 LEAF      8.03372      2.48%     4.783
     83       0      8.23770           8.23770      0.00%     6.249

EXIT: Optimal solution found (assuming convexity).

HINT: The problem may be a non-convex mixed-integer problem.  Set
      mip_multistart=1 to enable a mixed-integer multistart heuristic,
      which may improve the chances of finding the global solution.

Final Statistics for MIP
------------------------
Final objective value               =  8.23769932942488e+00
Final bound value                   =  8.23769932942488e+00
Final optimality gap (abs / rel)    =  0.00e+00 / 0.00e+00 (0.00%)
# of root cutting plane rounds      =  0
# of restarts                       =  0
# of nodes processed                =  83 (19.216s)
# of strong branching evaluations   =  0 (0.000s)
# of function evaluations           =  1082 (5.669s)
# of gradient evaluations           =  1043 (4.884s)
# of hessian evaluations            =  925 (9.742s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  67 (21.221s)
Total program time (secs)           =  6.26060 (21.891 CPU time)
Time spent in evaluations (secs)    =  20.29497

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  0 / 0
Mixed-integer rounding cuts         =  0 / 0
Flow-cover cuts                     =  0 / 0
Probing cuts                        =  0 / 0

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  1 / 1 / 1.607s
Rounding heuristic                  =  1 / 0 / 1.071s
MPEC heuristic                      =  0 / 0 / 0.000s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 8.237699329424883; optimality gap 0
83 nodes; 67 subproblem solves
ms_enable=1

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
ms_enable:               1
ms_maxsolves:            0
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 0.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  linear
Number of variables:                                  8
    bounded below only:                               0
    bounded above only:                               0
    bounded below and above:                          7
    fixed:                                            0
    free:                                             1
Number of binary variables:                           0
Number of integer variables:                          7
Number of constraints:                               28
    linear equalities:                                0
    quadratic equalities:                             0
    gen. nonlinear equalities:                        0
    linear one-sided inequalities:                    0
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:           28
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                     220
Number of nonzeros in Hessian:                       28

Knitro using Branch and Bound method with 8 threads.

Root node relaxation
--------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
   14        5.90161      7.38964e-13       2.06990e-08       0.890
   14        5.91153      5.32907e-15       1.25417e-09       0.891
   11        5.58990      0.00000e+00       1.14219e-09       0.910
   16        5.91153      1.13687e-13       1.25405e-09       1.032
   17        5.58990      1.95399e-14       3.46402e-07       1.033
   16        5.91153      1.13687e-13       1.01696e-09       1.056
   23        5.58990      1.77636e-15       9.80327e-14       1.105
   36        5.90161      1.13687e-13       2.83099e-10       1.235
   10        210.837          168.179           1.00000       1.784
   12        135.216          168.179           1.00000       1.865
   12        415.486          168.179           1.00000       2.092
   17        7.90742          168.179           1.00000       2.220
   21        7.87058          168.179           1.00000       2.259
   18        7.87530          168.179           1.00000       2.276
   20        7.87809          168.179           1.00000       2.307
   32        7.86577          168.179           1.00000       2.375

Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
      1       2                        5.58990                2.376
      1       2      12.8490   FP      5.58990     56.50%    11.666
     24      23      7.71576 LEAF      7.39936      4.10%    36.634
     30      21      7.65775 FCRD      7.65129      0.08%    43.944
     31      20      7.65775           7.65771      0.00%    45.256

EXIT: Optimal solution found (assuming convexity).

HINT: The problem may be a non-convex mixed-integer problem.  Set
      mip_multistart=1 to enable a mixed-integer multistart heuristic,
      which may improve the chances of finding the global solution.

Final Statistics for MIP
------------------------
Final objective value               =  7.65775209273327e+00
Final bound value                   =  7.65770738085629e+00
Final optimality gap (abs / rel)    =  4.47e-05 / 5.84e-06 (0.00%)
# of root cutting plane rounds      =  0
# of restarts                       =  0
# of nodes processed                =  31 (0.000s)
# of strong branching evaluations   =  0 (0.000s)
# of function evaluations           =  6386 (2.518s)
# of gradient evaluations           =  5716 (0.021s)
# of hessian evaluations            =  5407 (0.000s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  42 (0.000s)
Total program time (secs)           =  45.28794 (299.672 CPU time)
Time spent in evaluations (secs)    =  2.53901

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  0 / 0
Mixed-integer rounding cuts         =  0 / 0
Flow-cover cuts                     =  0 / 0
Probing cuts                        =  0 / 0

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  1 / 1 / 9.276s
Rounding heuristic                  =  2 / 1 / 1.720s
MPEC heuristic                      =  0 / 0 / 0.000s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 7.657752092733272; optimality gap 4.47e-05
31 nodes; 42 subproblem solves

Without multi-start, Knitro finds a solution of value 8.23770. When node multi-start is enabled, Knitro finds a better solution of value 7.65775.

MIP multi-start

MIP multi-start solves multiple branch-and-bound trees at the same time. Each branch-and-bound tree is associated with a locally optimal solution of the root node relaxation, which is used as a starting point for all its subproblem solves.

Thus, no multi-start is used for the continuous subproblems and the time spent in a node is equivalent to the time spent in a node without any multi-start.

There is a single node pool that contains the nodes from all branch-and-bound trees. When a node needs to be processed, Knitro selects the best node among the open nodes from all the branch-and-bound trees. That means that, if all the open nodes of a branch-and-bound tree are not promising, they won’t be processed until the promising nodes from the other branch-and-bound trees have all been processed.

MIP multi-start can be enabled by setting the mip_multistart option to KN_MIP_MULTISTART_ON. Option ms_maxsolves sets the number of root relaxations computed. Option ms_num_to_save sets the maximum number of branch-and-bound trees solved. In particular:

  • If ms_num_to_save is set to ms_maxsolves, a branch-and-bound tree will be created for all distinct locally optimal solutions of the root node relaxation found.

  • Setting ms_num_to_save to 1 is equivalent to running multi-start only at the root node.

Here is an example of the same model solved without multi-start and with MIP multi-start:

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

WARNING: Problem appears to have nonlinear equalities and be non-convex.
         The Knitro mixed integer solver is designed for convex problems.
         For non-convex problems it is only a heuristic, and the reported
         bounds and optimality claims cannot be verified.

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 0.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  linear
Number of variables:                                 70
    bounded below only:                              36
    bounded above only:                               0
    bounded below and above:                         30
    fixed:                                            0
    free:                                             4
Number of binary variables:                          14
Number of integer variables:                          0
Number of constraints:                               54
    linear equalities:                               10
    quadratic equalities:                             1
    gen. nonlinear equalities:                       15
    linear one-sided inequalities:                   28
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:            0
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                     236
Number of nonzeros in Hessian:                       86

Knitro using Branch and Bound method with 8 threads.

Root node relaxation
--------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
    1        762.075          8690.14           7.12905       0.140
    2        716.803          940.943           10.9205       0.152
    3        710.057          929.518           355.985       0.153
    4        808.275          382.840           11.3933       0.154
    5        815.227          237.563           212.286       0.155
    6        868.886          199.264           2781.03       0.156
    7        1045.11          22.5822           397.428       0.156
    8        1034.01          79.0942           528.380       0.169
    9        1126.19          46.2518           666.390       0.171
   10        1157.69          34.2918           1470.29       0.172
   11        1209.11          26.5823           1053.39       0.184
   12        1247.91          23.9088           1065.22       0.185
   13        1435.30          11.4975           1954.46       0.187
   14        1455.88          10.9255           1972.82       0.187
   15        1552.19          7.94707           2065.17       0.188
   16        1686.53          4.35518           2246.45       0.188
   17        1767.12          3.07367           2484.90       0.189
   18        1858.66          1.82489           2897.28       0.190
   19        1847.17          1.66627           2417.20       0.190
   20        1742.37          7.70408           2476.99       0.191
   21        1714.43          3.78487           2157.65       0.192
   22        1692.13          3.35028           2328.07       0.192
   23        1671.01          2.13963           2934.62       0.193
   24        1564.38          7.47667           2930.89       0.193
   25        1519.02         0.315048           202.054       0.194
   26        1504.45         0.270638           61.9523       0.195
   27        1490.91         0.257351           72.8773       0.197
   28        1438.66         0.218479           112.948       0.198
   29        1438.08         0.212729           115.045       0.199
   30        1393.94         0.170486           312.398       0.199
   31        1348.35          2.10058           3188.58       0.200
   32        1346.11          1.13779           4595.48       0.201
   33        1338.52          1.07373           12775.2       0.201
   34        1328.82         0.246492           3203.61       0.202
   35        1298.29          2.20813           14183.8       0.209
   36        1263.15         0.751379           6157.16       0.215
   37        1237.73      5.38537e-02           14274.0       0.217
   38        1150.73          2.07861           410.353       0.220
   39        1131.93         0.886189           155.179       0.228
   40        1129.36         0.831367           151.062       0.231
   41        1120.75         0.316962           58.1305       0.232
   42        1120.43         0.313709           57.9545       0.233
   43        1110.27         0.356108           2.66045       0.234
   44        1110.15         0.355924           2.65852       0.235
   45        1109.87         0.355345           2.65845       0.235
   46        1109.54         0.354653           4.73973       0.236
   47        1108.76         0.316740           14.8072       0.236
   48        1108.11         0.284633           23.6060       0.237
   49        1107.65         0.254085           29.7572       0.238
   50        1112.18         0.170984           29.5068       0.238
   51        1110.67         0.221518           32.7837       0.239
   52        1110.02         0.323319           36.8530       0.240
   53        1109.20      5.11038e-02          0.299417       0.248
   54        1108.91      3.75899e-02           17.0687       0.249
   55        1108.25      5.07001e-02          0.194298       0.251
   56        1108.13         0.103257           11.7448       0.253
   57        1108.00      1.71929e-02          0.326436       0.254
   58        1107.88      1.75664e-02           11.9461       0.255
   59        1107.70      4.77221e-02           22.7197       0.255
   60        1107.49      1.05335e-02           8.70644       0.256
   61        1107.34      4.19617e-02          0.452127       0.256
   62        1107.29      5.66492e-02          0.452118       0.257
   63        1107.17      8.21140e-02          0.442639       0.258
   64        1106.96      6.42086e-02           12.4246       0.258
   65        1106.64         0.207684           25.7894       0.259
   66        1106.56         0.221879           31.0652       0.260
   67        1106.52      5.79296e-02           1.90502       0.261
   68        1106.42      8.00833e-02           1.90440       0.270
   69        1106.27         0.152195           1.90355       0.271
   70        1105.97         0.211405           1.90184       0.272
   71        1105.58         0.398599           1.89955       0.273
   72        1105.29      1.24215e-02           2.86115       0.274
   73        1105.36      9.96892e-04           3.29637       0.274
   74        1105.34      8.97123e-04           1.40151       0.275
   75        1105.34      3.83776e-04           1.67779       0.276
   76        1105.06         0.323889           2.16698       0.285
   77        1104.81          1.42388           14.0948       0.286
   78        1104.66         0.427723          0.402504       0.287
   79        1104.53          1.37545           18.6064       0.288
   80        1104.32         0.418011           9.45795       0.289
   81        1103.95          1.57327           5.71481       0.290
   82        1103.86          1.56574           5.72354       0.290
   83        1103.63         0.177134           5.81843       0.291
   84        1103.56         0.103369           2.45853       0.292
   85        1103.51         0.116132           1.32386       0.292
   86        1103.48      5.23829e-02          0.231549       0.293
   87        1103.43         0.284447           12.7623       0.294
   88        1103.37      5.02383e-02           1.27629       0.295
   89        1103.25         0.460614           5.80068       0.298
   90        1103.13      6.45415e-02           5.81409       0.298
   91        1103.12      7.47480e-04           1.89073       0.299
   92        1103.12      2.12925e-04           1.96037       0.300
   93        1103.11      1.64705e-03          0.154942       0.300
   94        1103.08      1.16691e-02          0.145253       0.301
   95        1102.99         0.105039          0.792631       0.301
   96        1102.59          2.24957           63.8373       0.302
   97        1102.53          2.21529           62.9266       0.309
   98        1102.41          1.73667           53.2301       0.312
   99        1101.93          3.36052           65.6356       0.313
  100        1101.86          1.98783           58.1003       0.314
  101        1101.70      4.81609e-02           55.5624       0.315
  102        1101.48         0.345457           65.8778       0.316
  103        1101.17      6.64795e-03           26.6171       0.317
  104        1101.05      4.63370e-03           26.6138       0.318
  105        1100.98      3.72972e-03           21.1519       0.327
  106        1100.99      2.79819e-03           2.45657       0.330
  107        1100.95         0.102248           1.27947       0.331
  108        1100.80         0.570040           7.35153       0.332
  109        1100.64          1.24927           12.8011       0.333
  110        1100.54          1.34217           2.62487       0.334
  111        1100.36         0.179569           3.71435       0.335
  112        1100.26      9.62631e-02           2.75589       0.336
  113        1100.19      3.44364e-02           2.84549       0.336
  114        1099.98         0.420706           6.46228       0.337
  115        1099.96         0.377692           6.46230       0.338
  116        1099.65      4.95313e-02           6.61775       0.339
  117        1099.70      2.21946e-02           2.32145       0.344
  118        1099.70      2.21923e-02           2.32154       0.346
  119        1099.52      2.72784e-02           9.95707       0.347
  120        1099.34      5.41746e-03           7.39818       0.349
  121        1099.36      4.08365e-03           7.08499       0.349
  122        1099.40      3.82351e-03           3.05808       0.350
  123        1099.44      3.55762e-04       9.95159e-04       0.351
  124        1099.44      7.63601e-06       7.03206e-06       0.352
  125        1099.44      3.47466e-10       1.02782e-10       0.352
  126        1099.44      3.55271e-15       2.23230e-08       0.353
    1        1701.61          4.95012           28.8042       0.358
    2        1434.18          20.3112           244.904       0.366
    3        1315.82          216.395           3.98060       0.367
    4        1321.76          111.185           144.273       0.368
    5        1465.25          45.1684           18.5068       0.369
    6        1538.19          15.9991           38.5363       0.369
    7        1580.48          2.56941           1.29211       0.370
    8        1618.60          2.03510           22.2456       0.371
    9        1668.12          1.32032           39.3079       0.371
   10        1797.54         0.698452           64.5918       0.372
   11        2011.65         0.161962           86.5686       0.372
   12        2123.69         0.120279           100.202       0.373
   13        2161.75         0.109719           103.797       0.385
   14        2166.70         0.108553           104.186       0.385
   15        2169.20         0.107732           104.452       0.386
   16        2083.04         0.207730           118.282       0.388
   17        2095.82      9.02828e-02           119.059       0.389
   18        2095.72      9.01110e-02           119.063       0.390
   19        2074.66          1.03127           119.367       0.391
   20        2074.62         0.101746           119.400       0.392
   21        2074.64         0.102133           119.396       0.392
   22        2075.28         0.105179           119.335       0.393
   23        2176.61      6.40139e-02           124.295       0.394
   24        2176.58      6.33761e-02           124.222       0.394
   25        2179.14      7.22400e-02           124.306       0.397
   26        2191.03      8.75877e-02           124.505       0.398
   27        2339.73      5.69038e-02           127.773       0.399
   28        2372.63      5.05409e-02           128.438       0.400
   29        2392.07      4.71235e-02           128.962       0.400
   30        2419.43      4.21108e-02           130.050       0.401
   31        2435.31      3.87801e-02           130.798       0.401
   32        2437.36      3.82973e-02           130.898       0.402
   33        2446.44      3.60721e-02           131.329       0.408
   34        2454.83      3.33226e-02           131.805       0.409
   35        2464.59      3.60727e-02           131.800       0.412
   36        2484.00      4.37577e-02           131.800       0.413
   37        2494.44      4.65814e-02           131.800       0.414
   38        2508.59      4.64594e-02           131.800       0.415
   39        2513.99      4.65496e-02           131.802       0.416
   40        2530.97      4.63924e-02           131.802       0.416
   41        2551.16      4.62204e-02           131.802       0.417
   42        2557.61      4.61419e-02           131.802       0.418
   43        2634.70      4.43628e-02           131.802       0.427
   44        2729.16      4.36033e-02           131.799       0.429
   45        2728.57      4.37088e-02           131.800       0.431
   46        2776.29      4.30616e-02           131.799       0.432
   47        2781.10      4.24033e-02           131.800       0.433
   48        2797.94      4.17209e-02           131.799       0.434
   49        2801.53      4.13391e-02           131.800       0.435
   50        2811.58      3.94150e-02           131.800       0.435
   51        2820.34      3.86400e-02           131.800       0.436
   52        2839.69      3.74567e-02           131.799       0.437
   53        2849.32      3.68448e-02           131.800       0.437
   54        2864.72      3.62938e-02           131.800       0.438
   55        2896.26      3.44269e-02           131.800       0.438
   56        2965.09      3.18188e-02           131.800       0.439
   57        3094.55      2.74868e-02           131.800       0.446
   58        3181.05      2.36684e-02           131.800       0.448
   59        3396.05      2.49290e-02           131.800       0.449
   60        3495.81      2.50025e-02           131.800       0.450
   61        3476.68      2.50178e-02           131.806       0.450
   62        3527.28      2.50198e-02           131.806       0.451
   63        3533.10      2.50199e-02           131.806       0.451
   64        3510.40      2.50244e-02           131.807       0.452
   65        3486.21      2.50244e-02           131.807       0.453
   66        3477.22      2.50255e-02           131.807       0.453
   67        3336.74      2.50255e-02           131.807       0.454
   68        3325.18      2.50255e-02           131.807       0.454
   69        3230.29      2.50255e-02           131.807       0.462
   70        3219.99      2.50255e-02           131.807       0.465
   71        3169.79      2.50255e-02           131.807       0.466
   72        3169.79      2.50255e-02           131.807       0.468

Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
      1       2                        1099.44                0.469
      7       8      1154.55   FP      1099.44      4.77%     0.639
     14      15      971.806 FCRD      1099.44    -13.13%     0.728

EXIT: Optimal solution found (assuming convexity).

HINT: The problem may be a non-convex mixed-integer problem.  Set
      mip_multistart=1 to enable a mixed-integer multistart heuristic,
      which may improve the chances of finding the global solution.

Final Statistics for MIP
------------------------
Final objective value               =  9.71805831935477e+02
Final bound value                   =  1.09943627160339e+03
Final optimality gap (abs / rel)    =  -1.28e+02 / -1.31e-01 (-13.13%)
# of root cutting plane rounds      =  0
# of restarts                       =  0
# of nodes processed                =  14 (0.678s)
# of strong branching evaluations   =  0 (0.000s)
# of function evaluations           =  4806 (0.037s)
# of gradient evaluations           =  2061 (0.013s)
# of hessian evaluations            =  2062 (0.031s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  24 (0.992s)
Total program time (secs)           =  0.74348 (1.016 CPU time)
Time spent in evaluations (secs)    =  0.08101

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  0 / 0
Mixed-integer rounding cuts         =  0 / 0
Flow-cover cuts                     =  0 / 0
Probing cuts                        =  0 / 0

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  1 / 1 / 0.143s
Rounding heuristic                  =  2 / 1 / 0.131s
MPEC heuristic                      =  1 / 0 / 0.044s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 971.8058319354769; optimality gap 0
14 nodes; 24 subproblem solves
mip_multistart=1
ms_maxsolves=16

=======================================
          Commercial License
         Artelys Knitro 14.0.0
=======================================

WARNING: Problem appears to have nonlinear equalities and be non-convex.
         The Knitro mixed integer solver is designed for convex problems.
         For non-convex problems it is only a heuristic, and the reported
         bounds and optimality claims cannot be verified.

concurrent_evals:        0
datacheck:               0
hessian_no_f:            1
mip_multistart           1
Knitro changing mip_method from AUTO to 1.
Knitro changing mip_rootalg from AUTO to 1.
Knitro changing mip_lpalg from AUTO to 3.
Knitro changing mip_branchrule from AUTO to 2.
Knitro changing mip_selectrule from AUTO to 2.
Knitro changing mip_mir from AUTO to 2.
Knitro changing mip_clique from AUTO to 0.
Knitro changing mip_zerohalf from AUTO to 0.
Knitro changing mip_liftproject from AUTO to 0.
Knitro changing mip_knapsack from AUTO to 2.
Knitro changing mip_gomory from AUTO to 0.
Knitro changing mip_cut_flowcover from AUTO to 2.
Knitro changing mip_cut_probing from AUTO to 1.
Knitro changing mip_rounding from AUTO to 3.
Knitro changing mip_heuristic_strategy from AUTO to 1.
Knitro changing mip_heuristic_feaspump from AUTO to 1.
Knitro changing mip_heuristic_misqp from AUTO to 0.
Knitro changing mip_heuristic_mpec from AUTO to 1.
Knitro changing mip_heuristic_diving from AUTO to 0.
Knitro changing mip_heuristic_lns from AUTO to 0.
Knitro changing mip_pseudoinit from AUTO to 1.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Objective type:  linear
Number of variables:                                 70
    bounded below only:                              36
    bounded above only:                               0
    bounded below and above:                         30
    fixed:                                            0
    free:                                             4
Number of binary variables:                          14
Number of integer variables:                          0
Number of constraints:                               54
    linear equalities:                               10
    quadratic equalities:                             1
    gen. nonlinear equalities:                       15
    linear one-sided inequalities:                   28
    quadratic one-sided inequalities:                 0
    gen. nonlinear one-sided inequalities:            0
    linear two-sided inequalities:                    0
    quadratic two-sided inequalities:                 0
    gen. nonlinear two-sided inequalities:            0
Number of nonzeros in Jacobian:                     236
Number of nonzeros in Hessian:                       86

Knitro using Branch and Bound method with 8 threads.

Root nodes relaxation
---------------------

 Iter      Objective      Feasibility        Optimality       Time
                             error              error        (secs)
 ----      ---------      -----------        ----------      ------
    3        929.263      2.13163e-14       2.35600e-06       0.074
    1        1081.23      3.07310e-13       1.58151e-06       0.097
    2        1007.93      3.55271e-15       1.13487e-07       0.129
    5        1000.60      5.32907e-15       1.29674e-12       0.136
    0        1141.15      1.38890e-04       6.38968e-07       0.141
    4        1089.54      1.77636e-15       7.63833e-14       0.147
    7        963.826      3.37508e-14       1.60024e-08       0.169
    9        916.433      3.55271e-15       1.96806e-11       0.181
    8        1048.01      2.48690e-14       6.40391e-06       0.195
   11        1103.89      3.55271e-15       6.25278e-12       0.207
   10        1079.53      4.97380e-14       3.68452e-06       0.213
   12        1067.50      3.55271e-15       1.49569e-12       0.246
   13        1009.07      5.32907e-15       8.35616e-08       0.259
    6        3279.04         0.824824           89.0033       0.268
   15        1034.36      5.32907e-15       2.64751e-09       0.272
   14        972.822      2.84217e-14       2.81217e-06       0.277

# of points selected:  15

WARNING: Evaluations seem expensive and concurrent evaluations are disabled,
         please consider reducing the number of threads for the branch-and-bound
         using option 'mip_numthreads'.
         Recommended value: 'mip_numthreads=4'


Tree search
-----------

       Nodes        Best solution   Best bound      Gap       Time
   Expl  |  Unexpl      value         value                  (secs)
   ---------------  -------------   ----------      ---      ------
     15      30      914.184 FCRD      906.524      0.84%     0.540
     16      29      909.028 MPEC      906.524      0.28%     1.145
     33      12      909.028           916.250     -0.79%     1.150

EXIT: Optimal solution found (assuming convexity).

Final Statistics for MIP
------------------------
Final objective value               =  9.09027862649573e+02
Final bound value                   =  9.16249757013197e+02
Final optimality gap (abs / rel)    =  -7.22e+00 / -7.94e-03 (-0.79%)
# of root cutting plane rounds      =  0
# of restarts                       =  0
# of nodes processed                =  33 (0.449s)
# of strong branching evaluations   =  0 (0.000s)
# of function evaluations           =  13182 (0.089s)
# of gradient evaluations           =  6142 (0.035s)
# of hessian evaluations            =  6084 (0.075s)
# of hessian-vector evaluations     =  0
# of subproblems processed          =  73 (2.223s)
Total program time (secs)           =  1.18863 (3.891 CPU time)
Time spent in evaluations (secs)    =  0.19887

Cuts statistics (gen / add)
---------------------------
Knapsack cuts                       =  0 / 0
Mixed-integer rounding cuts         =  0 / 0
Flow-cover cuts                     =  0 / 0
Probing cuts                        =  0 / 0

Heuristics statistics (calls / successes / time)
------------------------------------------------
Feasibility pump                    =  10 / 0 / 0.059s
Rounding heuristic                  =  15 / 10 / 0.420s
MPEC heuristic                      =  15 / 1 / 0.512s

===========================================================================

Knitro 14.0.0: Locally optimal or satisfactory solution.
objective 909.0278626495726; optimality gap 0
33 nodes; 73 subproblem solves

Without multi-start, Knitro finds a solution of value 971.806. When MIP multi-start is enabled, Knitro finds a better solution of value 909.028.

Termination criteria

The NLPBB algorithm can be stopped early based on the following criteria:

Callbacks

The NLPBB procedure provides a user callback utility that can be used in the callable library API to retrieve information during the branch-and-bound tree exploration.

This callback is not called at each node, but regularly during the search. Even if parallelism is enabled, this callback is thread safe: it will never be called more than once at the same time.

int  KNITRO_API KN_set_mip_node_callback (KN_context_ptr            kc,
                                          KN_user_callback * const  fnPtr,
                                          void             * const  userParams);

See the Callable library API reference section in the Reference Manual for details on setting this callback function and the prototype for this callback function.

Branching priorities

It is also possible to specify branching priorities for the NLPBB algorithm. Priorities must be positive numbers (variables with non-positive values are ignored). Variables with higher priority values will be considered for branching before variables with lower priority values. When priorities for a subset of variables are equal, the branching rule is applied as a tiebreaker.

Branching priorities in AMPL

Branching priorities for integer variables can be specified in AMPL using the AMPL suffixes feature (see AMPL suffixes defined for Knitro) as shown below.

...
ampl: var x{j in 1..3} >= 0 integer;
...
ampl: suffix priority IN, integer, >=0, <=9999;
ampl: let x[1].priority := 5;
ampl: let x[2].priority := 1;
ampl: let x[3].priority := 10;

See the AMPL documentation for more information on the “.priority ” suffix.

Branching priorities in the callable library API

Branching priorities for integer variables can be specified through the callable library interface using the KN_set_set_mip_branching_priorities() functions shown below.

int  KNITRO_API KN_set_mip_branching_priorities
    (      KN_context_ptr  kc,
     const KNINT           nV,
     const KNINT * const   indexVars,
     const int   * const   xPriorities);
int  KNITRO_API KN_set_mip_branching_priorities_all
    (      KN_context_ptr  kc,
     const int   * const   xPriorities);
int  KNITRO_API KN_set_mip_branching_priority
    (      KN_context_ptr  kc,
     const KNINT           indexVar,
     const int             xPriority);

Values for continuous variables are ignored. Knitro makes a local copy of all inputs, so the application may free memory after the call. This routine must be called after calling KN_set_var_types() to mark integer variables.

Branching priorities in the object-oriented interface

Branching priorities for integer variables can be specified through the object-oriented interface using the function shown below.

void setVarMipBranchingPriorities(const KNSparseVector<int, int>& varMipBranchingPriorities);

The KNSparseVector<int, int> varMipBranchingPriorities is basically a pair of std::vector<int> where the first one represents the variables indexes, and the second corresponds to their user-defined branching priorities. Values for continuous variables are ignored.

MISQP algorithm

Overview

The MISQP algorithm is a largely heuristic method that attempts to extend the SQP method for continuous, nonlinear optimization to the case where there are integer variables. This method is primarily designed for small problems (e.g. less than 100 variables) where function evaluations may involve expensive black-box simulations and derivatives may not be available. This method is able to handle models where the integer variables cannot be relaxed. This means that the simulations or function evaluations can only occur when integer variables are at integer values (e.g. the integer variables may have no meaning at non-integral values). This method will typically converge in far fewer function evaluations compared with the other MINLP methods in Knitro and is primarily intended for small problems where these evaluations are the dominant cost. This method can be applied to either convex or non-convex models, but may converge to non-global integer, feasible points.

Multi-start

Since this algorithm runs similarly to the continuous SQP algorithm, you can apply the parallel multi-start feature (see Section Multi-Start) to the MISQP method to increase the chances of finding the global solution.

Special Treatment of Integer Variables

You can specify special treatment of integer variables using the mip_intvar_strategy user option in Knitro. In particularly, you can use this option to specify that all integer variables are relaxed, or that all binary variables should be converted to complementarity constraints (see Section Complementarity constraints for a description of complementarity constraints).

In addition you can specify special treatments of individual integer variables through the callable library interface function KN_set_mip_intvar_strategies()

int  KNITRO_API KN_set_mip_intvar_strategies
    (      KN_context_ptr  kc,
     const KNINT           nV,
     const KNINT * const   indexVars,
     const int   * const   xStrategies);
int  KNITRO_API KN_set_mip_intvar_strategies_all
    (      KN_context_ptr  kc,
     const int * const     xStrategies);
int  KNITRO_API KN_set_mip_intvar_strategy
    (      KN_context_ptr  kc,
     const KNINT           indexVar,
     const int             xStrategy);

Here indexVars specifies the index of the integer variable you want to apply the special treatment to, and xStrategies specifies how you want to handle that particular integer variable (e.g., no special treatment, relax, or convert to a complementarity constraint).

Special strategies for integer variables can be specified in the AMPL interface using the intvarstrategy AMPL suffix, and in the MATLAB interface using the extendedFeatures.xIntStrategy structure.

Additional examples

Examples for solving MINLP problems using the C, C++, C#, Java, Julia, MATLAB, Python and R interfaces are provided with the distribution in the knitromatlab and examples directories.