Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Trabajo Final CA

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 19

Complejidad Algorítmica

Trabajo Final
“Informe del Trabajo Final”

Docente:
Reyes Silva, Patricia Daniela

Integrantes:

Yalico Roncal, Ricardo Anderson


Saldaña del Rosario, Dyland Steven
Futuri Illa, Wilfredo
Heredia Miranda, Oscar

Sección:
WS6B

Lima, 12 de junio
Índice

1. Introducción
2. Objetivos
3. Área de la ciudad
o Descripción de la ciudad elegida
o Imagen estática de la ciudad o porción de ciudad elegida
4. Descripción del conjunto de datos
o Datos consignados por calle
o Datos consignados por intersección
5. Grafo de la Ciudad
(Explicación de cómo se elaboró el grafo, qué representan las aristas y los
vértices).
6. Diseño del Sistema de Tráfico
o Cómo se incorpora tráfico por horas en calles o segmentos de calles
o Cómo se calcula el peso de arista en base a su longitud y factor de tráfico
o Cómo se actualiza el peso de la arista en función de la hora del día.
o Algoritmos utilizados para calcular la ruta más corta y dos rutas alternativas
o Implementación de visual del mapa y las rutas a partir del grafo y algoritmo
seleccionado
o Interfaz gráfica
o Enlaces: a repositorio de GitHub / a video de presentación.
7. Documentación
8. Conclusiones
9. Bibliografía
10. Referencias
11.
1. Introducción
A raíz de la pandemia, muchos usuarios han evitado salir de sus domicilios por lo que,
muchos restaurantes han tenido que incrementar la entrega de los pedidos a través de
delivery en el menor tiempo posible. Es por ello que, para evitar contratiempos, es de
importancia tener la ruta óptima entre el restaurante, el punto de origen y el punto
final, en este caso el domicilio. En vista de esta problemática es que el presente
trabajo tiene como finalidad, teniendo en cuenta los temas vistos durante el curso,
desarrollar un Waze, es decir, un sistema que nos permita encontrar la ruta óptima
entre 2 puntos de una ciudad. La ciudad estará representada por un grafo previamente
construido que representa la ciudad o una porción o distritos de una ciudad grande
como es Lima. Cabe mencionar que la ruta óptima no siempre es el camino más corto,
ya que, hay diferentes factores que influyen como, por ejemplo, el tráfico o el nivel de
seguridad de una zona en específica.
Para esto, haremos uso de un dataset de calles y otro dataset para las intersecciones,
haciendo un total de 40000 datos. Cada archivo contará con la información necesaria.
Para este trabajo se ha seleccionado a 5 distritos: San Juan de Miraflores, San Isidro,
Miraflores, San Martin de Porres y Cercado de Lima. Asimismo, partiendo de la
previa “las cuatro técnicas tradicionales más conocidas e implementadas, como el
algoritmo de Dijkstra, la programación dinámica, la programación lineal entera y el
algoritmo A” (Sánchez, 2015), hemos observado que hay diferentes algoritmos que
calculan la ruta óptima, pero de los algoritmos desarrollados en clase hemos
considerado el algoritmo de Dijkstra.

2. Objetivos
● Crear un repositorio en GitHub para trabajar en equipo. También, para organizar el
proyecto en hitos y la asignación de Issues que realizará cada integrante del equipo.
Asimismo, subir todo el código y las diferentes versiones que se desarrollen en el
proyecto.

● Implementar el algoritmo de Dijkstra que nos permite encontrar el camino más corto.
Y también hallar la ruta óptima, y dos rutas alternativas a esta. Asimismo, construir el
grafo de acuerdo con el id de las intersecciones de calle de origen y el id de
intersección de calles de fin.

● Crear un algoritmo que nos permita calcular el peso de las aristas entre dos
intersecciones de calles (nodos), en función de su longitud y el factor de tráfico, que
se le asigna un peso de acuerdo con la hora ingresada por el usuario.
● Construir una interfaz gráfica que permita al usuario visualizar en un mapa la ruta más
corta y 2 rutas alternativas, usando el lenguaje de programación Python y la interfaz
gráfica (GUI) Tkinter.

3. Área de la ciudad
3.1 Descripción de la ciudad elegida
La ciudad elegida para hacer el recorrido del camino más corto es el distrito de Lima, San
Juan de Miraflores, San Isidro, Miraflores, San Martin de Porres y Cercado de Lima.
Elegimos la ciudad mencionada porque tenemos las coordenadas geográficas de las
intersecciones de las calles de origen y las calles de destino. Además, el 70% de usuarios
que utilizan aplicativos como waze y google maps radica en la ciudad de Lima (Diario el
peruano).

3.2 Imagen estática de la ciudad o porción de ciudad elegida

Figura 1: Límite, San Juan de Miraflores - Av. Los Nogales


Figura 2: San Isidro - Av. Los Campos

Figura 3: Miraflores - Av. Manco Capac


Figura 4: San Martin de Porres- Av. Tomas Valle

Figura 5: Cercado de Lima- Av. Nicolás de Piérola


4. Descripción del Conjunto de datos

