Using solvers for optimization in Python

Following the previous article on modeling and solving an optimization problem in Python using several “interfaces” (+), in this article, I try to provide a comprehensive review of open-source (OS), free, free & open-source (FOSS), and commercial “solvers,” which are usually used for specific types of problems and coded with low-level programming languages (such as C++, Java, etc.). Notably, this is still not a complete survey of what is available, but I try to complete it over time. Besides, the sequence of presentation says nothing about solvers’ quality. Finally, priority is given to solvers that have an easy-to-use interface for themselves.

Criteria on reviewing solvers for optimization in Python

All reviewed solvers must meet the following requirements:

  • Authenticity: The solver should have an official website.
  • Security: The website to download the solver should be reported secure by the browser.
  • Updates: The solver should be under maintenance and not an EOL project.
  • Application programming interface (API): Solvers that provide callable libraries for multiple programming languages, especially Python and C++.
  • Popularity: Searching for the solver through the internet should show its name on the first page.
  • Ability: It should solve mixed-integer linear programming (MILP) models.

1. CPLEX for optimization in Python

  • Supported problems: LP, MIP, QCP, and MIQCP.
  • Supporting interfaces: DOCPLEX, PULP, PYOMO, ORTOOLS, PICOS, and CVXPY.
  • Supported scales: Small (free), Medium (license), and Large (license).
  • Status: Commercial

Herein, I provide a coding example using “cplex” and “docplex” in Python:

# Installation (Uncomment the Line Below)
#!pip install cplex 
#!pip install docplex

# Import package
import docplex as op
from docplex.mp.model import Model

# Define environment
prob = Model("MyOptProblem")

# Define decision variables
x = prob.integer_var(lb=0,ub=None)
y = prob.continuous_var(lb=0,ub=None)

# Add objective function to the environment
prob.set_objective("max", 2*x+5*y)

# Add constraints to the environment
prob.add_constraint(5*x+3*y<=10, ctname="const1")
prob.add_constraint(2*x+7*y<=9, ctname="const2")

# The status of the solution
prob.print_information()
prob.solve()

# To display optimal decision variables
prob.print_solution()

# To display optimal value of objective function
print("Optimal Value of Objective Is = ",prob.objective_value)

2. GUROBI for optimization in Python

  • Supported problems: LP, MIP, QCP, and MIQCP.
  • Supporting interfaces: GUROBIPY, MIP, PULP, PYOMO, ORTOOLS, PICOS, CVXPY, and DRAKE.
  • Supported scales: Small (free), Medium (license), and Large (license).
  • Status: Commercial

Herein, I provide a coding example using “gurobipy” in Python:

# Installation (Uncomment the Line Below)
#!pip install gurobipy

# Import package
import gurobipy as op

# Define environment
prob = op.Model("MyOptProblem")

# Define decision variables
x = prob.addVar(vtype=op.GRB.INTEGER, lb=0 , name='x')
y = prob.addVar(vtype=op.GRB.CONTINUOUS, lb=0, name='y')

# Add objective function to the environment
prob.setObjective(2*x+5*y, op.GRB.MAXIMIZE)

# Add constraints to the environment
prob.addConstr(5*x+3*y<=10, "const1")
prob.addConstr(2*x+7*y<=9, "const2")

# The status of the solution
prob.optimize()

# To display optimal decision variables
for v in prob.getVars():
    print('%s: %g' % (v.VarName, v.X))

# To display optimal value of objective function
print('Optimal Value of Objective Is =  %g' % prob.ObjVal)

3. LOCALSOLVER for optimization in Python

  • Supported problems: LP, MIP, QCP, and MIQCP.
  • Supporting interfaces: LOCALSOLVER.
  • Supported scales: Small (license), Medium (license), and Large (license).
  • Status: Commercial

Herein, I provide a coding example using “localsolver” in Python:

# Installation (Uncomment the Line Below) (Requires its software to be installed)
# !pip install localsolver -i https://pip.localsolver.com

# Import package
import localsolver

