Outils pour utilisateurs

Outils du site


nsi:terminales:dynamique:bellman-ford

Ceci est une ancienne révision du document !



Warning: Constant SVG_DPI already defined in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 75

Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264

Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282

Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301

Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322

Warning: Constant SVG_DPI already defined in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 75

Warning: Constant SVG_DPI already defined in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 75

Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264

Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282

Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301

Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322

Algorithme de Bellman - Ford

Fiche Wikipedia

Comme l'algorithme de Dijkstra, il s'agit d'une recherche de plus court chemin dans un graphe.

À titre d'exemple, nous considérerons le graphe suivant :


Principe

On considère un sommet $s_0$ qui est le sommet de départ.

On crée un tableau $dist(s, k)$, où $s$ est un sommet et $k$ un entier. $dist(s, k)$ représente la longueur du plus court chemin depuis $s_0$ jusqu'à $s$ et n'utilisant que $k$ arêtes.

Initialisation

Si on ne s'autorise aucune arête, seul le point de départ peut être atteint, à coût nul. Les autres sont inatteignables.

  • $dist(s_0, 0) = 0$
  • $dist(s, 0) = \infty$ pour $s \neq s_0$

Itération

On itère sur $k$ : $k$ parcours les valeurs 1, 2, … Et pour chaque valeur de $k$, on calcule les $dist(s, k)$ pour tous les sommets.

On utilise la règle suivante : $dist(s,k)$ est la plus petite valeur entre

  • $dist(s, k-1)$,
  • le minimum des $dist(s',k-1) + poids(s',s)$ où $s'$ est un antécédent de $s$ et $poids(s',s)$ est la pondération de l'arc $s' \to s$.

Fin

Dans un graphe d'ordre $n$, si on ne fait pas de boucles, un chemin parcourt au plus $n$ sommets. Un parcours de $n$ sommets nécessite le passage de $n-1$ arêtes.

On peut donc arrêter l'itération sur $k$ quand $k = n-1$.

Réponse

Si le sommet final demandé est $s_f$, il faut renvoyer $dist(s_f, n-1)$.

Enregistrer le chemin

Dans ce qui précède, nous avons considéré que $dist(s, k)$ ne contient que la longueur d'un chemin. On peut si on le souhaite demander que $dist(s,k)$ contienne également la liste des sommets à visiter pour ce chemin. On peut aussi construire $chemin(s,k)$ pour stocker ces chemins.

Exemple


Envisageons le chemin R1 – R7

k R1 R2 R3 R4 R5 R6 R7
1 0 $\infty$ $\infty$ $\infty$ $\infty$ $\infty$ $\infty$
2 0 4 1 3 $\infty$ $\infty$ $\infty$
3 0 4 1 2 6 6 8
4 0 4 1 2 6 5 8
5 0 4 1 2 6 5 8
6 0 4 1 2 6 5 8
Remarques
  • De la ligne $k = 4$ à la ligne $k = 5$, il n'y a pas de changement. On pourrait s'arrêter là.
  • Observons à titre d'exemple le calcul pour R6. En ligne $k = 2$, on avait 3 comme meilleure distance pour R4. Cela nous donnait en ligne $k = 3$ un meilleure distance de 6 pour R6.
    Mais en ligne $k = 3$, la meilleure distance pour R4 passe à 2. Cela permet une amélioration, en ligne $k = 4$, de la meilleure distance pour R6.
  • Il suffit d'observer les colonnes qui changent. Par exemple, si la colonne R3 change, il faut consulter les colonnes R5 et R1 pour voir si elles ne changeront pas non plus.1

Chaque sommet n'a pas à considérer l'ensemble du graphe. Il n'a à connaître que les scores des ses voisins. Si on imagine les sommets comme des machines indépendantes, on peut laisser chaque machine construire sa propre colonne. Chaque fois qu'une machine change sa colonne, elle en informe ses voisins qui peuvent se mettre à jour. C'est le principe de la configuration automatique d'un réseau.

Au bout d'un moment, il n'y a plus aucun changement, le tableau se stabilise.

Implémentation

Implémentez l'algorithme de Bellman - Ford

nsi/terminales/dynamique/bellman-ford.1675445407.txt.gz · Dernière modification : de goupillwiki