Resuelve el modelo de PuLP

Analítica de la cadena de suministro en Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Proceso común de modelado en PuLP

  1. Inicializar el modelo
  2. Definir variables de decisión
  3. Definir la función objetivo
  4. Definir las restricciones
  5. Resolver el modelo
    • llamar al método solve()
    • comprobar el estado de la solución
    • imprimir variables de decisión óptimas
    • imprimir la función objetivo óptima
Analítica de la cadena de suministro en Python

Resolver modelo: método solve

.solve(solver=None)
  • solver = Opcional: solver específico a usar; por defecto, el predeterminado.
Analítica de la cadena de suministro en Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264, 
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], 
                         lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]

# Solve Model
model.solve()
Analítica de la cadena de suministro en Python

Resolver modelo: estado de la solución

LpStatus[model.status]
  • Not Solved: Estado previo a resolver el problema.
  • Optimal: Se encontró una solución óptima.
  • Infeasible: No hay soluciones factibles (p. ej., si pones las restricciones x ≤ 1 y x ≥ 2).
  • Unbounded: La función objetivo no está acotada; maximizar o minimizar tiende a infinito (p. ej., si la única restricción fuera x ≥ 3).
  • Undefined: Puede existir una solución óptima, pero no se ha encontrado.
1 Keen, Ben Alex. “Linear Programming with Python and PuLP 2 Part 2.” _Ben Alex Keen_, 1 Apr. 2016, benalexkeen.com/linear-programming-with-python-and-pulp-part-2/._{{5}}
Analítica de la cadena de suministro en Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264,
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]
# Solve Model
model.solve()
print("Status:", LpStatus[model.status])
Status: Optimal
Analítica de la cadena de suministro en Python

Imprime variables en la salida estándar:

for v in model.variables():
    print(v.name, "=", v.varValue)

Estructura de datos de pandas:

o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))
  • recorre variables del modelo
  • guarda valores en un DataFrame de pandas
Analítica de la cadena de suministro en Python
# Solve Model
model.solve()
print(LpStatus[model.status])
o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))

  Salida:

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Analítica de la cadena de suministro en Python

Resolver modelo: función objetivo óptima

Imprime el valor de la función objetivo óptima:

print("Objective = ", value(model.objective))
Analítica de la cadena de suministro en Python
# Solve Model
model.solve()
print(LpStatus[model.status])
output = []
for w in warehouse: t = [ship[(w,c)].varValue for c in cust] output.append(t)
opd = pd.DataFrame.from_records(output, index=warehouse, columns=cust)
print(opd)
print("Objective = ", value(model.objective))
Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Objective = 757700.0
Analítica de la cadena de suministro en Python

Resumen

Resolver el modelo

  • Llamar al método solve()
  • Comprobar el estado de la solución
  • Imprimir valores de las variables de decisión
  • Imprimir valor de la función objetivo
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...