Ubicación de plantas con capacidad: estudio de caso P3

Analítica de la cadena de suministro en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Modelo de ubicación de plantas con capacidad

Modelado

  • Producción en plantas regionales
    • Dos tamaños de planta (baja / alta)
  • Exportar producción a otras regiones
  • Apertura/cierre de plantas

imagen de un globo con producción regional

Analítica de la cadena de suministro en Python

Rangos esperados

¿Qué valores esperamos para las variables de decisión?

Cantidades de producción:

  • Alta producción en regiones con bajos costes variables y de envío
  • Producción al máximo en regiones con costes fijos relativamente bajos

Plantas abiertas o cerradas:

  • Planta de alta capacidad en regiones con alta demanda
  • Planta de alta capacidad en regiones con costes fijos relativamente bajos
Analítica de la cadena de suministro en Python

Análisis de sensibilidad de restricciones

Producción total = Demanda total:

  • shadow prices = Cambio en el coste total por aumento de demanda en una región
  • slack = Debería ser cero

Producción total ≤ Capacidad total:

  • shadow prices = Cambio en el coste total por aumento de capacidad
  • slack = Regiones con capacidad sobrante
Analítica de la cadena de suministro en Python
from pulp import *
import pandas as pd

# Initialize Class
model = 
    LpProblem("Capacitated Plant Location Model",
               LpMinimize)

# Define Decision Variables
loc = ['A', 'B', 'C', 'D', 'E']
size = ['Low_Cap','High_Cap']
x = LpVariable.dicts(
                "production_", 
                [(i,j) for i in loc for j in loc],
                 lowBound=0, upBound=None, 
                 cat='Continuous')

y = LpVariable.dicts(
               "plant_", 
               [(i,s) for s in size for i in loc], 
                cat='Binary')
# Define Objective Function
model += 
  (lpSum([fix_cost.loc[i,s]*y[(i,s)] 
          for s in size for i in loc])
 + lpSum([var_cost.loc[i,j]*x[(i,j)] 
          for i in loc for j in loc]))

# Define the Constraints
for j in loc: model += 
  lpSum([x[(i, j)] 
        for i in loc]) == demand.loc[j,'Dmd']
for i in loc: model += 
  lpSum([x[(i, j)] for j in loc]) <= lpSum(
             [cap.loc[i,s]*y[(i,s)]for s in size])
Analítica de la cadena de suministro en Python
# Solve
model.solve()

# Print Decision Variables and Objective Value print(LpStatus[model.status]) o = [{'prod':"{} to {}".format(i,j), 'quant':x[(i,j)].varValue} for i in loc for j in loc] print(pd.DataFrame(o)) o = [{'loc':i, 'lc':y[(i,size[0])].varValue, 'hc':y[(i,size[1])].varValue} for i in loc] print(pd.DataFrame(o)) print("Objective = ", value(model.objective))
# Print Shadow Price and Slack o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} for name, c in model.constraints.items()] print(pd.DataFrame(o))
Analítica de la cadena de suministro en Python

Preguntas de negocio

Preguntas probables:

  • ¿Cuál es el coste esperado de esta red de suministro?

  • Si la demanda sube en una región, ¿cuánto margen hace falta para cubrir producción y envío a esa región?

  • ¿Qué regiones aún tienen capacidad para futuras subidas de demanda?

Analítica de la cadena de suministro en Python

Resumen

Repasado:

  • Rangos esperados de las variables de decisión
  • Interpretación del análisis de sensibilidad (shadow prices y slack)
  • Código para resolver y mostrar resultados
  • Posibles preguntas de negocio
Analítica de la cadena de suministro en Python

¡Buen trabajo! Tu turno

Analítica de la cadena de suministro en Python

Preparing Video For Download...