with localsolver.LocalSolver() as op:

    # Define environment
    prob = op.model

    # Define decision variables
    x = prob.int(0, None)
    y = prob.float(0, None)

    # Add constraints to the environment
    prob.constraint(5*x+3*y<=10)
    prob.constraint(2*x+7*y<=9)

    # Add objective function to the environment
    prob.maximize(2*x+5*y)
    
    # To display optimal decision variables
    prob.close()
    op.solve()

4. XPRESS for optimization in Python

  • Supported problems: LP, MIP, NLP, CNS, DNLP, MINLP, QCP, and MIQCP.
  • Supporting interfaces: XPRESS, PULP, and CVXPY.
  • Supported scales: Small (free), Medium (license), and Large (license).
  • Status: Commercial

Herein, I provide a coding example using “xpress” in Python:

# Installation (Uncomment the Line Below)
#!pip install xpress

# Import package
import xpress as op

# Define decision variables
x = op.var(vartype=op.integer)
y = op.var()
z = 2 * x + 5 * y

# Define environment
prob = op.problem("MyOptProb")
prob.addVariable(x)
prob.addVariable(y)

# Add constraints to the environment
prob.addConstraint(5*x+3*y <= 10)
prob.addConstraint(2*x+7*y <= 9)

# Add objective function to the environment
prob.setObjective(z, sense=op.maximize)

# The status of the solution
prob.solve()

# To display optimal decision variables
print("x: ", prob.getSolution(x))
print("y: ",prob.getSolution(y))

# To display optimal value of objective function
print("Optimal Value of Objective Is = ", prob.getSolution(z))

5. OCTERACT for optimization in Python

  • Supported problems: LP, MIP, NLP, QCP, MIQCP, MIQCQP, DNLP, and DMINLP.
  • Supporting interfaces: OCTERACT, and PYOMO.
  • Supported scales: Small (free license), Medium (free license), and Large (free license).
  • Status: Free

Herein, I provide a coding example using “octeract” (a solver linker) in Python:

# Installation (Please refer to its website) (Requires its software to be installed)

from octeract import *

# Define environment
prob = Model("MyOptProblem")

# Define decision variables
prob.add_variable("x", 0, None, INT)
prob.add_variable("y", 0, None)

# Add objective function to the environment
prob.set_objective("2*x+5*y", MAXIMIZE)

# Add constraints to the environment
prob.add_constraint("5*x+3*y<=10")
prob.add_constraint("2*x+7*y<=9")

# To display optimal decision variables (using 4 threads)
prob.global_solve(4)

6. SCIP for optimization in Python

  • Supported problems: LP, MIP, NLP, MINLP, CNS, DNLP, and QCP.
  • Supporting interfaces: PYSCIPOPT, PULP, ORTOOLS, and CVXPY.
  • Supported scales: Small (free), Medium (free), and Large (free).
  • Status: Free

Herein, I provide a coding example using “pyscipopt” in Python:

# Installation (Requires msvc>=14.0 for building binaries from its source code) (Uncomment the Line Below)
# !pip install pyscipopt 

# Import package
import pyscipopt as op

# Define environment
prob = op.Model("MyOptProblem")  

# Define decision variables
x = prob.addVar("x", vtype="INTEGER")
y = prob.addVar("y")

# Add objective function to the environment
prob.setObjective(2*x+5*y,  sense='maximize')

# Add constraints to the environment
prob.addCons(5*x+3*y<=10)
prob.addCons(2*x+7*y<=9)

# The status of the solution
prob.optimize()

# To display optimal decision variables
sol = prob.getBestSol()
print("x: {}".format(sol[x]))
print("y: {}".format(sol[y]))

# To display optimal value of objective function
print("Optimal Value of Objective Is = ", prob.getObjective())

If this article is going to be used in research or other publishing methods, you can cite it as Tafakkori (2022) (in text) and refer to it as follows: Tafakkori, K. (2022). Using solvers for optimization in PythonSupply Chain Data Analytics. url: https://www.supplychaindataanalytics.com/using-solvers-for-optimization-in-python/

You May Also Like

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.