Résoudre le modèle PuLP

Analytique de la chaîne d'approvisionnement avec 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 l'état de la solution
    • afficher les variables de décision optimisées
    • afficher la fonction objectif optimisée
Analytique de la chaîne d'approvisionnement avec Python

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

.solve(solver=None)
  • solver = Optionnel : solveur précis à utiliser, sinon le solveur par défaut.
Analytique de la chaîne d'approvisionnement avec 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()
Analytique de la chaîne d'approvisionnement avec Python

Résoudre le modèle — état de la solution

LpStatus[model.status]
  • Not Solved : État avant la résolution.
  • Optimal : Une solution optimale a été trouvée.
  • Infeasible : Aucune solution réalisable (p. 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 (p. 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 avr. 2016, benalexkeen.com/linear-programming-with-python-and-pulp-part-2/._{{5}}
Analytique de la chaîne d'approvisionnement avec 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
Analytique de la chaîne d'approvisionnement avec 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
Analytique de la chaîne d'approvisionnement avec 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  |
Analytique de la chaîne d'approvisionnement avec Python

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

Afficher la valeur de la fonction objectif optimisée :

print("Objective = ", value(model.objective))
Analytique de la chaîne d'approvisionnement avec 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
Analytique de la chaîne d'approvisionnement avec Python

Résumé

Résoudre le modèle

  • Appeler la méthode solve()
  • Vérifier l'état de la solution
  • Afficher les valeurs des variables de décision
  • Afficher la valeur de la fonction objectif
Analytique de la chaîne d'approvisionnement avec Python

Passons à la pratique !

Analytique de la chaîne d'approvisionnement avec Python

Preparing Video For Download...