Contraintes logiques

Analytique de la chaîne d'approvisionnement avec Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Problème exemple

Poids maximal 20 000 lb

Produit Poids (lb) Rentabilité ($US)
A 12 800 77 878
B 10 900 82 713
C 11 400 82 728
D 2 100 68 423
E 11 300 84 119
F 2 300 77 765
  • Choisir les produits les plus rentables sans dépasser la limite de poids
  • Variables de décision :
    • X$_{i}$ = 1 si le produit _i_ est choisi, sinon 0
  • Objectif :
    • Maximiser z = $\sum$ Rentabilité$_{i}$X$_{i}$
  • Contrainte :
    • $\sum$ Poids$_{i}$X$_{i}$ < 20 0000
Analytique de la chaîne d'approvisionnement avec Python
prod = ['A', 'B', 'C', 'D', 'E', 'F']
weight = {'A':12800, 'B':10900, 'C':11400, 'D':2100, 'E':11300, 'F':2300}
prof = {'A':77878, 'B':82713, 'C':82728, 'D':68423, 'E':84119, 'F':77765}

# Initialize Class model = LpProblem("Loading Truck Problem", LpMaximize) # Define Decision Variables x = LpVariable.dicts('ship_', prod, cat='Binary')
# Define Objective model += lpSum([prof[i]*x[i] for i in prod]) # Define Constraint model += lpSum([weight[i]*x[i] for i in prod]) <= 20000
# Solve Model model.solve() for i in prod: print("{} status {}".format(i, x[i].varValue))
Analytique de la chaîne d'approvisionnement avec Python

Résultat de l'exemple

Poids maximal 20 000 lb

Produit Expédier ou non
A Non
B Non
C Non
D Oui
E Oui
F Oui

Résultat

  • Rentabilité : 230 307 $US
  • Poids des produits : 15 700 lb
Analytique de la chaîne d'approvisionnement avec Python

Exemple de contrainte logique 1

Soit le produit E est choisi, soit le produit D est choisi, mais pas les deux.

  • X$_{E}$ = 1 si le produit _i_ est choisi, sinon 0
  • X$_{D}$ = 1 si le produit _i_ est choisi, sinon 0
  • Contrainte
    • X$_{E}$ + X$_{D}$ ≤ 1
Analytique de la chaîne d'approvisionnement avec Python

Exemple de code - contrainte logique 1

model += x['E'] + x['D'] <= 1
prod = ['A', 'B', 'C', 'D', 'E', 'F']
weight = {'A':12800, 'B':10900, 'C':11400, 
          'D':2100, 'E':11300, 'F':2300}
prof = {'A':77878, 'B':82713, 'C':82728, 
        'D':68423, 'E':84119, 'F':77765}

# Initialize Class
model = LpProblem("Loading Truck Problem",
                   LpMaximize)

# Define Decision Variables
x = LpVariable.dicts('ship_', prod, 
                      cat='Binary')
# Define Objective
model += lpSum([prof[i]*x[i] for i in prod])

# Define Constraint
model += 
  lpSum([weight[i]*x[i] for i in prod]) <= 20000
model += x['E'] + x['D'] <= 1

# Solve Model
model.solve()
for i in prod:
  print("{} status {}".format(i, x[i].varValue))
Analytique de la chaîne d'approvisionnement avec Python

Résultat — contrainte logique 1

Poids maximal 20 000 lb

Produit Expédier ou non
A Non
B Non
C Oui
D Oui
E Non
F Oui

Résultat

  • Rentabilité : 228 916 $US
  • Poids des produits : 15 800 lb
Analytique de la chaîne d'approvisionnement avec Python

Exemple de contrainte logique 2

Si le produit D est choisi, le produit B doit aussi l'être.

  • X$_{D}$ = 1 si le produit _i_ est choisi, sinon 0
  • X$_{B}$ = 1 si le produit _i_ est choisi, sinon 0
  • Contrainte
    • X$_{D}$ ≤ X$_{B}$
Analytique de la chaîne d'approvisionnement avec Python

Exemple de code - contrainte logique 2

model += x['D'] <= x['B']

prod = ['A', 'B', 'C', 'D', 'E', 'F'] weight = {'A':12800, 'B':10900, 'C':11400, 'D':2100, 'E':11300, 'F':2300} prof = {'A':77878, 'B':82713, 'C':82728, 'D':68423, 'E':84119, 'F':77765} # Initialize Class model = LpProblem("Loading Truck Problem", LpMaximize) # Define Decision Variables x = LpVariable.dicts('ship_', prod, cat='Binary')
# Define Objective
model += lpSum([prof[i]*x[i] for i in prod])

# Define Constraint
model += 
 lpSum([weight[i]*x[i] for i in prod]) <= 20000
model += x['D'] <= x['B']

# Solve Model
model.solve()
for i in prod:
  print("{} status {}".format(i, x[i].varValue))
Analytique de la chaîne d'approvisionnement avec Python

Résultat — contrainte logique 2

Poids maximal 20 000 lb

Produit Expédier ou non
A Non
B Oui
C Non
D Oui
E Non
F Oui

Résultat

  • Rentabilité : 228 901 $US
  • Poids des produits : 15 300 lb
Analytique de la chaîne d'approvisionnement avec Python

Autres contraintes logiques

Contrainte logique Contrainte
Si l'item _i_ est choisi, alors l'item _j_ est aussi choisi. x$_{i}$ - x$_{j}$ ≤ 0
Soit l'item _i_ est choisi, soit l'item _j_ est choisi, mais pas les deux. x$_{i}$ + x$_{j}$ = 1
Si l'item _i_ est choisi, alors l'item _j_ n'est pas choisi. x$_{i}$ - x$_{j}$ ≤ 1
Si l'item _i_ n'est pas choisi, alors l'item _j_ n'est pas choisi. -x$_{i}$ + x$_{j}$ ≤ 0
Au plus un des items _i_, _j_ et _k_ est choisi. x$_{i}$ + x$_{j}$ + x$_{k}$ ≤ 1
1 James Orlin et Ebrahim Nasrabadi. 15.053 Optimization Methods in Management Science. Printemps 2013. Massachusetts Institute of Technology : MIT OpenCourseWare. Licence : Creative Commons BY-NC-SA.
Analytique de la chaîne d'approvisionnement avec Python

Résumé

  • Exemples de contraintes logiques passés en revue
  • Tableau d'autres contraintes logiques présenté
Analytique de la chaîne d'approvisionnement avec Python

À vous de jouer !

Analytique de la chaîne d'approvisionnement avec Python

Preparing Video For Download...