Analyse de sensibilité des prix d'ombre

Analytique de la chaîne d'approvisionnement avec Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Définir le prix d'ombre

Problèmes de modélisation :

  • Les données des contraintes sont souvent des estimations
  • Des changements d'entrée modifieront-ils la solution ?

Prix d'ombre :

  • Variation de la valeur optimale de la fonction objectif par augmentation d'une unité du membre de droite d'une contrainte, toutes choses égales par ailleurs.
Analytique de la chaîne d'approvisionnement avec Python

Contexte – entreprise de verre – planification des ressources :

Ressource Prod. A Prod. B Prod. C
Heures de production 6 5 8
Capacité d'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 maximale de A ≤ 8
Analytique de la chaîne d'approvisionnement avec 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)
Analytique de la chaîne d'approvisionnement avec Python

Solution – exemple

Solution :

Produits Prod. A Prod. B Prod. C
Caisses produites 6.667 4 0

Valeur de l'objectif : 5 133,33 $

Analytique de la chaîne d'approvisionnement avec Python

Réviser 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 maximale de A)
Analytique de la chaîne d'approvisionnement avec 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))
Analytique de la chaîne d'approvisionnement avec Python

Explication des prix d'ombre

Sortie :

  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 maximale de A
Analytique de la chaîne d'approvisionnement avec Python

Laxité d'une contrainte

slack :

  • Quantité de ressource inutilisée.

Python :

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

Explication de la laxité

Sortie :

  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
  • 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 maximale de A
Analytique de la chaîne d'approvisionnement avec Python

Résumé

  • Comment calculer :
    • les shadow prices
    • la slack d'une contrainte
  • Repérer les contraintes actives
    • slack = 0 : active
    • slack > 0 : non active
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...