Choosing Sub-Solvers

Alpine's global optimization algorithm requires a few types of optimization problems to be solved efficiently. For its best performance, it is recommended that a dedicated solver is used for these purposes. The design of Alpine takes advantage of MathOptInterface to seemlessly interface with a majority of optimization software. Currently, the following sub-solvers with Julia Interface are supported by Alpine:

SolverJulia Package
CPLEXCPLEX.jl
CbcCbc.jl
GurobiGurobi.jl
IpoptIpopt.jl
BonminBonmin.jl
Artelys KNITROKNITRO.jl

As the development of Alpine continues, supports for solvers such as Mosek, GLPK, NLopt and Xpress are in the development roadmap.

Tip

Performance of Alpine is significantly faster and robust while using Gurobi as the underlying convex mixed-integer programming (MIP) solver. Note that Gurobi's individual-usage license is available free for academic purposes.

To solve any continuous nonlinear program to global optimality, here is an example to utilize different sub-solvers with default options set for Alpine:

using Alpine
using JuMP 
using Gurobi 
using Ipopt

# MIP optimizer
const gurobi = optimizer_with_attributes(Gurobi.Optimizer, 
                                         MOI.Silent() => true,
                                         "Presolve"   => 1) 

# NLP optimizer
const ipopt = optimizer_with_attributes(Ipopt.Optimizer, 
                                        MOI.Silent() => true, 
                                        "sb" => "yes", 
                                        "max_iter"   => 9999)

# Global optimizer
const alpine = optimizer_with_attributes(Alpine.Optimizer, 
                                         "nlp_solver" => ipopt,
                                         "mip_solver" => gurobi)
m = Model(alpine)

Similarly, many such optimizer options and nonconvex problems (both NLPs and MINLPs) can be found in the examples folder.