Trabajo Final CA
Trabajo Final CA
Trabajo Final CA
Trabajo Final
“Informe del Trabajo Final”
Docente:
Reyes Silva, Patricia Daniela
Integrantes:
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).
Figura 13: lectura del dataset del csv y enlazarlo a cada nodo de un grafo.
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.
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.
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:
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].