Analyse de sensibilité : prix d'ombre

Analyse de la chaîne d’approvisionnement en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Définir le prix d'ombre

Problèmes de modélisation :

  • Les paramètres des contraintes sont souvent des estimations
  • Des changements d'entrée modifieront‑ils notre solution ?

Prix d'ombre :

  • Variation de la valeur optimale de la fonction objectif pour une augmentation d'une unité du second membre d'une contrainte, toutes choses égales par ailleurs.
Analyse de la chaîne d’approvisionnement en Python

Contexte – Entreprise de verre – Planification des ressources :

Ressource Prod. A Prod. B Prod. C
Heures de production 6 5 8
Capacité entrepôt (pi²) 10,5 20 10
Profit $US 500 $ 450 $ 600 $

Contraintes :

  • Heures de capacité de production ≤ 60
  • Capacité d'entrepôt ≤ 150 pi²
  • Production max de A ≤ 8
Analyse de la chaîne d’approvisionnement en Python

Exemple de code

# Initialize Class, Define Vars., and Objective
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
model += 500 * A + 450 * B + 600 * C

# Constraint 1
model += 6 * A + 5 * B + 8 * C <= 60

# Constraint 2
model += 10.5 * A + 20 * B + 10 * C <= 150
# Constraint 3
model += A  <= 8

# Solve Model
model.solve()
print("Model Status: 
        {}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
    print(v.name, "=", v.varValue)
Analyse de la chaîne d’approvisionnement en Python

Solution de l'exemple

Solution :

Produits Prod. A Prod. B Prod. C
Caisses produites 6,667 4 0

Valeur de l'objectif : 5 133,33 $

Analyse de la chaîne d’approvisionnement en Python

Revoir les contraintes

Variable de décision :

  • A à C = nombre de caisses des produits A à C

Contraintes :

  • 6A + 5B + 8C ≤ 60 (capacité de production limitée)
  • 10A + 20B + 10C ≤ 150 (capacité d'entrepôt limitée)
  • A ≤ 8 (production max de A)
Analyse de la chaîne d’approvisionnement en Python

Afficher le prix d'ombre

Code Python :

o = [{'name':name, 'shadow price':c.pi} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Analyse de la chaîne d’approvisionnement en Python

Explication des prix d'ombre

Résultat :

  name  shadow price
   _C1     78.148148
   _C2      2.962963
   _C3     -0.000000

Rappel des contraintes :

  1. capacité de production limitée
  2. capacité d'entrepôt limitée
  3. production max de A
Analyse de la chaîne d’approvisionnement en Python

Lâchement (slack) d'une contrainte

slack :

  • Quantité de ressource non utilisée.

Python :

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

Explication du slack d'une contrainte

Résultat :

  name  shadow price     slack
   _C1     78.148148 -0.000000
   _C2      2.962963 -0.000000
   _C3     -0.000000  1.333333

À propos des contraintes actives

  • slack = 0 : active (binding)
  • Modifier une contrainte active modifie la solution

Rappel des contraintes :

  1. capacité de production limitée
  2. capacité d'entrepôt limitée
  3. production max de A
Analyse de la chaîne d’approvisionnement en Python

Récapitulatif

  • Calculer :
    • shadow prices
    • slack des contraintes
  • Identifier les contraintes actives
    • slack = 0 : active
    • slack > 0 : non active
Analyse de la chaîne d’approvisionnement en Python

Essayez !

Analyse de la chaîne d’approvisionnement en Python

Preparing Video For Download...