CodeGym /Cours /Python SELF FR /Algorithmes de recherche du plus court chemin

Algorithmes de recherche du plus court chemin

Python SELF FR
Niveau 56 , Leçon 3
Disponible

9.1 Principes de fonctionnement de l'algorithme de Dijkstra

L'algorithme de Dijkstra est un algorithme pour trouver les plus courts chemins depuis le sommet initial jusqu'à tous les autres sommets d'un graphe avec des poids d'arêtes non négatifs. L'algorithme utilise une approche gloutonne, choisissant à chaque étape le sommet avec la plus petite distance connue depuis le sommet initial et mettant à jour les distances jusqu'aux sommets voisins.

Étapes de l'algorithme :

1. Initialisation :

  • On fixe la distance jusqu'au sommet initial à 0.
  • On fixe la distance jusqu'à tous les autres sommets à l'infini.
  • On crée un ensemble de sommets non visités.

2. Choix du sommet actuel :

  • On choisit un sommet non visité ayant la plus petite distance (le sommet initial au premier pas).

3. Mise à jour des distances :

  • Pour chaque sommet voisin du sommet actuel, si le nouveau chemin via le sommet actuel est plus court que le chemin connu, on met à jour la distance jusqu'à ce sommet.

4. Marquage du sommet actuel comme visité :

  • On supprime le sommet actuel de l'ensemble des sommets non visités.

5. On répète les étapes 2-4, jusqu'à ce que tous les sommets soient visités ou jusqu'à ce qu'on atteigne le sommet cible.

Complexité temporelle et spatiale de l'algorithme de Dijkstra :

Complexité temporelle :

O((V + E) log V) en utilisant une file de priorité (par exemple, un tas de Fibonacci), où V est le nombre de sommets, E est le nombre d'arêtes.

O(V^2) en utilisant une simple liste pour stocker les distances.

Complexité spatiale :

O(V) pour stocker les distances et les ancêtres (pour reconstituer le chemin).

9.2 Implémentation de l'algorithme de Dijkstra

L'implémentation de l'algorithme de Dijkstra est longue, mais très simple. Je te recommande d'essayer de la comprendre. Si ce n'est pas clair, remonte un peu plus haut et relis les étapes principales de l'algorithme.

Exemple d'implémentation de l'algorithme de Dijkstra en utilisant une file de priorité (tas) :


import heapq

def dijkstra(graph, start):
    # Initialisation
    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 distance actuelle est plus grande que celle enregistrée, on passe au sommet suivant
        if current_distance > distances[current_vertex]:
            continue
            
        # Mise à jour des distances pour les sommets voisins
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            # Si un chemin plus court vers le sommet voisin est trouvé
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                parents[neighbor] = current_vertex
                heapq.heappush(priority_queue, (distance, neighbor))
            
    return distances, parents
            
# Exemple d'utilisation :
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("Les distances les plus courtes depuis le sommet de départ :", distances)
print("Les ancêtres pour reconstituer le chemin :", parents)

Sortie :


Les distances les plus courtes depuis le sommet de départ : {'A': 0, 'B': 1, 'C': 3, 'D': 4}
Les ancêtres pour reconstituer le chemin : {'A': None, 'B': 'A', 'C': 'B', 'D': 'C'}

9.3 Exemples de problèmes résolus avec l'algorithme de Dijkstra

Exemples classiques de problèmes résolus avec l'algorithme de Dijkstra :

1. Optimisation des itinéraires dans les réseaux de transport

Trouver le plus court chemin entre des points dans un réseau de transport (par exemple, entre des villes).

Application :

Les systèmes de navigation, comme Google Maps, utilisent l'algorithme de Dijkstra pour calculer les itinéraires optimaux.

2. Planification des itinéraires de livraison

Optimisation des itinéraires pour les services de livraison de marchandises, afin de minimiser les coûts et le temps de livraison.

Application :

Les entreprises de logistique utilisent l'algorithme de Dijkstra pour planifier les itinéraires de livraison et réduire les coûts opérationnels.

3. Gestion des réseaux

Optimisation du routage des paquets de données dans les réseaux informatiques pour minimiser les retards et augmenter la bande passante.

Application :

Les protocoles de routage, tels que OSPF (Open Shortest Path First), utilisent l'algorithme de Dijkstra pour trouver les plus courts chemins dans les réseaux.

4. Analyse des réseaux sociaux

Trouver les plus courts chemins et mesurer la centralité dans les graphes sociaux (par exemple, pour identifier les utilisateurs les plus influents).

Application :

Les plateformes sociales analysent les connexions entre utilisateurs pour fournir des recommandations et analyser l'activité réseau.

5. Jeux et mondes virtuels

Trouver le chemin pour les personnages dans les mondes de jeu avec des obstacles et différents niveaux de difficulté.

Application :

Les moteurs de jeu utilisent l'algorithme de Dijkstra pour calculer les déplacements des personnages et des objets dans les mondes virtuels.

6. Systèmes de gestion de l'énergie

Optimisation de la distribution de l'énergie dans les réseaux électriques pour minimiser les pertes et assurer la fiabilité des approvisionnements.

Application :

Les compagnies d'électricité utilisent l'algorithme de Dijkstra pour optimiser les routes de transmission d'énergie dans les réseaux, afin de minimiser les pertes d'énergie et éviter les surcharges.

Exemple :

Dans les réseaux électriques, chaque nœud représente une sous-station, et les arêtes sont des lignes de transmission avec différents niveaux de résistance. L'algorithme de Dijkstra aide à trouver le chemin avec la moindre résistance de la source d'énergie au consommateur.

7. Systèmes d'évacuation et planification de chemin

Optimisation des itinéraires d'évacuation dans les bâtiments ou les villes pour un retrait rapide et sécurisé des gens en cas d'urgence.

Application :

Les architectes et ingénieurs utilisent l'algorithme de Dijkstra pour planifier les itinéraires d'évacuation, afin de garantir un retrait sûr et rapide des personnes des zones dangereuses.

Exemple :

Dans un immeuble résidentiel ou un immeuble de bureaux, les nœuds du graphe représentent les chambres et les couloirs, et les arêtes sont les trajets entre eux. L'algorithme de Dijkstra peut être utilisé pour trouver le chemin le plus court depuis n'importe quel point du bâtiment vers la sortie la plus proche.

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