Restricciones lógicas

Analítica de la cadena de suministro en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Problema de ejemplo

Peso máximo: 20.000 lb

Producto Peso (lb) Rentabilidad ($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
  • Selecciona los productos más rentables sin exceder el límite de peso
  • Variables de decisión:
    • X$_{i}$ = 1 si el producto _i_ se selecciona; si no, 0
  • Objetivo:
    • Maximizar z = $\sum$ Rentabilidad$_{i}$X$_{i}$
  • Restricción:
    • $\sum$ Peso$_{i}$X$_{i}$ < 20.000
Analítica de la cadena de suministro en 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))
Analítica de la cadena de suministro en Python

Resultado de ejemplo

Peso máximo: 20.000 lb

Producto ¿Enviar?
A No
B No
C No
D Sí
E Sí
F Sí

Resultado

  • Rentabilidad: 230.307 $
  • Peso de productos: 15.700 lb
Analítica de la cadena de suministro en Python

Ejemplo de restricción lógica 1

Se selecciona el producto E o el producto D, pero no ambos.

  • X$_{E}$ = 1 si el producto _i_ se selecciona; si no, 0
  • X$_{D}$ = 1 si el producto _i_ se selecciona; si no, 0
  • Restricción
    • X$_{E}$ + X$_{D}$ ≤ 1
Analítica de la cadena de suministro en Python

Ejemplo de código - restricción lógica 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))
Analítica de la cadena de suministro en Python

Resultado del ejemplo de restricción lógica 1

Peso máximo: 20.000 lb

Producto ¿Enviar?
A No
B No
C Sí
D Sí
E No
F Sí

Resultado

  • Rentabilidad: 228.916 $
  • Peso de productos: 15.800 lb
Analítica de la cadena de suministro en Python

Ejemplo de restricción lógica 2

Si se selecciona el producto D, también debe seleccionarse el producto B.

  • X$_{D}$ = 1 si el producto _i_ se selecciona; si no, 0
  • X$_{B}$ = 1 si el producto _i_ se selecciona; si no, 0
  • Restricción
    • X$_{D}$ ≤ X$_{B}$
Analítica de la cadena de suministro en Python

Ejemplo de código - restricción lógica 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))
Analítica de la cadena de suministro en Python

Resultado del ejemplo de restricción lógica 2

Peso máximo: 20.000 lb

Producto ¿Enviar?
A No
B Sí
C No
D Sí
E No
F Sí

Resultado

  • Rentabilidad: 228.901 $
  • Peso de productos: 15.300 lb
Analítica de la cadena de suministro en Python

Otras restricciones lógicas

Restricción lógica Restricción
Si se selecciona el ítem _i_, también se selecciona el ítem _j_. x$_{i}$ - x$_{j}$ ≤ 0
Se selecciona el ítem _i_ o el ítem _j_, pero no ambos. x$_{i}$ + x$_{j}$ = 1
Si se selecciona el ítem _i_, no se selecciona el ítem _j_. x$_{i}$ - x$_{j}$ ≤ 1
Si no se selecciona el ítem _i_, no se selecciona el ítem _j_. -x$_{i}$ + x$_{j}$ ≤ 0
Como mucho uno de los ítems _i_, _j_ y _k_ se selecciona. x$_{i}$ + x$_{j}$ + x$_{k}$ ≤ 1
1 James Orlin y Ebrahim Nasrabadi. 15.053 Optimization Methods in Management Science. Primavera de 2013. Massachusetts Institute of Technology: MIT OpenCourseWare. Licencia: Creative Commons BY-NC-SA.
Analítica de la cadena de suministro en Python

Resumen

  • Repasamos ejemplos de restricciones lógicas
  • Tabla con otras restricciones lógicas
Analítica de la cadena de suministro en Python

¡Tu turno!

Analítica de la cadena de suministro en Python

Preparing Video For Download...