No cache version.

Caching disabled. Default setting for this page:enabled (code LNG204)
If the display is too slow, you can disable the user mode to view the cached version.

Algorithme de Moore-Dijkstra

Fonctionnalités de l'algorithme de Moore-Dijkstra

  • Moore-Dijkstra est un algorithme de recherche de chemin extrême.
  • Moore-Dijkstra est utilisé sur des graphes pondérés1
  • Moore-Dijkstra s'applique aux graphes dont toutes les pondération sont positives ou nulles2. Il n'accepte pas les pondérations négatives2.
  • Moore-Dijkstra donne un résultat erroné pour la recherche de chemins extrémaux si le graphe ne possède pas de circuit.

Contents Haut

Caractéristiques de l'algorithme de Moore-Dijkstra

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 racine4.

Principe de relâchement

Nous allons fixer une valeur tellement haute5 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 glouton6, 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).

Contents Haut

Code de l'algorithme de Moore-Dijkstra

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é.

Variables

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.

  • verticesLabels est le tableau qui contient les étiquettes. L'étiquette d'un sommet x est l'indice du sommet y précédent de x dans le chemin optimum de la racine vers le sommet x.
  • pathMinWeights est le tableau du coût (poids) des chemins depuis la racine jusqu'aux différents sommets.
    pathMinWeights[i] est le poids du chemin entre la racine et le sommet X[i].
  • definedVertices est le tableau qui contient les sommets traités (définis comme ∈ au chemin à renvoyer).

Nous utiliserons aussi certaines variables supplémentaires :

  • X est l'ensemble des sommets du graphe
  • n est le nombre de sommets du graphe (la cardinalité de X).

arrayFirstIndex : indice du premier élément dans un tableau7.

Phase d'initialisation

  • k := arrayFirstIndex // Le compteur pointe sur le premier élément d'un tableau.
  • j := indice_de_la_racine // indice (dans X) du sommet racine (départ du chemin).
  • Sommets traités :
    • definedVertices[k] := j //la racine fait d'office partie du chemin, car elle est le point de départ4. Nous pouvons donc stocker au premier emplacement de definedVertices l'indice (dans X) du sommet de départ.
    • (i > k) : definedVertices[i] := arrayFirstIndex-1 // Initialisation du tableau avec une valeur hors des limites du tableau8.
  • Poids (r->x) :
    • pathMinWeights[definedVertices[k]] := 0 // Le chemin de la racine vers la racine a un poids égal à zéro.
    • (i > k) pathMinWeights[i] := 2maxCost // Valeur hors des limites du possible (double de maxCost5).
  • Étiquettes :
    • verticesLabels[definedVertices[k]] := arrayFirstIndex // Étiquette de la racine. Pointe vers un emplacement non valide car la racine n'a pas de précédent.
    • (i > k) verticesLabels[i] := arrayFirstIndex-1 // Initialisation du tableau avec une valeur hors des limites du tableau8.

Phase d'exécution

  1. //Il reste des sommets non traités
  2.  
  3. /*i est l'indice de x, j est l'indice de y
  4. x est non traité, et le chemin(r,x) est le plus court
  5. de tous les chemins de r vers un sommet non traité */
  6. := choisir x {| ( X\definedVertices)
  7. (pathMinWeights[i]=minimum{pathMinWeights[j]j X\definedVertices})};
  8.  
  9. //k pointe à présent sur le prochain emplacement libre de definedVertices
  10. := k+1;
  11.  
  12. //i est défini comme étant traité
  13. definedVertices[k] := i;
  14.  
  15. //vérifier si ce chemin est le meilleur
  16. pour_tout X\definedVertices faire
  17.  
  18. /*si x est un précédent de y sur un chemin
  19. plus court que le meilleur chemin actuel...*/
  20. si pathMinWeights[i]+weight(i,j) < pathMinWeights[j] alors
  21.  
  22. //le poids du chemin vers "y" est mis à jour
  23. pathMinWeights[j] := pathMinWeights[i]+weight(i,j);
  24.  
  25. //j est l'indice du sommet précédent de "x"
  26. verticesLabels[i] := j;
  27.  

Remarques

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.

  1. //vérifier si ce chemin est le meilleur
  2. pour_tout X\definedVertices faire
  3.  
  4. tempWeight := memo(pathMinWeights[i]+weight(i,j));
  5.  
  6. /*si x est un précédent de y sur un chemin
  7. plus court que le meilleur chemin actuel...*/
  8. si tempWeight < pathMinWeights[j] alors
  9.  
  10. //le poids du chemin vers "y" est mis à jour
  11. pathMinWeights[j] := tempWeight;
  12.  
  13. //j est l'indice du sommet précédent de "x"
  14. verticesLabels[i] := j;
  15.  

Contents Haut

Pourquoi utiliser l'algorithme de Moore-Dijkstra

Même si nous utilisons une stratégie gloutonne6, 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".

Contents Haut

Exemples d'application de l'algorithme de Moore-Dijkstra

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.

Error Infobrol

Can not display this page of the Infobrol website

Type of error (18-01)

Unknown format specifier "&"

Please try again in a few minutes…

Return to the home page




Steph