Chocolatería - Solución#
Tags: Introducción, Dos variables
Show code cell source
import os
# Por precaución, cambiamos el directorio activo de Python a aquel que contenga este notebook
if "optimizacion" in os.listdir():
os.chdir(r"optimizacion/Formulaciones/1. Chocolateria/")
Enunciado#
La chocolatería Perla Caribe es un pequeño emprendimiento que fabrica y comercializa chocolates artesanales con cacao de distintas variedades comprado directamente a agricultores locales. Actualmente producen dos tipos de chocolates: chocolate oscuro y chocolate blanco. Una unidad de cualquier tipo de chocolate pesa 60g. Una unidad de chocolate oscuro se vende a 7,000 COP y una unidad de chocolate blanco se vende a 6,000 COP. Los costos asociados a materia prima, mano de obra y demás costos operacionales equivalen a 3,500 COP por cada unidad de chocolate oscuro y 2,000 COP por cada unidad de chocolate blanco.
La producción de estos chocolates requiere de dos ingredientes en común: manteca de cacao y azúcar. Por cada unidad de chocolate oscuro se requiere 6g de manteca de cacao y 21 g de azúcar. Por cada unidad de chocolate blanco se requiere 22g de manteca de cacao y 18g de azúcar. Cada semana, la chocolatería Perla Caribe tiene disponible 12kg de manteca de cacao y 20kg de azúcar. La demanda de chocolate oscuro es ilimitada, pero a lo sumo le demandan 315 unidades de chocolate blanco por semana.
La chocolatería Perla Caribe quiere maximizar su utilidad (ingresos menos costos). Formule un modelo matemático que represente la situación y que les permita cumplir con su objetivo.
Formulación#
Variables de decisión#
a. Escriba término a término la(s) variable(s) de decisión que utilizará en el modelo.
Restricciones#
b.
i. Escribe término a término la(s) restricción(es) lineal(es) y descríbala(s).
Se debe respetar la disponibilidad de manteca de cacao:
Se debe respetar la disponibilidad de azucar:
No se debe sobrepasar la demanda máxima de chocolate blanco:
Naturaleza de las Variables#
ii. Escribe término a término la naturaleza de las variables.
Solo pueden producirse cantidades positivas de ambos tipos de chocolate:
Función objetivo#
c. Escribe término a término la función objetivo que maximiza la utilidad.
La función objetivo maximiza las utilidades.
Implementación#
Librerías#
Importa la librería pulp
para crear y resolver el modelo.
import pulp as lp
Objeto del modelo#
Construye un problema al que luego agregarás las restricciones y la función objetivo.
problema = lp.LpProblem(name="Perla_Caribe", sense=lp.LpMaximize)
Variables de decisión#
Define una a una las variables del problema.
# Unidades de chocolate oscuro producidas cada semana
x_1 = lp.LpVariable(
name="Choco_oscuro",
lowBound=0,
upBound=None,
cat=lp.LpContinuous,
)
# Unidades de chocolate blanco producidas cada semana
x_2 = lp.LpVariable(
name="Choco_blanco",
lowBound=0,
upBound=None,
cat=lp.LpContinuous,
)
Función objetivo#
Agrega al problema la función objetivo. Recuerda que al definir el problema, ya definiste si este es de maximización o minimización.
problema += 3500 * x_1 + 4000 * x_2, "Utilidades_totales"
Restricciones#
Agrega al problema las restricciones del modelo.
# Respeta la disponibilidad de manteca de cacao
problema += 6 * x_1 + 22 * x_2 <= 12000, "Manteca_cacao"
# Respeta la disponibilidad de azucar
problema += 21 * x_1 + 18 * x_2 <= 20000, "Azucar"
# Garantiza que la producción no sobrepase a lo demandado
problema += x_2 <= 315, "Demanda"
Resolver el problema#
Invoca el optimizador. Este paso le asigna un valor a las variables incluidas en las restricciones o función objetivo del modelo.
problema.solve()
Welcome to the CBC MILP Solver
Version: 2.10.8
Build Date: May 6 2022
command line - cbc /tmp/ab126e0b7b7340839b5b6e1c43ce2849-pulp.mps max timeMode elapsed branch printingOptions all solution /tmp/ab126e0b7b7340839b5b6e1c43ce2849-pulp.sol (default strategy 1)
At line 2 NAME MODEL
At line 3 ROWS
At line 8 COLUMNS
At line 16 RHS
At line 20 BOUNDS
At line 21 ENDATA
Problem MODEL has 3 rows, 2 columns and 5 elements
Coin0008I MODEL read with 0 errors
Option for timeMode changed from cpu to elapsed
Presolve 2 (-1) rows, 2 (0) columns and 4 (-1) elements
0 Obj -0 Dual inf 7500 (2)
1 Obj 3648333.3
Optimal - objective value 3648333.3
After Postsolve, objective 3648333.3, infeasibilities - dual 0 (0), primal 0 (0)
Optimal objective 3648333.333 - 1 iterations time 0.002, Presolve 0.00
Option for printingOptions changed from normal to all
Total time (CPU seconds): 0.00 (Wallclock seconds): 0.00
1
Imprimir resultados#
Antes de estudiar el óptimo del modelo, identifica en el estado del optimizador si pudo resolver el problema.
f"Estado del optimizador: {lp.LpStatus[problema.status]}"
'Estado del optimizador: Optimal'
Identifica también el valor de la función objetivo.
f"Utilidades totales: {lp.value(problema.objective)}"
'Utilidades totales: 3648333.3249999997'
Por último, imprime de manera estructurada el valor de las variables de decisión y otras expresiones de interés.
print(f"Se deben fabricar: {lp.value(x_1)} unidades de chocolate oscuro")
print(f"Se deben fabricar: {lp.value(x_1)} unidades de chocolate blanco")
Se deben fabricar: 682.38095 unidades de chocolate oscuro
Se deben fabricar: 682.38095 unidades de chocolate blanco
Créditos#
Equipo Principios de Optimización
Autores: Alfaima Solano
Desarrollo: Alfaima Solano, Alejandro Mantilla
Última fecha de modificación: 07/04/2023