Liste des solveurs et modélisateurs de conception linéaire (LP) disponibles en Python

Il existe plusieurs applications d'optimisation en Python qui peuvent gérer les problèmes de planification linéaire (LP).

Les applications sont généralement classées dans les deux types suivants.

--Solver; Une application qui inclut un algorithme pour résoudre un problème --Modèle; Une application qui facilite la programmation des problèmes d'optimisation. Pontage entre les utilisateurs et le solveur

Nous avons résumé les combinaisons de Solveur et de Modeleur disponibles et un exemple d'implémentation simple de Modeler.

LP (Modeling & Solver summary)

LP Solver / Modeler PuLP Scipy CVXOPT PICOS Pyomo
GLPK ok ok ok ok
CBC ok ok
SCIP ok? ok ok
CPLEX ok ok ok
MOSEK ok ok
GUROBI ok ok ok
CVXOPT ok ok
SCIPY ok

Solver Install

En supposant un environnement mac.

Non commercial

brew install glpk
pip install swiglpk

Licences commerciales et académiques disponibles.

pip install mosek

and get academic license from https://www.mosek.com/products/academic-licenses/ if you can.

Modeler Install

pip install pulp scipy cvxopt picos pyomo

LP (Modeling)

Résolvons les problèmes suivants en utilisant chaque modeleur.

min -x+4y
s.t. -3x +  y ≤ 6
      -x - 2y ≥ -4
            y ≥ -3

PuLP

from pulp import LpVariable, LpProblem, value

x = LpVariable('x')
y = LpVariable('y', lowBound=-3)  # y ≥ -3

prob = LpProblem()
prob += -x + 4*y  #Fonction objective
prob += -3*x + y <= 6
prob += -x - 2*y >= -4

prob.solve()
print(value(prob.objective), value(x), value(y))

Available Solvers

CBC, CPLEX, GLPK, GUROBI, XPRESS, (CHOCO)

