Localisation d'usines capacitaires – étude de cas P3

Analytique de la chaîne d'approvisionnement avec Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Modèle de localisation d'usines capacitaires

Modélisation

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

image d'un globe avec production régionale

Analytique de la chaîne d'approvisionnement avec Python

Plages attendues

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

Quantités de production :

  • 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 à grande capacité dans les régions à forte demande
  • Usine à grande capacité là où les coûts fixes sont relativement faibles
Analytique de la chaîne d'approvisionnement avec 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 = devrait être zéro

Production totale ≤ Capacité totale de production :

  • shadow prices = variation du coût total par hausse de la capacité de production
  • slack = régions ayant un surplus de capacité
Analytique de la chaîne d'approvisionnement avec 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])
Analytique de la chaîne d'approvisionnement avec 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))
Analytique de la chaîne d'approvisionnement avec Python

Questions d'affaires

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é pour une hausse future de la demande ?

Analytique de la chaîne d'approvisionnement avec Python

Sommaire

Révision :

  • Plages attendues des variables de décision
  • Interprétation de la sensibilité (shadow prices et slack)
  • Code pour résoudre et afficher les résultats
  • Questions d'affaires probables
Analytique de la chaîne d'approvisionnement avec Python

Excellent travail ! À vous

Analytique de la chaîne d'approvisionnement avec Python

Preparing Video For Download...