Solution de test par simulation

Analyse de la chaîne d’approvisionnement en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Attention

  • Évitez d'utiliser la PL ou la PI pour des problèmes très longs à résoudre

image d'avertissement, personne qui glisse

Analyse de la chaîne d’approvisionnement en Python

Concept global

Concept général :

  • Ajouter du bruit aléatoire aux entrées clés choisies
  • Résoudre le modèle à plusieurs reprises
  • Observer la distribution
Analyse de la chaîne d’approvisionnement en Python

Pourquoi essayer

Pourquoi :

  • Les entrées sont souvent des estimations ; elles peuvent être inexactes.
  • L'analyse de sensibilité précédente ne variait qu'une entrée à la fois.
Analyse de la chaîne d’approvisionnement en Python

Contexte

Contexte - Verrerie - Planification des ressources :

Ressource Prod. A Prod. B Prod. C
Profit $US $500 $450 $600

Contraintes :

  • Contraintes de demande, de capacité de production et de capacité d'entreposage

Risques :

  • Les estimations de profit peuvent être inexactes
Analyse de la chaîne d’approvisionnement en Python
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)

# Define Objective Function
model += 500 * A + 450 * B + 600 * C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Analyse de la chaîne d’approvisionnement en Python

Exemple de code - étape 2

a, b, c = normalvariate(0,25), 
          normalvariate(0,25),
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)

A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
a, b, c = normalvariate(0,25), 
          normalvariate(0,25), 
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Analyse de la chaîne d’approvisionnement en Python
def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits", LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), normalvariate(0,25), normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + (600+c)*C

    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 'C':C.varValue, 'Obj':value(model.objective)}
    return(o)
Analyse de la chaîne d’approvisionnement en Python

Exemple de code - étape 4

def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits",
                       LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), 
              normalvariate(0,25),
              normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + 
             (600+c)*C
    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 
         'C':C.varValue, 
         'Obj':value(model.objective)}
    return(o)
for i in range(100):
    output.append(run_pulp_model())
df = pd.DataFrame(output)
Analyse de la chaîne d’approvisionnement en Python

Exemple de code - étape 5

print(df['A'].value_counts())
print(df['B'].value_counts())
print(df['C'].value_counts())

Résultat : (les résultats peuvent varier)

6.666667    73
0.000000    14
8.000000    13
Name: A, dtype: int64
4.000000    73
5.454546    14
2.400000    13
Name: B, dtype: int64
0.000000    86
4.090909    14
Name: C, dtype: int64
Analyse de la chaîne d’approvisionnement en Python

Visualiser avec un histogramme

Produit A : histogramme des produits a, b, c et de l'objectif

Produit B : histogramme du produit b

Produit C : histogramme du produit c

Valeurs de l'objectif : histogramme des valeurs de l'objectif

Analyse de la chaîne d’approvisionnement en Python

Récapitulatif

  • À éviter pour les problèmes très longs à résoudre
  • Avantages

    • Voir comment les résultats optimaux évoluent quand les entrées changent
  • Étapes

    1. Partir du code PuLP standard
    2. Ajouter du bruit aux entrées clés avec normalvariate de Python
    3. Mettre le code PuLP dans une fonction qui renvoie la sortie du modèle
    4. Créer une boucle pour appeler la fonction et stocker les résultats dans un DataFrame
    5. Visualiser le DataFrame de résultats
Analyse de la chaîne d’approvisionnement en Python

À vous de jouer !

Analyse de la chaîne d’approvisionnement en Python

Preparing Video For Download...