Chocolatería - Solución#

Tags: Introducción, Dos variables

Hide 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.

x1:unidades de chocolate oscuro producidos cada semanax2:unidades de chocolate blanco producidos cada semana

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:

6x1+22x212,000

Se debe respetar la disponibilidad de azucar:

21x1+18x220,000

No se debe sobrepasar la demanda máxima de chocolate blanco:

x2315

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:

x10x20

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.

máx ($7,000$3,500)x1+($6,000$2,000)x2

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