4.1 Datos consignados por calle

Id Calle: es el identificador único de cada calle de la ciudad de Lima.


Nombre Calle: nombre de cada calle.
Id Calle Origen: identificador de la calle del punto de partida
Id Calle Final: identificador de la calle del punto final.

4.2 Datos consignados por intersección

Id Origen Intersección: es el nuevo identificador de origen que se genera por


intersección de dos o más calles.

Id Final Intersección: es el identificador de dos o más calles que se intersecan.

Distancia: la distancia en kilómetros de las coordenadas de origen y las coordenadas de


fin entre dos calles.

Velocidad: la velocidad máxima en la que un vehículo está permitido recorrer.

Latitud y longitud de Origen Intersección: coordenadas geográficas de la intersección


entre dos calles de origen.

Latitud y Longitud de Destino Intersección: coordenadas geográficas de la intersección


entre dos calles de final.

Figura 6: de la dataset que se usará para el proyecto


5. Grafo de la ciudad
Primer paso: Crear un árbol de balanceo
Utilizamos un árbol de balanceo para ordenar y obtener los ids de cada nodo a partir del id
de origen ofrecido en el dataset; ya que, cada id de origen es único para cada nodo.
El AVL es un árbol de búsqueda que nos facilitará obtener los ids de orden para cada id de
origen que enviemos, además que reduce el tiempo de búsqueda y consumo de recursos
ante la gran cantidad de nodos que contamos.

Figura 7: creación de un árbol binario

Figura 8: árbol representativo de los registros del dataset


Segundo paso: Cargar y convertir la dataset
Creamos un grafo encargado de obtener convertir el dataset en una lista de adyacencia a
partir de la consulta de los ids de origen, retornando los ids de registro.
La primera función copy_to_avl se encarga de enviar todos los ids de origen, id de registro
y distancias al árbol de balanceo.

Figura 9: algoritmo de la creación de un grafo y su método de copia


La segunda función copy_to_graph se encarga de agregar a una lista de adyacencia todos
los nodos, los cuales están siendo buscados a partir de su id de origen y enviados al índice
que pertenecen.
La tercera función draw está encargada de dibujar el grafo a partir de la lista de adyacencia
cargada con o sin un camino.

Figura 10: método de como dibujar un grafo.

Tercer paso: Crear un grafo para la ruta más corta


Creamos un grafo que será encargado de recibir los nodos con un nodo inicial, nodo final
y un peso.

Figura 11: algoritmo de Dijkstra.

Cuarto paso: Crear el algoritmo Dijsktra


Creamos el algoritmo de Dijkstra quien recibe el grafo, nodo inicial y final para calcular
solo una ruta, la cual es la más corta.

Figura 12: método del funcionamiento del algoritmo.


Quinto paso: Declarar las variables y dibujar
Declaramos las variables que son necesarias para cargar ambos grafos, enviamos un id de
origen y un id de destino y finalmente convertimos el path recibido a una lista de puntos,
los cuales serán graficados en la función draw del grafo principal.

Figura 13: lectura del dataset del csv y enlazarlo a cada nodo de un grafo.

6. Diseño del Sistema de Tráfico

Cómo se incorpora tráfico por horas en calles o segmentos de calles


Para manejar el tráfico por horas se creó una función llamada estimate-r que en base a la
hora actual se le asigna un peso por ejemplo si la hora se encuentra entre las 6 am y las 9
am o 12 pm y 2pm o 6 pm y 9 pm el valor que se retornará será de 2, de esta manera
durante las horas de mayor tráfico el peso del tráfico obtendrá un mayor peso.

Figura 14: método estimare que sirve para hallar las horas.
Cómo se calcula el peso de arista en base a su longitud y factor de tráfico
Para hallar el peso de la arista se utilizó el teorema de Pitágoras que mediante las
direcciones de las coordenadas triangulamos un punto a otro y para asignar el factor del
tráfico se utilizó una función que mediante una hora atribuida se le asigna un valor que se
multiplicará por el valor de la arista hallada de las coordenadas.

Figura 15: método copiar el árbol balanceado AVL

Cómo se actualiza el peso de la arista en función de la hora del día.


Para que se actualice el peso de la arista es por el factor del tiempo que se involucra
dependiendo de la hora en la que el vehículo se encuentra realizando un transporte ya que
se sabe que en ciertas horas punta el tráfico es mayor lo que podría resultar un mayor
tiempo para la movilización.

Algoritmos utilizados para calcular la ruta más corta y dos rutas alternativas
El algoritmo que se utiliza actualmente para hallar la ruta más corta es el algoritmo de
Dijkstra, este algoritmo fue desarrollado por Edsger Dijkstra en 1956 con el fin de un
camino que sea el de menor tiempo o valor posible para llegar a un punto indicado. El
algoritmo funciona en ir explorando todos los caminos más cortos que parten origen y que
vayan extendiéndose por todos los vértices analizando los diferentes costes que tiene cada
arista. También el uso de este algoritmo tiene excepciones ya que no puede ser usado en
caminos con costes negativos. Este algoritmo es utilizado mayormente en el sector de la
telemática. En la siguiente imagen se puede ver el algoritmo implementado en la
aplicación.
Figura 16: algoritmo de Dijkstra con sus respectivos métodos

