CodeGym /Cursos /Python SELF ES /Algoritmos de búsqueda de caminos más cortos

Algoritmos de búsqueda de caminos más cortos

Python SELF ES
Nivel 56 , Lección 3
Disponible

9.1 Principios de funcionamiento del algoritmo de Dijkstra

El algoritmo de Dijkstra es un algoritmo para encontrar los caminos más cortos desde un vértice inicial a todos los demás vértices en un grafo con pesos de aristas no negativos. El algoritmo utiliza un enfoque voraz, eligiendo en cada paso el vértice con la menor distancia conocida desde el vértice inicial y actualizando las distancias a los vértices vecinos.

Pasos del algoritmo:

1. Inicialización:

  • Establecemos la distancia al vértice inicial en 0.
  • Establecemos la distancia a todos los demás vértices en infinito.
  • Creamos un conjunto de vértices no visitados.

2. Elección del vértice actual:

  • Elegimos un vértice no visitado con la menor distancia (el vértice inicial en el primer paso).

3. Actualización de distancias:

  • Para cada vértice vecino del vértice actual, si el nuevo camino a través del vértice actual es más corto que el camino conocido, actualizamos la distancia a ese vértice.

4. Marcamos el vértice actual como visitado:

  • Eliminamos el vértice actual del conjunto de vértices no visitados.

5. Repetimos los pasos 2-4, hasta que todos los vértices hayan sido visitados o hasta llegar al vértice objetivo.

Complejidad temporal y espacial del algoritmo de Dijkstra:

Complejidad temporal:

O((V + E) log V) al usar una cola de prioridad (por ejemplo, un Fibonacci heap), donde V es el número de vértices y E es el número de aristas.

O(V^2) al usar una lista simple para almacenar distancias.

Complejidad espacial:

O(V) para almacenar distancias y predecesores (para reconstruir el camino).

9.2 Implementación del algoritmo de Dijkstra

La implementación del algoritmo de Dijkstra es larga, pero muy sencilla. Te recomiendo tratar de entenderla. Si no es claro — regresa un poco más arriba y relee los pasos básicos del algoritmo.

Ejemplo de implementación del algoritmo de Dijkstra utilizando una cola de prioridad (heap):


import heapq

def dijkstra(graph, start):
    # Inicialización
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    priority_queue = [(0, start)]
    parents = {vertex: None for vertex in graph}
            
    while priority_queue:
        current_distance, current_vertex = heapq.heappop(priority_queue)
            
        # Si la distancia actual es mayor que la registrada, saltamos el vértice
        if current_distance > distances[current_vertex]:
            continue
            
        # Actualización de distancias a los vértices vecinos
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            # Si se encuentra un camino más corto al vértice vecino
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                parents[neighbor] = current_vertex
                heapq.heappush(priority_queue, (distance, neighbor))
            
    return distances, parents
            
# Ejemplo de uso:
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}
start_vertex = 'A'
distances, parents = dijkstra(graph, start_vertex)
print("Distancias más cortas desde el vértice inicial:", distances)
print("Predecesores para reconstruir el camino:", parents)

Salida:


Distancias más cortas desde el vértice inicial: {'A': 0, 'B': 1, 'C': 3, 'D': 4}
Predecesores para reconstruir el camino: {'A': None, 'B': 'A', 'C': 'B', 'D': 'C'}

9.3 Ejemplos de problemas resueltos con el algoritmo de Dijkstra

Ejemplos clásicos de problemas resueltos con el algoritmo de Dijkstra:

1. Optimización de rutas en redes de transporte

Encontrar el camino más corto entre puntos en una red de transporte (por ejemplo, entre ciudades).

Aplicación:

Sistemas de navegación, como Google Maps, utilizan el algoritmo de Dijkstra para calcular rutas óptimas.

2. Planificación de rutas de entrega

Optimización de rutas para servicios de entrega de productos, minimizando costos y tiempos de entrega.

Aplicación:

Las empresas de logística utilizan el algoritmo de Dijkstra para planificar rutas de entrega y reducir costos operativos.

3. Gestión de redes

Optimización de la enrutación de paquetes de datos en redes informáticas para minimizar retrasos y aumentar el ancho de banda.

Aplicación:

Protocolos de enrutamiento como OSPF (Open Shortest Path First) utilizan el algoritmo de Dijkstra para encontrar los caminos más cortos en redes.

4. Análisis de redes sociales

Encontrar caminos más cortos y medir la centralidad en grafos sociales (por ejemplo, para encontrar usuarios más influyentes).

Aplicación:

Las plataformas sociales analizan las conexiones entre usuarios para proporcionar recomendaciones y analizar actividad de red.

5. Juegos y mundos virtuales

Encontrar caminos para personajes en mundos de juegos con obstáculos y distintos niveles de dificultad.

Aplicación:

Los motores de juegos utilizan el algoritmo de Dijkstra para calcular el movimiento de personajes y objetos en mundos virtuales.

6. Sistemas de gestión de energía

Optimización de la distribución de energía en redes eléctricas para minimizar pérdidas y garantizar la fiabilidad del suministro.

Aplicación:

Las compañías eléctricas utilizan el algoritmo de Dijkstra para optimizar rutas de transmisión de energía en redes, minimizando pérdidas de energía y evitando sobrecargas.

Ejemplo:

En redes eléctricas, cada nodo representa una subestación y las aristas son líneas de transmisión con distintos niveles de resistencia. El algoritmo de Dijkstra ayuda a encontrar el camino con menor resistencia desde la fuente de energía hasta el consumidor.

7. Sistemas de evacuación y planificación de rutas

Optimización de rutas de evacuación en edificios o ciudades para una salida rápida y segura en caso de situaciones de emergencia.

Aplicación:

Arquitectos e ingenieros utilizan el algoritmo de Dijkstra para planificar rutas de evacuación, garantizando una salida segura y rápida de personas de zonas peligrosas.

Ejemplo:

En un edificio de apartamentos o de oficinas, los nodos del grafo representan habitaciones y pasillos, y las aristas son los caminos entre ellos. El algoritmo de Dijkstra se puede utilizar para encontrar el camino más corto desde cualquier punto del edificio hasta la salida más cercana.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION