Résoudre le modèle PuLP

Analyse de la chaîne d’approvisionnement en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Processus de modélisation courant avec PuLP

  1. Initialiser le modèle
  2. Définir les variables de décision
  3. Définir la fonction objectif
  4. Définir les contraintes
  5. Résoudre le modèle
    • appeler la méthode solve()
    • vérifier le statut de la solution
    • afficher les variables de décision optimisées
    • afficher la fonction objectif optimisée
Analyse de la chaîne d’approvisionnement en Python

Résoudre le modèle - méthode solve

.solve(solver=None)
  • solver = Optionnel : solveur spécifique à utiliser, sinon le solveur par défaut.
Analyse de la chaîne d’approvisionnement en Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264, 
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], 
                         lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]

# Solve Model
model.solve()
Analyse de la chaîne d’approvisionnement en Python

Résoudre le modèle - statut de la solution

LpStatus[model.status]
  • Not Solved : Statut avant la résolution du problème.
  • Optimal : Une solution optimale a été trouvée.
  • Infeasible : Aucune solution réalisable (ex. si vous imposez x ≤ 1 et x ≥ 2).
  • Unbounded : La fonction objectif n'est pas bornée ; maximiser ou minimiser tend vers l'infini (ex. si la seule contrainte est x ≥ 3).
  • Undefined : Une solution optimale peut exister mais n'a pas été trouvée.
1 Keen, Ben Alex. "Linear Programming with Python and PuLP 2 Part 2." _Ben Alex Keen_, 1 Apr. 2016, benalexkeen.com/linear-programming-with-python-and-pulp-part-2/._{{5}}
Analyse de la chaîne d’approvisionnement en Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264,
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]
# Solve Model
model.solve()
print("Status:", LpStatus[model.status])
Status: Optimal
Analyse de la chaîne d’approvisionnement en Python

Afficher les variables dans la sortie standard :

for v in model.variables():
    print(v.name, "=", v.varValue)

Structure de données pandas :

o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))
  • parcourir les variables du modèle
  • stocker les valeurs dans un DataFrame pandas
Analyse de la chaîne d’approvisionnement en Python
# Solve Model
model.solve()
print(LpStatus[model.status])
o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))

  Sortie :

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Analyse de la chaîne d’approvisionnement en Python

Résoudre le modèle - fonction objectif optimisée

Afficher la valeur de la fonction objectif optimisée :

print("Objective = ", value(model.objective))
Analyse de la chaîne d’approvisionnement en Python
# Solve Model
model.solve()
print(LpStatus[model.status])
output = []
for w in warehouse: t = [ship[(w,c)].varValue for c in cust] output.append(t)
opd = pd.DataFrame.from_records(output, index=warehouse, columns=cust)
print(opd)
print("Objective = ", value(model.objective))
Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Objective = 757700.0
Analyse de la chaîne d’approvisionnement en Python

Récapitulatif

Résoudre le modèle

  • Appeler la méthode solve()
  • Vérifier le statut de la solution
  • Afficher les valeurs des variables de décision
  • Afficher la valeur de la fonction objectif
Analyse de la chaîne d’approvisionnement en Python

Passons à la pratique !

Analyse de la chaîne d’approvisionnement en Python

Preparing Video For Download...