Dr C. Bachtarzi Filière : L2 Socle commun informatique Chapitre 3 Problème du plus court chemin 1. Introduction Les problèmes de cheminement dans les graphes comptent parmi les plus anciens problèmes de la théorie des graphes. Il existe de nombreux problèmes spécifiques aux chemins. On en cite quelques uns : 1) Soient i et j ∈ X : - Existe-t-il au moins un chemin de i à j ? - Existe-t-il au moins un chemin de longueur p entre i et j ? - Quel est le nombre de chemins de longueur inférieure ou égale à p entre i et j ? 2) Trouver le ou les chemins qui relient le sommet s à tous les autres sommets et qui satisfont une propriété P. 3) Trouver les chemins qui relient tout couple de sommets et qui satisfont une propriété P. 2. Introduction au problème du plus court chemin Etant donné un graphe G=(X,A) orienté tel que chaque arc (i,j) possède un nombre (i,j) appelé longueur de l’arc (i,j). Le problème du plus court chemin (PCC) consiste à déterminer un chemin élémentaire Ch joignant les sommets i et j et qui soit de longueur extrémale (minimale ou maximale selon l’objectif). La longueur du chemin optimal est égale à la somme des longueurs des arcs du chemin. On considère d’une manière plus générale deux types de problèmes : - Problème P1 : Il s’agit de trouver le plus court chemin reliant un sommet à tous les autres. - Problème P2 : il s’agit de trouver tous les plus courts chemins entre tous les couples de sommets. 4. Algorithmes proposés pour trouver le PCC Pour la résolution du problème du plus court chemin, divers algorithmes de complexité en temps polynomial ont été proposés. Leur application dépend souvent de la nature du graphe. 17 Dr C. Bachtarzi Filière : L2 Socle commun informatique Si l’on considère un problème de type P1, on a le choix entre Les algorithmes de Dijkstra et de Bellman–Ford. Lorsque le graphe ne comporte pas de cycle, on utilise généralement l’algorithme de Bellman–Ford. Lorsque les longueurs des arcs sont toutes positives, on utilise l’algorithme de Djikstra. Pour les problèmes de type P2, on a également le choix entre deux algorithmes : l’algorithme de Dantzig et celui de Floyd-Warshall qui sont des algorithmes matriciels applicables quelque soient les longueurs des arcs. 4.1 Résolution de problèmes de type P1 Dans cette section sont présentés les algorithmes suivants : l’algorithme de Djikstra et l’algorithme de Bellman-Ford. 4.1.1 Algorithme de Djikstra Comme l’algorithme de Bellman-Ford, il utilise le principe de la programmation dynamique. Mais contrairement à ce dernier, l'algorithme de Djikstra ne permet pas de considérer les arcs négatifs, car une fois qu’un sommet est marqué on ne peut changer ce marquage lors des itérations suivantes. Algorithme : Djikstra (G,s) Etape 1 : initialisation Soit s ∈ X /*sommet de départ*/ Soit "(x) : le label de x ou la longueur du pcc de s à x à l’étape i Xm ← ∅ ; "(s) ← 0 ; /* Xm est l’ensemble des sommets marqués*/ ∀ / ∈ 0 – 234 "(x) = ∞; Am ←∅; /* Am est l’ensemble des arcs du PCC */ Etape 2 : Traitement Tant que Card( Xm ) < n Faire x ← Min (L(x)) ∀ / ∈ 0 –Xm /*Choisir x de plus petit label parmi les sommets non marqués */ Xm ← Xm ∪ 2x4 ; /*marquer x */ Am ← Am ∪ 2(pred(x), x)4 ; /*marquer l’arc de provenance du min*/ Pour tout y ∈ Voisins(x) et y ∉ Xm Faire "(y) = Min("(y), L(x)+ d(x,y)) ; Fin pour Fin tant que Etape 3 : Résultat Am contient les arcs du PCC "(x) est la longueur du PCC Fin 18 Dr C. Bachtarzi Filière : L2 Socle commun informatique 4.1.2 Algorithme de Bellman-Ford L’algorithme de Bellman-Ford utilise le principe de la programmation dynamique pour déterminer le plus court chemin dans un graphe orienté pondéré. Il est applicable même dans le cas où certains arcs ont une longueur négative.la seule contrainte est que le graphe ne doit pas comporter de circuits. Algorithme : Bellman-Ford (G,s) Etape 1 : initialisation /*sommet de départ*/ Soit s ∈ X Soit "(x) : la longueur du pcc de s à x /* Xm est l’ensemble des sommets marqués*/ Xm ← 2s4 ; "(s) ← 0 ; /* Am est l’ensemble des arcs du PCC */ Am ←∅; Etape 2 : Traitement Tant que Card( Xm ) < n Faire Si il ∃ y ∈ X-Xm / pred(y) ⊂ Xm Alors Xm ← Xm ∪ {y} ; /*marquer y*/ "(y) ← KLMN ∈OPQR(S) ("(T) + U(T, V)); Am ← Am ∪ {(z,y)} ; /*marquer l’arc du min*/ Fin si Fin tant que Etape 3 : Résultat Am contient les arcs du PCC "(x) est la longueur du PCC Fin 19