Está en la página 1de 9

MA3701 Optimización

Informe de la Tarea #2
Desarrollo y resultados

Autor(a): Isaí Hidalgo Rodríguez.


Profesor: Jorge Amaya.
Auxiliares: Aldo Gutiérrez y José Calderón.
Ayudante: Diego Morales y Daniela Sánchez.
Fecha: 23 de septiembre de 2023. Semestre de Primavera.
Índice general

1. Introducción 2

2. Respuestas 3
1. Preguntas de la tarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

A. Anexo 6
1. Codificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2. Imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1
Capítulo 1

Introducción

En el presente informe se detalla el modelamiento de un problema de optimización referente a


un caso de transporte. Para su solución, se utilizó una nueva librería, llamada PuLP, que conllevó a
un nuevo aprendizaje y conocimiento acerca de programación.

El problema a resolver trata acerca de una empresa que desea transferir containers desde sus
bodegas a algunos puertos dentro de Chile, buscando hacerlo de la forma más económica posible.
Esta breve descripción encasilla al problema dentro del tipo de "flujo a costo mínimo".

La librería PuLP, de Python, se utiliza para modelar y resolver problemas de optimización


mediante programación lineal, y su soporte para problemas de minimización con restricciones es
lo que sirve para llevar a cabo esta tarea. Como guía, se utiliza la información disponible en la
página de la misma librería, PuLP, y de manera específica, se ocupa el ejemplo del caso de estudio
nombrado "A Transportation Problem".

2
Capítulo 2

Respuestas

1.- Preguntas de la tarea


P1.- Formule el problema de optimización con sintaxis matemática, para ello:

a) Modele la función objetivo.


b) Modele las restricciones, recuerde explicitar en qué conjunto se encuentra cada variable
del problema.

Solución:

a) La cantidad de containers a trasladar por bodega, y la demanda por cada puerto son
datos dados en el enunciado. Para formular la función objetivo, se consideran dos
variables de decisión, con i como una bodega y j como un puerto: xij es la cantidad
de containers enviados desde i a j, y dij es la distancia medida en kilómetros entre
i y j.
Como la empresa determinó que sus costos son directamente proporcionales a la
distancia que viaja cada container, se supone entonces que la empresa paga un costo
cij = xij dij por enviar xij containers desde i a j. Por lo tanto, la función objetivo
será la siguiente:
P
F.O : min i,j cij
Los valores de la matriz dij se obtuvieron de la página web servicios.vialidad.cl. De
ahí, quedó la siguiente matriz de distancias:

115,95 117,87 505,52 1032,6


 
226,61 148,19 391,55 918,64
dij =  (2.1)
 
462,75 361,14 145,28 747,2 

975,71 856,09 475,87 213,35

b) Tal como está planteado el problema, se desprenden 3 tipos de restricciones: respec-


to a la naturaleza de las variables enunciadas, respecto a la cantidad de containers
por entregar, y respecto a la demanda de los puertos que se debe cumplir. La última

3
CAPÍTULO 2. RESPUESTAS 4

restricción considera además que sí es posible superar esa cantidad de containers


demandada. De esta forma, se plantean estas tres restricciones de manera formal tal
como sigue.

1) Naturaleza de las variables.


xij ≥ 0, xij ∈ N
dij ≥ 0, dij ∈ R
cij ≥ 0, cij ∈ R
Con i, j ∈ {1, 2, 3, 4}

2) Containers por entregar.


4
X 4
X 4
X 4
X
x1j = 40 ; x2j = 10 ; x3j = 15 ; x4j = 30 (2.2)
j=1 j=1 j=1 j=1

3) Demanda por cumplir.


4
X 4
X 4
X 4
X
xi1 ≥ 25 ; xi2 ≥ 15 ; xi3 ≥ 25 ; xi4 ≥ 10 (2.3)
i=1 i=1 i=1 i=1

P1.- Utilizando python resuelva el problema de optimización, especifique claramente las herra-
mientas a utilizar. Indicación: Se recomienda el uso de las librerías Scipy o PuLP.

Solución: Como ya se mencionó, la librería a utilizar es PuLP. En el ’Listing A.1’ del


anexo se detalla el código escrito para resolver el problema formulado en la pregunta
anterior.
El código parte definiendo los nodos y sus capacidades. En listas van los nodos, y en
diccionarios sus capacidades. Luego se integran en una nueva lista los datos respectivos a
las distancias entre cada ciudad, y mediante la función makeDict se logra crear una lista
aún más larga, que incluye todos los nodos y las distancias asociadas a la concección
entre cada nodo. El problema se establece utilizando la función LpProblem, y se crea
una lista de tuplas, ’Rutas’, que contiene todos los arcos posibles. La última variable que
se crea es un diccionario llamado vars, y contiene las rutas del problema. Finalmente se
agregan a la variable del problema, ’probelm’, la función objetivo y las restricciones.
Al resolver el problema, y calcular el costo total de la solución óptima, codificado en el
’Listing A.2’, se obtiene una suma mínima de 17162 [km] recorridos.

P1.- Interprete la solución óptima. ¿Qué puertos quedaron con más containers que su demanda?

Solución: De acuerdo al resultado del código anexado en el ’Listing A.2’, mostrado en


