Localisation d'usines capacitaires - étude de cas P3

Analyse de la chaîne d’approvisionnement en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Modèle de localisation d'usines capacitaires

Modélisation

  • Production dans des sites régionaux
    • Deux tailles d'usine (faible / élevée)
  • Export de la production vers d'autres régions
  • Ouverture / fermeture des sites de production

image du globe avec production régionale

Analyse de la chaîne d’approvisionnement en Python

Plages attendues

À quoi s'attendre pour les valeurs de nos variables de décision ?

Quantités produites :

  • Production élevée dans les régions aux coûts variables et d'expédition faibles
  • Production au maximum là où les coûts fixes sont aussi relativement bas

Usine ouverte ou fermée :

  • Usine à haute capacité dans les régions à forte demande
  • Usine à haute capacité là où les coûts fixes sont relativement faibles
Analyse de la chaîne d’approvisionnement en Python

Analyse de sensibilité des contraintes

Production totale = Demande totale :

  • shadow prices = variation du coût total par hausse de la demande d'une région
  • slack = doit être nul

Production totale ≤ Capacité totale de production :

  • shadow prices = variation des coûts totaux par hausse de capacité
  • slack = régions avec capacité excédentaire
Analyse de la chaîne d’approvisionnement en Python
from pulp import *
import pandas as pd

# Initialize Class
model = 
    LpProblem("Capacitated Plant Location Model",
               LpMinimize)

# Define Decision Variables
loc = ['A', 'B', 'C', 'D', 'E']
size = ['Low_Cap','High_Cap']
x = LpVariable.dicts(
                "production_", 
                [(i,j) for i in loc for j in loc],
                 lowBound=0, upBound=None, 
                 cat='Continuous')

y = LpVariable.dicts(
               "plant_", 
               [(i,s) for s in size for i in loc], 
                cat='Binary')
# Define Objective Function
model += 
  (lpSum([fix_cost.loc[i,s]*y[(i,s)] 
          for s in size for i in loc])
 + lpSum([var_cost.loc[i,j]*x[(i,j)] 
          for i in loc for j in loc]))

# Define the Constraints
for j in loc: model += 
  lpSum([x[(i, j)] 
        for i in loc]) == demand.loc[j,'Dmd']
for i in loc: model += 
  lpSum([x[(i, j)] for j in loc]) <= lpSum(
             [cap.loc[i,s]*y[(i,s)]for s in size])
Analyse de la chaîne d’approvisionnement en Python
# Solve
model.solve()

# Print Decision Variables and Objective Value print(LpStatus[model.status]) o = [{'prod':"{} to {}".format(i,j), 'quant':x[(i,j)].varValue} for i in loc for j in loc] print(pd.DataFrame(o)) o = [{'loc':i, 'lc':y[(i,size[0])].varValue, 'hc':y[(i,size[1])].varValue} for i in loc] print(pd.DataFrame(o)) print("Objective = ", value(model.objective))
# Print Shadow Price and Slack o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} for name, c in model.constraints.items()] print(pd.DataFrame(o))
Analyse de la chaîne d’approvisionnement en Python

Questions métier

Questions probables :

  • Quel est le coût attendu de ce réseau de chaîne d'approvisionnement ?

  • Si la demande augmente dans une région, quelle marge faut-il pour couvrir les coûts de production et d'expédition vers cette région ?

  • Quelles régions disposent encore de capacité de production pour une hausse future de la demande ?

Analyse de la chaîne d’approvisionnement en Python

Résumé

Récapitulatif :

  • Plages attendues des variables de décision
  • Interprétation des résultats de l'analyse de sensibilité (shadow prices et slack)
  • Code pour résoudre et afficher les résultats
  • Questions métier probables
Analyse de la chaîne d’approvisionnement en Python

Excellent travail ! À vous de jouer

Analyse de la chaîne d’approvisionnement en Python

Preparing Video For Download...