Transporte de productos lácteos#
Tags: Transporte
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/4. Transporte de productos lacteos/")
Enunciado#
La Lechera Ramírez S.A. es una empresa que produce productos lácteos y cuenta con cuatro plantas de producción en Colombia cuyas capacidades de producción mensuales de leche son 1,500, 1,200, 1,400, y 1,000 litros, respectivamente. Estas cuatro plantas suministran leche a los ocho clientes que actualmente tienen, los cuales son distribuidores minoristas de productos. Las demandas mensuales de leche de estos distribuidores son 930, 600, 460, 610, 830, 460, 640 y 240 litros, respectivamente. La Tabla 1 presenta el costo en el que incurre la compañía al enviar un litro de leche desde cada planta hacia cada distribuidor.
Tabla 1. Costos de distribución
Dist. 1 |
Dist. 2 |
Dist. 3 |
Dist. 4 |
Dist. 5 |
Dist. 6 |
Dist. 7 |
Dist. 8 |
|
---|---|---|---|---|---|---|---|---|
Planta 1 |
650 |
125 |
1200 |
340 |
150 |
260 |
350 |
800 |
Planta 2 |
250 |
200 |
250 |
600 |
150 |
950 |
1050 |
1000 |
Planta 3 |
600 |
350 |
400 |
260 |
150 |
300 |
450 |
600 |
Planta 4 |
450 |
800 |
650 |
250 |
340 |
700 |
600 |
620 |
Formula un modelo general de optimización lineal que le permita a La Lechera Ramírez satisfacer la demanda de sus clientes, al menor costo posible.
Formulación#
a. Formula matemáticamente un modelo de optimización de forma general que represente la situación anterior. Defina clara y rigurosamente:
Conjuntos
Parámetros
Variables de decisión
Restricciones
Naturaleza de las variables
Función objetivo
Implementación#
b. Resuelve el modelo planteado utilizando la librería de PuLP en Python. ¿Cuál es la solución óptima del problema?
Librerías#
Importa el módulo matplotlib.pyplot
para crear gráficas, la librería networkx
para dibujar grafos (redes) y la librería pulp
para crear y resolver el modelo.
# Escribe en esta celda tu código.
Conjuntos#
Define los conjuntos P
y D
que representan respectivamente las plantas y los distribuidores.
Recuerda que por conveniencia de preservar el orden de los elementos de los conjuntos, no siempre deberás definirlos con el tipo set
.
# Escribe en esta celda tu código.
Parámetros#
Define o importa los parámetros del modelo.
# Oferta de la planta i en I
b = {
"Planta 1": 1500,
"Planta 2": 1200,
"Planta 3": 1400,
"Planta 4": 1000,
}
# Demanda del distribuidor j en D
t = {
"Distribuidor 1": 930,
"Distribuidor 2": 600,
"Distribuidor 3": 460,
"Distribuidor 4": 610,
"Distribuidor 5": 830,
"Distribuidor 6": 460,
"Distribuidor 7": 640,
"Distribuidor 8": 240,
}
# Costo de envio de un litro de leche desde la planta i en P al distribuidor j en D.
c = {
("Planta 1", "Distribuidor 1"): 650,
("Planta 1", "Distribuidor 2"): 125,
("Planta 1", "Distribuidor 3"): 1200,
("Planta 1", "Distribuidor 4"): 340,
("Planta 1", "Distribuidor 5"): 150,
("Planta 1", "Distribuidor 6"): 260,
("Planta 1", "Distribuidor 7"): 350,
("Planta 1", "Distribuidor 8"): 800,
("Planta 2", "Distribuidor 1"): 250,
("Planta 2", "Distribuidor 2"): 200,
("Planta 2", "Distribuidor 3"): 250,
("Planta 2", "Distribuidor 4"): 600,
("Planta 2", "Distribuidor 5"): 150,
("Planta 2", "Distribuidor 6"): 950,
("Planta 2", "Distribuidor 7"): 1050,
("Planta 2", "Distribuidor 8"): 1000,
("Planta 3", "Distribuidor 1"): 600,
("Planta 3", "Distribuidor 2"): 350,
("Planta 3", "Distribuidor 3"): 400,
("Planta 3", "Distribuidor 4"): 260,
("Planta 3", "Distribuidor 5"): 150,
("Planta 3", "Distribuidor 6"): 300,
("Planta 3", "Distribuidor 7"): 450,
("Planta 3", "Distribuidor 8"): 600,
("Planta 4", "Distribuidor 1"): 450,
("Planta 4", "Distribuidor 2"): 800,
("Planta 4", "Distribuidor 3"): 650,
("Planta 4", "Distribuidor 4"): 250,
("Planta 4", "Distribuidor 5"): 340,
("Planta 4", "Distribuidor 6"): 700,
("Planta 4", "Distribuidor 7"): 600,
("Planta 4", "Distribuidor 8"): 620,
}
Objeto del modelo#
Construye un problema al que luego agregarás las restricciones y la función objetivo.
# Escribe en esta celda tu código.
Variables de decisión#
Define las variables del problema de manera que estén contenidas en diccionarios indexados en los conjuntos de sus variables respectivas.
# Escribe en esta celda tu código.
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.
# Escribe en esta celda tu código.
Restricciones#
Agrega al problema las restricciones del modelo.
# Escribe en esta celda tu código.
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.
# Escribe en esta celda tu código.
Imprimir resultados#
Antes de estudiar el óptimo del modelo, identifica en el estado del optimizador si pudo resolver el problema.
# Escribe en esta celda tu código.
Identifica también el valor de la función objetivo.
# Escribe en esta celda tu código.
Por último, imprime de manera estructurada el valor de las variables de decisión y otras expresiones de interés.
# Escribe en esta celda tu código.
Visualizar resultados#
Ahora que conoces el valor de las variables de decisión, desarrolla una gráfica que ilustre la red de distribución y los envíos dentro de la misma. Utiliza las ubicaciones definidas a continuación.
# Coordenadas de las plantas
coordenadas_plantas = {
"Planta 1": (9.5, 12),
"Planta 2": (7, 5),
"Planta 3": (5, 14),
"Planta 4": (2.5, 9.5),
}
# Coordenadas de los distribuidores
coordenadas_distribuidores = {
"Distribuidor 1": (5.5, 9),
"Distribuidor 2": (8, 9),
"Distribuidor 3": (5, 8),
"Distribuidor 4": (6, 10),
"Distribuidor 5": (7, 10),
"Distribuidor 6": (7.5, 15),
"Distribuidor 7": (8, 17),
"Distribuidor 8": (1, 15),
}
# Escribe en esta celda tu código.
Créditos#
Equipo Principios de Optimización
Autores: Camilo Aguilar, Juan Felipe Rengifo
Desarrollo: Camilo Aguilar, Juan Felipe Rengifo, Alejandro Mantilla
Última fecha de modificación: 07/04/2023