Retourner au courant

Algorithme de Johnson - Exemple

L'algorithme de Johnson est un algorithme de recherche de plus court chemin entre chaque sommet d'un graphe de poids négatifs ou non.

ENFR日本語

Prérequis

Afin de comprendre le fonctionnement de l’algorithme de Johnson, il est nécessaire de connaître deux autres algorithmes de plus court chemin :

  1. Algorithme de Dijkstra - Exemple
  2. Algorithme de Bellman-Ford - Exemple

Idée de l’algorithme

  1. Ajout d’un sommet : Nous ajoutons un sommet ww au graphe GG ainsi que V|V| arrêtes reliant ww à chaque sommet de GG.
  2. Nous utilisons l’algorithme de Bellman-Ford depuis ww vers tous les autres sommets de GG. d(s)d(s) nous donne la distance entre ww et ss Si Bellman-Ford détecte un cycle absorbant, l’algorithme s’arrête.
  3. Suppression du sommet ww : Ce sommet n’est désormait plus utile. Supprimez ce sommet ainsi que toutes les arrêtes ajoutées à l’étape 1.
  4. Repondérons les arcs du graphe : Pour chaque arrête (u,v)(u,v) du graphe, faire : p((u,v)):=p((u,v))+d(u)d(v)p((u,v)) := p((u,v)) + d(u) - d(v).
  5. Calcul du plus court chemin. Pour chaque sommet de GG, appliquez l’algorithme de Dijkstra afin de déterminer le plus court chemin entre tous les sommets.

Il faut bien prendre en compte que les distances ne sont pas conservées. Si pour un arcs, nous avions un poids de 2-2, le nouveau poids sera 0\geq 0. Cependant, ce n’est pas le propos. L’algorithme de Johnson nous donne le plus court chemin d’un points AA à un points BB “uniquement”. Si vous avez besoin de récupérer la somme des poids de ce chemin, il suffit de retourner dans le graphe initial et de suivre le chemin donnée par Johnson.

Algorithme / Correction / Complexité

Cet article présente seulement un exemple d’application de l’algorithme de Johnson. Vous pouvez cependant facilement trouver ces informations sur internet :

Exemple :

Soit GG un graphe avec des arcs de poids négatif.

Graphe Initial

Etape 1 - Ajout du sommet w

Ajout de w

Etape 2 - Plus courts chemins entre w et les autres sommets avec Bellman-Ford

Plus courts chemins ajoutés

En violet les résultats de l’algorithmes de Bellman-Ford.

Etape 3 et 4 - Repondération des arcs

Repondération des arcs

Etape 5 - Algorithme de Dijkstra sur tout les arcs

Nous avons au final le graphe GG' suivant :

Graphe G'

L’étape 5 est uniquement une application de l’algorithme de Dijkstra. Un exemple d’utilisation est déja détaillé sur ce site : Algorithme de Dijkstra - Exemple.

Pour prendre plusieurs résultats de l’algorithme de Dijkstra :

  • Pour aller de a à d, le chemin à prendre est abcda \rightarrow b \rightarrow c \rightarrow d de poids -9 (et non 0, il faut prendre les poids de GG et pas de GG').
  • Pour aller de f à d, le chemin à prendre est fecdf\rightarrow e \rightarrow c \rightarrow d de poids -2.
  • Pour aller de d à e, il n’existe pas de chemin possible.

Le reste sera laissé en exercice pour le lecteur.