Nous sommes à la recherche du chemin le plus court. Cela signifie que la somme des poids des arcs du chemin sélectionné doit être le plus faible possible.
L'algorithme de Moore-Dijkstra est une amélioration de l'algorithme de Floyd. Il est plus complexe que ce dernier, mais son exécution est beaucoup plus rapide.
Si nous sommes certains que notre graphe présente un ou plusieurs circuits, nous pouvons appliquer l'algorithme de Moore-Dijkstra qui nous permet une exploration progressive, sans back-tracking (retours en arrière)[3].
Nous utiliserons un ensemble D (definedVertices) qui contiendra les sommets traités.
Au départ, definedVertices contient seulement le sommet racine[4].
Nous allons fixer une valeur tellement haute[5] que tout au long de l'exécution de l'algorithme nous ne devrons jamais définir de nouvelles valeurs qui lui soient égales ou supérieures.
Le principe de relâchement nous permet d'utiliser cette borne supérieure sur le poids du plus court chemin, et de diminuer progressivement cette borne.
A chaque étape, nous devons choisir le sommet x à traiter parmi les sommets non encore traités, avec le chemin de poids le plus faible depuis le sommet précédent (x->y).
Il s'agit d'un choix glouton[6], qui dans ce cas se révèle optimal.
Nous retirons ensuite x des sommets à traiter (en ajoutant son indice dans definedVertices).
Nous devons maintenant consulter les poids de x vers tout sommet non traité.
Pour tous les sommets non traités restants, nous comparons le poids du chemin (r->x->y) entre la racine r et ce sommet y en passant par x.
Si le poids du nouveau chemin est inférieur au poids précédent (dans pathMinWeights), il est retenu comme meilleur chemin, et la valeur de pathMinWeights est remplacée par ce meilleur chemin, et donc diminuée (relâchement).
Nous pouvons décomposer notre algorithme en deux phases : une phase d'initialisation des valeurs, et une phase d'exécution qui décrit ce qui se passe lorsque l'algorithme est exécuté.
Dans cette approche, nous utilisons des collections indexées (par exemple des tableaux) pour maintenir les différentes informations relatives aux états de chaque objet Sommet. Dans une approche "orienté-objet", nous pouvons maintenir ces informations par exemple dans l'objet Sommet lui même.
Nous utiliserons aussi certaines variables supplémentaires :
arrayFirstIndex : indice du premier élément dans un tableau[7].
//Il reste des sommets non traités /*i est l'indice de x, j est l'indice de y x est non traité, et le chemin(r,x) est le plus court de tous les chemins de r vers un sommet non traité */ (pathMinWeights[i]=minimum{pathMinWeights[j]∀j∈ X\definedVertices})}; //k pointe à présent sur le prochain emplacement libre de definedVertices k := k+1; //i est défini comme étant traité definedVertices[k] := i; //vérifier si ce chemin est le meilleur /*si x est un précédent de y sur un chemin plus court que le meilleur chemin actuel...*/ //le poids du chemin vers "y" est mis à jour pathMinWeights[j] := pathMinWeights[i]+weight(i,j); //j est l'indice du sommet précédent de "x" verticesLabels[i] := j;
A la ligne 2, le test de comparaison k < n s'applique aux langages pour lesquels le premier indice d'un tableau est 0. Dans le cas où le premier indice est 1, nous devons remplacer le test par k ≤ n.
Nous pouvons éviter de calculer un certain nombre de fois l'opération pathMinWeigths[j]+weight(j,i) en utilisant une fonction memo qui effectuera seulement les calculs nécessaires.
//vérifier si ce chemin est le meilleur tempWeight := memo(pathMinWeights[i]+weight(i,j)); /*si x est un précédent de y sur un chemin plus court que le meilleur chemin actuel...*/ //le poids du chemin vers "y" est mis à jour pathMinWeights[j] := tempWeight; //j est l'indice du sommet précédent de "x" verticesLabels[i] := j;
Même si nous utilisons une stratégie gloutonne[6], l'algorithme de Moore-Dijkstra nous retourne toujours le chemin optimum, pour autant que les hypothèses de départ sur notre graphe s'avérent exactes (notamment le fait que le graphe ne possède aucun arc de poids négatif). L'algorithme de Moore-Dijkstra est plus rapide que l'algorithme de Ford-Bellman.
Lorsque nous sommes en possession de bornes (sommet de départ, sommet d'arrivée, etc.), nous préférerons l'algorithme de l'heuristique A*, qui est plus rapide que l'algorithme de Moore-Dijkstra, car il limitera l'exploration aux sommets qui sont "dans la direction" de l'arivée au lieu d'évaluer les sommets "tout azimut".
Nous pouvons avoir, au lieu d'un graphe, un tableau à double entrée dans lequel chaque sommet est une colonne et une ligne. Chaque cellule contient donc le poids (la distance, le coût, etc.) entre deux sommets (villes).
Ce type de représentation (par exemple les distances entre différentes villes) est totalement identique à un graphe dont les arêtes (trajet entre deux villes) sont pondérées (distance entre deux villes).
Le protocole de routage IP OSPF (Open Shortest Path First) utilise l'algorithme de Dijkstra pour déterminer la route la plus courte vers les différents réseaux.
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
29 mots clés dont 26 définis manuellement (plus d'information...).
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Cours de Théorie des Graphes et réseaux de Petri(Septembre 2008)
Implémentation de l'algorithme de Moore Dijkstra(version 27/12/09)
Démonstration interactive par applet Java(version 28/12/09)
L'algorithme de Dijkstra(version 27/12/09)
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)