Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
ANÁLISIS DE ALGORITMOS Y ESTRATEGIAS DE PROGRAMACIÓN Docente: Mg. Gálvez Tapia Orleans Moisés CIP. 171497 UNIDAD 1: LA COMPLEJIDAD ALGORÍTMICA Y PRINCIPALES ESTRATEGIAS DE PROGRAMACIÓN SEMANA 11: Camino más corto (Algoritmo de Dijkstra) ¿Qué es una cola de prioridad? SABERES PREVIOS AGENDA: 1. Colas de prioridad en Python (heapq) 2. Uso de heappush(heap, item) y heappop(heap) 3. Camino más corto usando el algoritmo de Dijkstra 4. Pseudocódigo de algoritmo de Dijkstra 5. Prueba de escritorio de algoritmo de Dijkstra 6. Implementación en Python del algoritmo de Dijkstra 7. Trabajo grupal válido para la T2 8. Conclusiones 9. Referencias Bibliográficas LOGRO DE LA SESIÓN Al término de la clase, el estudiante implementa el algoritmo del camino más corto en Python, demostrando dominio del lenguaje y un lógica coherente. COLA DE PRIORIDAD EN PYTHON Salida: (1, 'John') (2, 'Eric') (3, 'Andrew') (4, 'Jean') Se considera que el elemento con la clave más pequeña tiene la prioridad más alta en colección. COLA DE PRIORIDAD EN PYTHON Se considera que el elemento con la clave más pequeña tiene la prioridad más alta en colección. heappush(heap, item) Inserta el valor item en la cola de prioridad. heappop(heap) Desapila y retorna el elemento más pequeño del heap, Para acceder al elemento más pequeño sin necesidad de desapilar, usa heap[0]. CAMINO MÁS CORTO USANDO DIJKSTRA El algoritmo de Dijkstra es un algoritmo para encontrar los caminos más cortos entre los nodos de un grafo. Para un nodo de origen dado en el grafo, el algoritmo encuentra el camino más corto entre ese nodo y todos los demás nodos. Por ejemplo: Vértices Costo mínimo Ruta A —> B 4 A —> E —> B A —> C 6 A —> E —> B —> C A —> D 5 A —> E —> D A —> E 3 A —> E S es el conjunto de vértices cuyas distancias desde el origen ya están calculadas (teniendo en cuenta que se trata de la menor distancia). CAMINO MÁS CORTO USANDO DIJKSTRA CAMINO MÁS CORTO USANDO DIJKSTRA CAMINO MÁS CORTO USANDO DIJKSTRA El grafo que vamos a implementar en Python es el siguiente: CAMINO MÁS CORTO USANDO DIJKSTRA Salida del programa en python: CAMINO MÁS CORTO USANDO DIJKSTRA PSEUDOCÓDIGO DEL ALGORITMO DE DIJKSTRA 1 método Dijkstra(Grafo,origen): 2 creamos una cola de prioridad Q 3 agregamos origen a la cola de prioridad Q 4 mientras Q no este vacío: 5 sacamos un elemento de la cola Q llamado u 6 si u ya fue visitado continuo sacando elementos de Q 7 marcamos como visitado u 8 para cada vértice v adyacente a u en el Grafo: 9 sea w el peso entre vértices ( u , v ) 10 si v no ah sido visitado: 11 Relajacion( u , v , w ) 1 método Relajacion( actual , adyacente , peso ): 2 si distancia[ actual ] + peso < distancia[ adyacente ] 3 distancia[ adyacente ] = distancia[ actual ] + peso 4 agregamos adyacente a la cola de prioridad Q distancia[ i ] como la distancia mas corta del vértice origen ingresado al vértice i. PRUEBA DE ESCRITORIO DEL ALGORITMO DE DIJKSTRA PRUEBA DE ESCRITORIO DEL ALGORITMO DE DIJKSTRA [0] [1] [2] [3] [4] -1 -1 -1 -1 -1previos PRUEBA DE ESCRITORIO DEL ALGORITMO DE DIJKSTRA [0] [1] [2] [3] [4] -1 -1 0 4 -1 4 1 -1 4 -1 0 [0] [1] [2] [3] [4] -1 4 1 4 0 previos previos Camino (0 —> 1): Mínimo costo = 4, Ruta = [0, 4, 1] Camino (0 —> 2): Mínimo costo = 6, Ruta = [0, 4, 1, 2] Camino (0 —> 3): Mínimo costo = 5, Ruta = [0, 4, 3] Camino (0 —> 4): Mínimo costo = 3, Ruta = [0, 4] PRUEBA DE ESCRITORIO DEL ALGORITMO DE DIJKSTRA [0] [1] [2] [3] [4] 0 4 6 5 3distancia Camino (0 —> 1): Mínimo costo = 4, Ruta = [0, 4, 1] Camino (0 —> 2): Mínimo costo = 6, Ruta = [0, 4, 1, 2] Camino (0 —> 3): Mínimo costo = 5, Ruta = [0, 4, 3] Camino (0 —> 4): Mínimo costo = 3, Ruta = [0, 4] PRUEBA DE ESCRITORIO DEL ALGORITMO DE DIJKSTRA EXPLICACIÓN DEL FUNCIONAMIENTO DEL PROGRAMA class Nodo: def __init__(self, vertice, peso=0): self.vertice = vertice self.peso = peso def __lt__(self, objeto2): return self.peso < objeto2.peso vertice peso < Nodo origen destino peso 0 1 10 0 4 3 1 2 2 1 4 4 2 3 9 3 2 7 4 1 1 4 2 8 4 3 2 aristas EXPLICACIÓN DEL FUNCIONAMIENTO DEL PROGRAMA aristas = [(0, 1, 10), (0, 4, 3), (1, 2, 2), (1, 4, 4), (2, 3, 9), (3, 2, 7), (4, 1, 1), (4, 2, 8), (4, 3, 2)] n = 5 origen destino peso 0 1 10 0 4 3 1 2 2 1 4 4 2 3 9 3 2 7 4 1 1 4 2 8 4 3 2 aristas EXPLICACIÓN DEL FUNCIONAMIENTO DEL PROGRAMA class Grafo: def __init__(self, aristas, n): self.lista_adyacencia = [[] for _ in range(n)] for (origen, destino, peso) in aristas: self.lista_adyacencia[origen].append((destino, peso)) [ ] [ ] [ ] [ ] [ ] Lista de Adyacencia [0] (1 , 10) [0] (4 , 3) [1] (2 , 2) [1] (4 , 4) [2] (3 , 9) [3] (2 , 7) [4] (1 , 1) [4] (2 , 8) [4] (3 , 2) for (origen, destino, peso) in aristas: [0] [ (1,10) , (4,3) ] [1] [ (2,2) , (4,4) ] [2] [ (3,9) ] [3] [ (2,7) ] [4] [ (1,1) , (2,8) , (3,2) ] Lista de Adyacencia EXPLICACIÓN DEL FUNCIONAMIENTO DEL PROGRAMA [0, ∞, ∞, ∞, ∞] Consideramos: sys.maxsize = 9223372036854775807 = ∞ def camino_mas_corto(grafo, origen, n): pq = [] heappush(pq, Nodo(origen)) distancia = [sys.maxsize] * n distancia[origen] = 0 visitado = [False] * n visitado[origen] = True previos = [-1] * n while pq: … ruta = [] for i in range(n): … [True, False, False, False, False] [-1, -1, -1, -1, -1] [ 0 ] EXPLICACIÓN DEL FUNCIONAMIENTO DEL PROGRAMA # pq = [ ] # u = 0 CAMINO MAS CORTO, IMPLEMENTACIÓN EN PYTHON TRABAJO EN EQUIPOS 1. Realizar la prueba de escritorio del algoritmo de Dijkstra para todos los nodos que faltan: TRABAJO EN EQUIPOS 1. Realizar la prueba de escritorio del algoritmo de Dijkstra para todos los nodos que faltan: TRABAJO EN EQUIPOS 2. Realizar una prueba de escritorio (en Excel) del algoritmo de ordenamiento quicksort: [0] [1] [2] [3] [4] [5] 10 40 7 9 15 27 TRABAJO EN EQUIPOS 3. Realizar una prueba de escritorio (en Excel) del algoritmo de búsqueda binaria recursiva: [0] [1] [2] [3] [4] [5] 7 9 10 15 27 40 Dato buscado TRABAJO EN EQUIPOS 4. Realizar una prueba de escritorio (en Excel) del algoritmo de las torres de hanoi: Considerar 4 discos CONCLUSIONES 1. Las colas de prioridad son estructuras de datos en las que cada dato/valor de la cola tiene una determinada prioridad o Un elemento con prioridad alta se elimina de la cola antes que un elemento con prioridad baja. o Si dos elementos tienen la misma prioridad, se sirven según su orden en la cola. 2. El algoritmo de Dijkstra es un algoritmo iterativo que nos proporciona la ruta más corta desde un nodo inicial particular a todos los otros nodos en un grafo. REFERENCIAS BIBLIOGRÁFICAS REFERENCIA ENLACE Una introducción a las matemáticas para el análisis y diseño de algoritmos https://elibro.bibliotecaupn.elogim.com/es/lc/upnort e/titulos/35059 Manual de algorítmica: recursividad, complejidad y diseño de algoritmos https://elibro.bibliotecaupn.elogim.com/es/lc/upnort e/titulos/56561 Introducción práctica a la programación con Python https://elibro.bibliotecaupn.elogim.com/es/lc/upnort e/titulos/124259 Criptografía sin secretos con Python https://elibro.bibliotecaupn.elogim.com/es/lc/upnort e/titulos/106497 ACM UVA Online http://uva.onlinejudge.org/ ACM ICPC Competition https://icpc.global/compete/preparation https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/35059 https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/35059 https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/56561 https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/56561 https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/124259 https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/124259 https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/106497https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/106497 http://uva.onlinejudge.org/ https://icpc.global/compete/preparation Diapositiva 1 Diapositiva 2 Diapositiva 3: UNIDAD 1: LA COMPLEJIDAD ALGORÍTMICA Y PRINCIPALES ESTRATEGIAS DE PROGRAMACIÓN Diapositiva 4 Diapositiva 5 Diapositiva 6 Diapositiva 7 Diapositiva 8 Diapositiva 9 Diapositiva 10 Diapositiva 11 Diapositiva 12 Diapositiva 13 Diapositiva 14 Diapositiva 15 Diapositiva 16 Diapositiva 17 Diapositiva 18 Diapositiva 19 Diapositiva 20 Diapositiva 21 Diapositiva 22 Diapositiva 23 Diapositiva 24 Diapositiva 25 Diapositiva 26 Diapositiva 27 Diapositiva 28 Diapositiva 29 Diapositiva 30 Diapositiva 31 Diapositiva 32 Diapositiva 33 Diapositiva 34
Compartir