la ’Figura A.1’, el único puerto que recibe más containers de los demandados es el de
Puerto Montt, con un excedente de 20 containers.
Este resultado hace sentido, ya que la bodega de Valdivia está mucho más cerca de Puerto
Montt que del resto de los puertos, con una distancia aproximada de 200 [km], a diferen-
cia de los 500, 900 y 1000 [km] aproximados que tiene respecto a los demás puertos.
Por lo tanto, conviene enviar todos sus containers (30) solo a Puerto Montt, con tal de
CAPÍTULO 2. RESPUESTAS 5

minimizar la distancia recorrida.


Algo parecido pasa con el resto de ciudades, ya que los puertos asociados a cada bodega
son los más cercanos, como se esperaba.

2.- Conclusión
Para resolver problemas de optimización, la librería PuLP resulta bastante cómoda, y segura.
Se comprobó su utilidad y funcionalidad, al llegar a resultados coherentes con lo que lógicamente
se podía esperar.

En cuanto a su accesibilidad, en general resultó fácil de usar, ya que sus funciones hacían sen-
tido, y los pasos a seguir para resolver los problemas de optimización, como el de transporte que
aquí se presentó, tenían una secuencia lógica bastante fácil de asimilar.

Para futuras ocasiones, en las que se deba formular y resolver otros problemas asociados a la
optimización, esta librería queda a disposición prometiendo una solución rápida y accesible.
Apéndice A

Anexo

1.- Codificación
El problema de optimización se resolvió con el siguiente código:
1 #NOTA: El codigo aqui ocupado se utilizo en IDLE, de Python, posterior a
2 #haber instalado la libreria PuLP. En colab solo se escribio para obtener
3 #los archivos .ipynb y .html
4

5 #Importar las funciones de la libreria PuLP


6 from pulp import *
7
8 #Crear una lista de todos los nodos que corresponden a bodegas
9 Bodegas = ["Santiago", "Rengo", "Cauquenes", "Valdivia"]
10

11 #Crear un diccionario para la cantidad de contenedores que posee cada bodega


12 contenedores = {"Santiago": 40, "Rengo": 10, "Cauquenes": 15, "Valdivia": 30}
13
14 #Crear una lista de todos los nodos que corresponden a puertos
15 Puertos = ["Valparaiso", "San Antonio", "Talcahuano", "Puerto Montt"]
16

17 #Crear un diccionario para la cantidad de contenedores que necesita cada


puerto
18 demanda = {
19 "Valparaiso": 25,
20 "San Antonio": 15,
21 "Talcahuano": 25,
22 "Puerto Montt": 10,
23 }
24
25 #Crear una lista de la distancia recorrida por cada ruta de transporte
26 distancias = [ #Puertos
27 #Santiago, Rengo, Cauquenes, Valdivia
28 [115.95, 117.87, 505.52, 1032.6], #Valparaiso Bodegas
29 [226.61, 148.19, 391.55, 918.64], #San Antonio
30 [462.75, 361.14, 145.28, 747.2], #Talcahuano
31 [975.71, 856.09, 475.87, 213.35], #Puerto Montt
32 ]
33
34 #Integrar los datos de distancias en un diccionario
35 distancias = makeDict([Bodegas, Puertos], distancias, 0)
36

6
APÉNDICE A. ANEXO 7

37 #Crear la variable ’problem’ para contener la data del problema


38 problem = LpProblem("Problema_de_Distribucion_de_Containers", LpMinimize)
39

40 #Crear variable para el costo total


41 costo_total = LpVariable("Costo_Total", lowBound=0, cat=LpContinuous)
42
43 #Agregar variable anterior al problema
44 problem += costo_total
45

46 #Al costo total se le asocia el valor a tomar, en funcion de la solucion


optimizada
47 problem += costo_total == lpSum(vars[b][p] * distancias[b][p] for b in Bodegas
for p in Puertos)
48
49 #Crear una lista de tuplas que contengan todas las posibles rutas de
transporte
50 Rutas = [(b, p) for b in Bodegas for p in Puertos]
51
52 #Crear un diccionario llamado "Vars" para contener las variables referenciadas
53 vars = LpVariable.dicts("Ruta", (Bodegas, Puertos), 0, None, LpInteger)
54

55 #Agregar la funcion objetivo primero a ’problem’, que es el problema a


optimizar
56 problem += (
57 lpSum([vars[b][p] * distancias[b][p] for (b, p) in Rutas]),
58 "Suma_de_Costos_de_Transporte",
59 )
60
61 #Agregar al problema la restriccion del numero maximo de contenedores por cada
bodega
62 for b in Bodegas:
63 problem += (
64 lpSum([vars[b][p] for p in Puertos]) == contenedores[b],
65 f"Suma_de_Productos_fuera_de_Bodegas_{b}",
66 )
67
68 #Agregar al problema la restriccion de la demanda minima de contenedores por
cada puerto
69 for p in Puertos:
70 problem += (
71 lpSum([vars[b][p] for b in Bodegas]) >= demanda[p],
72 f"Suma_de_Productos_dentro_de_Puertos{p}",
73 )
74
75 #Resolver el problema
76 problem.solve()
Listing A.1: Código de resolución
La interpretación del problema resuelto se realizó con el siguiente código:
1 # Metodos
2 def costo(d , x, alp_0, alp , bet, a):
3 """
4 -Input:
5 -Output:
6 -Descripcion:
7 """
APÉNDICE A. ANEXO 8

8 output = 0 if np.abs(x) <1e-3 else alp_0*d + alp*np.exp(a*x)/(bet*np.exp(a


*x) + 1)
9 return output
Listing A.2: Código de interpretación

2.- Imágenes

Figura A.1: Resultados de resolver el problema de optimización

También podría gustarte