Fundamentos del modelado con PuLP

Analítica de la cadena de suministro en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

¿Qué es PuLP?

  • PuLP es un marco de modelado para problemas de Programación Lineal (LP) y Entera (IP) en Python

  • Mantenido por la fundación COIN-OR (Computational Infrastructure for Operations Research)

  • PuLP se integra con solvers

    • CPLEX
    • COIN
    • Gurobi
    • etc.
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  • Consultoría para una pastelería boutique que vende 2 tipos de tartas
  • Mes de 30 días
  • Hay:
    • 1 horno
    • 2 panaderos
    • 1 empaquetador: trabaja solo 22 días
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  • Necesidades de recursos distintas para los 2 tipos de tartas:
Tarta A Tarta B
Horno 0.5 días 1 día
Panaderos 1 día 2.5 días
Empaquetadores 1 día 2 días

.

Tarta A Tarta B
Beneficio $20.00 $40.00
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  • Objetivo: maximizar el beneficio
    • Beneficio = 20*A + 40*B
  • Sujeto a:
    • A ≥ 0
    • B ≥ 0
    • 0.5A + 1B ≤ 30
    • 1A + 2.5B ≤ 60
    • 1A + 2B ≤ 22
Analítica de la cadena de suministro en Python

Proceso común de modelado con PuLP

  1. Inicializar modelo
  2. Definir variables de decisión
  3. Definir la función objetivo
  4. Definir las restricciones
  5. Resolver modelo
Analítica de la cadena de suministro en Python

Inicializar el modelo - LpProblem()

LpProblem(name='NoName', sense=LpMinimize)
  • name = Nombre del problema en el archivo .lp de salida, p. ej., "My LP Problem"
  • sense = Maximizar o minimizar la función objetivo
    • Minimizar = LpMinimize (predeterminado)
    • Maximizar = LpMaximize
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  1. Inicializa el modelo
from pulp import *

# Inicializar clase
model = LpProblem("Maximize Bakery Profits", LpMaximize)
Analítica de la cadena de suministro en Python

Definir variables de decisión - LpVariable()

LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)
  • name = Nombre de la variable en el archivo .lp de salida
  • lowBound = Cota inferior
  • upBound = Cota superior
  • cat = Tipo de variable
    • Integer
    • Binary
    • Continuous (predeterminado)
  • e = Para modelado por columnas
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  1. Inicializa la clase
  2. Define variables
# Definir variables de decisión
A = LpVariable('A', lowBound=0, cat='Integer')
B = LpVariable('B', lowBound=0, cat='Integer')
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  1. Inicializa la clase
  2. Define variables
  3. Define la función objetivo
# Definir función objetivo
model += 20 * A + 40 * B
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  1. Inicializa la clase
  2. Define variables
  3. Define la función objetivo
  4. Define las restricciones
# Definir restricciones
model += 0.5 * A + 1 * B <= 30
model += 1 * A + 2.5 * B <= 60
model += 1 * A + 2 * B <= 22
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

  1. Inicializa la clase
  2. Define variables
  3. Define la función objetivo
  4. Define las restricciones
  5. Resuelve el modelo
# Resolver modelo
model.solve()
print("Produce {} Cake A".format(A.varValue))
print("Produce {} Cake B".format(B.varValue))
Analítica de la cadena de suministro en Python

Ejemplo PuLP – asignación de recursos

from pulp import *

# Inicializar clase
model = LpProblem("Maximize Bakery Profits",
                   LpMaximize)

# Definir variables de decisión
A = LpVariable('A', lowBound=0,
                cat='Integer')
B = LpVariable('B', lowBound=0, 
                cat='Integer')

# Definir función objetivo
model += 20 * A + 40 * B
# Definir restricciones
model += 0.5 * A + 1 * B <= 30
model += 1 * A + 2.5 * B <= 60
model += 1 * A + 2 * B <= 22

# Resolver modelo
model.solve()
print("Produce {} Cake A".format(A.varValue))
print("Produce {} Cake B".format(B.varValue))
Analítica de la cadena de suministro en Python

Resumen

  • PuLP es un modelador LP/IP en Python
  • 5 pasos del proceso de modelado con PuLP

    1. Inicializar modelo
    2. Definir variables de decisión
    3. Definir la función objetivo
    4. Definir las restricciones
    5. Resolver modelo
  • Ejemplo de asignación de recursos completado

Analítica de la cadena de suministro en Python

¡Vamos a practicar!

Analítica de la cadena de suministro en Python

Preparing Video For Download...