Bonmin

Basic Open-source Nonlinear Mixed INteger programming solver for convex MINLP

Layer 3

Bonmin: Convex MINLP Solver

Bonmin (Basic Open-source Nonlinear Mixed INteger programming) solves convex mixed-integer nonlinear programs. It implements multiple algorithms that combine integer programming techniques with continuous NLP solvers.

Layer 3 | 35 annotated files | Convex MINLP


Problem Class

Bonmin solves problems of the form:

$$\min_{x,y} \quad f(x, y)$$

Subject to: $$g(x, y) \leq 0$$ $$x \in \mathbb{R}^n, \quad y \in {0,1}^m$$

Where $f$ and $g$ are convex functions.

Convexity requirement: Bonmin assumes the continuous relaxation is convex. For nonconvex problems, use Couenne instead. Violating convexity may cause Bonmin to find suboptimal solutions or miss feasible regions.


Algorithm Selection

Bonmin implements six algorithms, selectable via the algorithm option:

AlgorithmCodeDescriptionWhen to Use
B-BB0NLP-based Branch-and-BoundMost robust, slower
B-OA1Outer ApproximationLarge MILPs, few nonlinear constraints
B-QG2Quesada-Grossmann single-treeBalanced problems
B-Hyb3Hybrid OA + NLP (default)Usually fastest
B-Ecp4Extended Cutting PlaneHighly nonlinear objectives
B-IFP5Iterated Feasibility PumpFinding feasible solutions

Algorithm Details

B-BB (NLP Branch-and-Bound):

B-OA (Outer Approximation):

B-QG (Quesada-Grossmann):

B-Hyb (Hybrid - Default):


Outer Approximation Cuts

For a convex constraint $g(x) \leq 0$ at solution point $x^*$:

$$g(x^) + \nabla g(x^)^T (x - x^*) \leq 0$$

This linear outer approximation is valid because $g$ is convex. Collecting cuts from multiple NLP solutions progressively tightens the approximation.

                    True feasible region (convex)
                   /
     ─────────────●─────────────  ← OA cut from x₁*
                 ╱ ╲
     ──────────●───●────────────  ← OA cuts tighten
              ╱     ╲
     ────────●───────●──────────  ← More cuts → better approximation
            (MILP feasible region shrinks toward true region)

Key Components

Solver Interfaces

ClassPurpose
BonminSetupAlgorithm configuration and initialization
OsiTMINLPInterfaceOsi wrapper around TMINLP problems
TNLPSolverAbstract NLP solver interface
IpoptSolverIpopt-based NLP solver
FilterSolverFilterSQP-based NLP solver

Heuristics

ClassDescription
HeuristicFPumpFeasibility pump for finding initial solutions
HeuristicDiveDiving heuristics (fractional, vector length)
HeuristicRINSRelaxation Induced Neighborhood Search
HeuristicLocalBranchingLocal branching around incumbent
MilpRoundingRound MILP solution to MINLP feasibility

Cut Generators

ClassDescription
OACutGenerator2Main OA cut generator
EcpCutsExtended cutting plane cuts
LinearCutsGeneratorLinear cuts from quadratic constraints
OaFeasCheckerFeasibility checking for OA

Feasibility Pump

The Feasibility Pump finds integer-feasible solutions by alternating:

  1. Round: $\tilde{y} = \text{round}(y^*)$ for integer variables
  2. Project: Solve NLP to minimize distance to $\tilde{y}$

$$\min_{x,y} \quad |y - \tilde{y}|_p \quad \text{s.t.} \quad g(x,y) \leq 0$$

  1. Check: If $y^* = \tilde{y}$, found feasible solution
  2. Repeat: Otherwise, iterate with cycle detection

Branching Strategies

Strong Branching

Solve NLP subproblems for candidate variables to estimate bound improvement:

class QpBranchingSolver {
    // Solve QP approximation for fast strong branching
    // Much faster than full NLP strong branching
};

Pseudocost Branching

Track historical bound changes per variable:


Usage Example

#include "BonBonminSetup.hpp"
#include "BonCbc.hpp"

// Define your MINLP problem (inherit from TMINLP)
class MyMINLP : public Bonmin::TMINLP {
    // ... implement eval_f, eval_g, eval_grad_f, etc.
};

int main() {
    Bonmin::BonminSetup bonmin;
    bonmin.initializeOptionsAndJournalist();

    // Set algorithm (default is B-Hyb)
    bonmin.options()->SetStringValue("algorithm", "B-Hyb");

    // Initialize with your problem
    SmartPtr<MyMINLP> tminlp = new MyMINLP();
    bonmin.initialize(tminlp);

    // Solve
    Bonmin::Bab bb;
    bb(bonmin);

    // Get solution
    if (bb.bestSolution()) {
        // Access optimal values
    }
}

Source Files

Core Setup

FileDescription
BonBonminSetup.hpp Algorithm selection and initialization
BonBabSetupBase.hpp Base B&B configuration
BonTMINLP.hpp Problem interface

Algorithms

FileDescription
BonOACutGenerator2.hpp Outer approximation cuts
BonEcpCuts.hpp Extended cutting plane
BonOuterApprox.hpp Quadratic OA

Heuristics

FileDescription
BonHeuristicFPump.hpp Feasibility pump
BonHeuristicDive.hpp Diving heuristics
BonHeuristicRINS.hpp RINS heuristic

Dependencies


References