Desafió semana 4

Esta semana el desafió es:

Un emprendimiento fabrica dos tipos de cerveza, Ale y Lager, para ello ocupa (Ver tabla 1). Ademas, la empresa cuenta con: 480 kilos de maíz, 160 kilos de lúpulo y 1500 kilos de Malta. Ademas, la empresa obtiene de utilidad 13 U.M. por la cerveza Ale y 23 U.M. por la cerveza Lager.
¿Cuál es la cantidad idónea a producir de cada tipo de cerveza para que la empresa obtenga el máximo de utilidad?

Restricción, usar solo métodos de optimización, para referencia leer (https://www.juanretamales.cl/2021/12/12/introduccion-a-la-investigacion-operativa/)

CervezaMaíz (kg)Lúpulo (kg)Malta (kg)
Ale5450
Lager15430
Tabla 1

Es el mismo ejercicio de la semana anterior, que se resolvió por (casi) fuerza bruta, pero ahora usaremos métodos de optimización, en simples y burdas palabras, es encontrar un resultado parecido al mejor, pero en un tiempo razonable, por ejemplo si un código para encontrar la mejor combinación se demora 3 días en fuerza bruta por probar todas las posibilidades, este, se demora del orden de horas, con tal de tener uno parecido pero ahorrando mucho tiempo.

Pregunta: ¿Cuál es la cantidad idónea a producir de cada tipo de cerveza para que la empresa obtenga el máximo de utilidad?

Pasos:

  • Paso 1: Identificar las variables de decisión.
    • ¿Qué se desea encontrar?
      Respuesta: Cantidad de cerveza de cada tipo a producir
      X1: Cantidad de cerveza Ale producida
      X2: Cantidad de cerveza Lager producida
  • Paso 2: Plantear las restricciones del problema.
    • Pregunta: ¿Qué limita la producción?
      Respuesta: La cantidad de recurso disponible
      • Se dispone de 480 kilos de maíz
        5X1 + 15X2 ≤ 480
      • Se dispone de 160 kilos de lúpulo
        4X1 + 4X2 ≤ 160
      • Se dispone de 1500 kilos de Malta
        50X1 + 30X2 ≤ 1500
  • Paso 3: Definir la función objetivo.
    • Pregunta: ¿Qué y en que sentido se optimizará?
      Respuesta: se busca obtener la máxima utilidad
      Maximizar 13X1 + 23X2

Entonces, tenemos la siguiente ecuaciones:

Maximizar 13X1 + 23X2
Sujeto a
5X1 + 15X2 ≤ 480
4X1 + 4X2 ≤ 160
50X1 + 30X2 ≤ 1500
X1, X2 ≥ 0

from scipy.optimize import linprog
import numpy as np
from cvxopt import matrix
from cvxopt import glpk
import datetime as dt

start = dt.datetime.now()
# Equations to solve
# MAX 13 ale + 23 lager 
# 5 ale + 15 lager <= 480 Maiz 
# 4 ale + 4 lager <= 160 Lupulo 
# 50 ale + 30 lager <= 1500 MAlta 
# 0 ale + 0 lager  >= 0 

# X matrix - Las variables
var_list = ['Ale', 'Lager']

# Inequality equations, Maiz, Lupulo, Malta respectivamente
A_ineq = [[5., 15.], 
          [4., 4.], 
          [50., 30.]]

# Inequality equations, Resultados de las ecuaciones
B_ineq = [480., 160.,1500.]

# Funcion de coste, minimiza pero como nosotros queremos maximizar lo dejamos en negativo
c = [-13., -23.]  # construct a cost function

res_no_bounds = linprog(c, A_ub=A_ineq, b_ub=B_ineq, method='simplex')
print(res_no_bounds)

print([str(valx)+' '+var_list[idx] for idx, valx in enumerate(res_no_bounds['x'])])
print('Tiempo:{}'.format(dt.datetime.now()-start)) 
     con: array([], dtype=float64)
     fun: -800.0
 message: 'Optimization terminated successfully.'
     nit: 4
   slack: array([ 0.,  0., 60.])
  status: 0
 success: True
       x: array([12., 28.])
['12.0 Ale', '28.0 Lager']
Tiempo:0:00:00.006864

Esto quiere decir, que para maximizar los resultados, debemos fabricar 12 cervezas Ale y 28 Lager.

Nos vemos la siguiente semana!!!!

Deja un comentario