Para el cálculo de otras dos rutas alternativas, se tuvo que dar un peso muy alto a una de
las aristas del camino mínimo hallado anteriormente de tal manera de que se encuentre un
nuevo camino optimo sin tener que pasar por esta arista con un peso elevado. Para esto, se
ha creado un método, update_edge, en la clase ryGraph.py.

Figura 17: método actualizar las aristas del grafo


Con esta modificación de la arista, se ha podido capturar un segundo camino mínimo. De la
misma manera se ha hecho para el tercer camino, es decir, alterar el camino con un valor
máximo en la arista para que se genere un tercer camino y encontrar una nueva ruta.

Implementación de visual del mapa y las rutas a partir del grafo y algoritmo
seleccionado
Hemos utilizado la librería graphviz, agregando atributos y etiquetas para representar los
nodos, pesos y direcciones. Asimismo, el grafo permite agregar un array para el mínimo,
este camino es representado con las direcciones.
Figura 18: algoritmo de como se dibujan los grafos
Resultado:

Figura 19: ruta Original

Figura 20: ruta alternativa 1


Figura 21: ruta alternativa 2

7. Documentación
Algunas de las librerías implementadas en la aplicación que se utilizaron para el desarrollo
del programa fueron Graphviz, Tkinter y PIL.
Graphviz
Para el dibujo de las calles hemos utilizado la librería Graphviz, librería especializada en la
presentación de grafos de gran densidad. Asimismo, Graphviz posee una simplicidad y bajo
consumo de recursos, es por ello por lo que fue la librería preferida para representar calles y
caminos alojados en la lista de adyacencia.
Tkinter
Esta librería es utilizada generalmente para crear entornos visuales, de esta manera nosotros
la utilizamos para crear un menú e implementar la entrada de datos, así como también para
que los grafos resultantes de la entrada de datos sean mostrados posteriormente en la
aplicación.
PIL
Esta librería es utilizada para la manipulación de imágenes en los frames de Tkinter de esta
manera cuando se obtienen los tres diferentes resultados, en la aplicación se mostrarán tres
diferentes grafos y podemos cambiar el tamaño de estos haciendo zum.
8. Conclusiones
Tras el desarrollo de este proyecto hemos podido observar que se han elegido límites entre
distritos importantes y concurridos tales como San Juan de Miraflores, San Isidro, Miraflores,
San Martin de Porres y Cercado de Lima, todos ellos ubicados en el departamento de Lima, el
cual ha podido darnos una muestra intersecciones con más de 84000 puntos. En
consecuencia, ante la gran cantidad de datos se vio oportuno realizar una dataset con los
atributos necesarios para el desarrollo de este proyecto.
El manejo de la información fue el punto más importante ya que, el desarrollo de los
algoritmos iba de la mano con la necesidad de eficiencia ante las consultas. Ante ello,
pudimos dar como propuesta el uso de árboles de balanceo y algoritmos para obtener un MST
como lo fue Dijkstra. Asimismo, nos apoyamos de la conveniente organización del dataset
para obtener resultados más rápidos y con menores pasos. Al término de este proyecto hemos
podido obtener un camino con la menor cantidad de distancia entre dos puntos, añadiendo a
ello dos caminos secundarios que serían utilizados en el peor de los casos.
Finalmente, concluimos que el desarrollo de este proyecto nos ha permitido conocer más
acerca de la eficiencia de un algoritmo ante problemas complejos y muy pesados, aprender
acerca nuevos métodos de optimización y una correcta aplicación de estos en conjunto para la
solución que beneficie al uso de los recursos.
9. Bibliografía
Sánchez, Pedro José & Rocha-González, Jair & Gómez, Cesar. (2015). Ruta más corta:
soluciones algorítmicas para movilidad eficiente en la malla vial de Cundinamarca.
Programación dinámica. recuperado de:
https://www.researchgate.net/publication/275212627_Ruta_mas_corta_soluciones_algoritmic
as_para_movilidad_eficiente_en_la_malla_vial_de_Cundinamarca_Programacion_dinamica
[consultado el 20 de junio del 2022]

10. Referencias
Networkx.org. n.d. graphviz_layout — NetworkX 2.8.4 documentation. [online] Recuperado
de:https://networkx.org/documentation/stable/reference/generated/networkx.drawing.nx_pyd
ot.graphviz_layout.html [Accedido 28 June 2022].
PIL
Recursos Python. n.d. Instalar PIL / Pillow y aplicar efectos visuales - Recursos Python.
[online] Recuperado de: https://recursospython.com/guias-y-manuales/instalar-pil-pillow-
efectos/ [Accedido 28 June 2022].
Tkinter
Docs.python.org. n.d. tkinter — Python interface to Tcl/Tk — Python 3.10.5 documentation.
[online] Recuperado de: https://docs.python.org/3/library/tkinter.html [Accedido 28 June
2022].

También podría gustarte