Transporte de productos lácteos#

Tags: Transporte

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/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