Vue des solveurs disponibles. (Référence; http://www.logopt.com/download/OptForPuzzle.pdf)

from pulp import LpSolver
def AvailableSolver(cls):
    for c in cls.__subclasses__():
        try:
            AvailableSolver(c)
            if c().available():
                print(c)
        except:
            pass
AvailableSolver(LpSolver)
from pulp import PULP_CBC_CMD # GLPK, SCIP
solver = PULP_CBC_CMD()  # solver=GLPK(), solver=SCIP()
prob.solve(solver=solver)

Scipy

min c^T x, s.t. Ax <= b

Changé la formulation pour la forme suivante

min -x+4y
s.t. -3x +  y ≤ 6
       x + 2y ≤ 4
           -y ≤ 3
from scipy.optimize import linprog

c = [-1, 4]
A = [[-3, 1], [1, 2]]
b = [6, 4]
bounds =[
    (None, None),  # -∞ ≤ x ≤ ∞
    (-3, None)     # -s ≤ y ≤ ∞
]

res = linprog(c, A_ub=A, b_ub=b, bounds=bounds)
print(res)

CVXOPT

min c^T x s.t. Gx <= h, Ax = b

Changé la formulation pour la forme suivante

min -x+4y
s.t. -3x +  y ≤ 6
       x + 2y ≤ 4
      0x + -y ≤ 3
from cvxopt import matrix, solvers

c = matrix([-1., 4.])
G = matrix([[-3., 1., 0.], [1., 2., -1.]])
h = matrix([6., 4., 3.])

sol = solvers.lp(c, G, h)
print(sol['primal objective'], sol['x'])

Available Solvers

conelp(CVXOPT), glpk, mosek

https://cvxopt.org/userguide/coneprog.html#s-lpsolver

sol = solvers.lp(c, G, h, solver='mosek') # solver='glpk'
print(sol['primal objective'], sol['x'])

CVXOPT (modeling)

from cvxopt import matrix
from cvxopt.modeling import variable, op

x = variable()
y = variable()

c1 = ( -3*x + y <= 6 )
c2 = ( -x - 2*y >= -4 )
c3 = ( y >= -3 )

lp = op(-x+4*y, [c1,c2,c3])

lp.solve()
print(lp.objective.value(), x.value, y.value)

Available Solvers

conelp(CVXOPT), glpk, mosek

sol = solvers.lp(c, G, h, solver='mosek') # solver='glpk'
print(sol['primal objective'], sol['x'])

PICOS (solver CVXOPT)

import picos as pic

prob = pic.Problem()

x = prob.add_variable('x')
y = prob.add_variable('y')

prob.set_objective('min', -x+4*y)
prob.add_constraint(-3*x + y <= 6)
prob.add_constraint(-x - 2*y >= -4)
prob.add_constraint(y >= -3)

sol = prob.solve()
print(sol.value, x.value, y.value)
/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:5: DeprecationWarning: Problem.add_variable is deprecated: Variables can now be created independent of problems, and do not need to be added to any problem explicitly.
  """
/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Problem.add_variable is deprecated: Variables can now be created independent of problems, and do not need to be added to any problem explicitly.

Available Solvers

https://picos-api.gitlab.io/picos/api/picos.modeling.options.html#option-solver

sol = prob.solve(solver='glpk')
print(sol.value, x.value, y.value)

Pyomo

import pyomo.environ as pyo

model = pyo.ConcreteModel()

model.x = pyo.Var()
model.y = pyo.Var()

model.OBJ = pyo.Objective(expr=-model.x + 4*model.y)

# add constraints
model.Constraint1 = pyo.Constraint(expr=-3*model.x+model.y <= 6)
model.Constraint2 = pyo.Constraint(expr=-model.x-2*model.y >= -4)
model.Constraint3 = pyo.Constraint(expr=model.y >= -3)

# add constraints
# def rule(model, i):
#     A = [[-3, 1], [1, 2], [0, -1]]
#     b = [6, 4, 3]
#     return A[i][0]*model.x + A[i][1]*model.y <= b[i]

# model.const_set = pyo.Set(initialize=[0, 1, 2])
# model.CONSTRAINTS = pyo.Constraint(model.const_set, rule=rule)

opt = pyo.SolverFactory('glpk')
res = opt.solve(model)
print(model.OBJ(), model.x(), model.y())

Available Solvers

Serial Solver Interfaces
------------------------
The serial, pyro and phpyro solver managers support the following
solver interfaces:

    asl                  + Interface for solvers using the AMPL Solver
                           Library
    baron                  The BARON MINLP solver
    bilevel_blp_global   + Global solver for continuous bilevel linear
                           problems
    bilevel_blp_local    + Local solver for continuous bilevel linear
                           problems
    bilevel_bqp          + Global solver for bilevel quadratic
                           problems
    bilevel_ld           + Solver for bilevel problems using linear
                           duality
    cbc                    The CBC LP/MIP solver
    conopt                 The CONOPT NLP solver
    contrib.gjh            Interface to the AMPL GJH "solver"
    cplex                  The CPLEX LP/MIP solver
    cplex_direct           Direct python interface to CPLEX
    cplex_persistent       Persistent python interface to CPLEX
    gams                   The GAMS modeling language
    gdpbb                * Branch and Bound based GDP Solver
    gdpopt               * The GDPopt decomposition-based Generalized
                           Disjunctive Programming (GDP) solver
    glpk                 * The GLPK LP/MIP solver
    gurobi                 The GUROBI LP/MIP solver
    gurobi_direct          Direct python interface to Gurobi
    gurobi_persistent      Persistent python interface to Gurobi
    ipopt                  The Ipopt NLP solver
    mindtpy              * MindtPy: Mixed-Integer Nonlinear
                           Decomposition Toolbox in Pyomo
    mosek                * Direct python interface to Mosek
    mpec_minlp           + MPEC solver transforms to a MINLP
    mpec_nlp             + MPEC solver that optimizes a nonlinear
                           transformation
    multistart           * MultiStart solver for NLPs
    path                   Nonlinear MCP solver
    pico                   The PICO LP/MIP solver
    ps                   * Pyomo's simple pattern search optimizer
    py                   + Direct python solver interfaces
    scip                   The SCIP LP/MIP solver
    trustregion          * Trust region filter method for black
                           box/glass box optimization
    xpress                 The XPRESS LP/MIP solver

https://pyomo.readthedocs.io/en/stable/solving_pyomo_models.html

Résumé avec d'autres

  1. Scipy est gênant car il doit être saisi sous la forme d'une matrice de contraintes.
  2. PuLP et CVXOPT sont installés avec Solver, vous pouvez donc résoudre le problème immédiatement.
  3. CVXOPT et PICOS sont très polyvalents car ils peuvent résoudre des problèmes autres que la planification linéaire (comme la planification secondaire, qui est le CVXOPT principal).
  4. La mise en œuvre de Pyomo a une forte habitude.

Recommended Posts

Liste des solveurs et modélisateurs de conception linéaire (LP) disponibles en Python
"Régression linéaire" et "Version probabiliste de la régression linéaire" en Python "Régression linéaire de Bayes"
Différence entre list () et [] en Python
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
Afficher une liste d'alphabets en Python 3
Différence entre append et + = dans la liste Python
Résumé des méthodes intégrées, etc. de la liste Python
Projet Euler # 1 "Multiple de 3 et 5" en Python
Programmation avec Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Qu'est-ce que la «programmation fonctionnelle» et «orientée objet»? Édition Python
Copiez la liste en Python
Matrice unitaire et matrice inverse: Algèbre linéaire en Python <4>
Liste de code Python à déplacer et à mémoriser
Produit intérieur et vecteur: Algèbre linéaire en Python <2>
Calcul matriciel et équations linéaires: Algèbre linéaire en Python <3>
Explication de la distance d'édition et de l'implémentation en Python
traitement (python) Diagramme les coordonnées de la liste Spécifiez le nombre de fois dans draw ()
Liste des principales distributions de probabilité utilisées en apprentissage automatique et statistiques et code en python
Liste triée en Python
Liste des modules python
Note d'apprentissage Python de Mayungo: liste d'histoires et de liens
Traitement pleine largeur et demi-largeur des données CSV en Python
Calcul de l'écart type et du coefficient de corrélation en Python
Implémentation de List et Bool en Python et SQLite3 (note personnelle)
Liste des bibliothèques Python pour les data scientists et les data ingénieurs
Liste de filtres en Python
[python] Récupère la liste des classes définies dans le module
Différence entre Ruby et Python en termes de variables
[Python] Manipulation des éléments dans la liste (tableau) [Ajouter / Supprimer]
Liste du code Python utilisé dans l'analyse de Big Data
[Python] Comment trier un dict dans une liste et une instance dans une liste
Recherche linéaire en Python
La chose semblable à une recherche de liste en Python
J'ai étudié le temps de calcul de "X dans la liste" (recherche linéaire / recherche dichotomique) et "X dans l'ensemble"
[Python] Affiche toutes les combinaisons d'éléments de la liste
Regrouper par éléments consécutifs d'une liste en Python
Exemple d'obtention du nom du module et du nom de la classe en Python
Récapitulatif du traitement de la date en Python (datetime et dateutil)
Crache une liste de noms de fichiers, de dates de dernière modification et de codes de caractères en python3
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
[Calcul scientifique / technique par Python] Liste des matrices qui apparaissent dans Hinpan en algèbre linéaire numérique
Liste des informations sur les arguments de méthode pour les classes et les modules en Python
En Python, les éléments de la liste sont triés et sortis sous forme d'éléments et de multiples.
Considérez si la programmation était un anime en Python et C
Avoir le graphique d'équation de la fonction linéaire dessiné en Python
Méthode de concaténation de liste en python, différence entre list.extend () et opérateur «+»
Obtenez le nombre d'éléments spécifiques dans la liste python
Ordre de référence des variables de classe et des variables d'instance dans "self. Variables de classe" en Python
Astuces utiles liées à la liste et aux instructions en Python
Décrypter une ligne de code en Python lambda, carte, liste
J'ai essayé de programmer le test du chi carré en Python et Java.
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Première physique computationnelle: mécanique quantique et algèbre linéaire avec python.
Obtenir l'index de la nième valeur la plus grande / la plus petite de la liste en Python
Comment obtenir une liste d'exceptions intégrées pour python
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
[Python] Forces et faiblesses de DataFrame en termes de temps requis
[Astuces] Problèmes et solutions dans le développement de python + kivy