Algorithme de Bellman-Ford

Maths

In : un graphe orienté pondéré sans cycle négatif et

Out : Une liste de taille contenant les distances minimales séparant de tous les autres nœuds.

Init : et . On créé une liste de distances séparant des autres nœuds. On initialise les distance à une valeur de pour que les comparaisons qui suivent puissent rapidement remplacer cette valeur et la distance séparant de est .

Loop : Répète fois :

    • si alors

Description

  1. On créé la liste
  2. Ensuite on répète fois la procédure suivante
  3. Pour chaque arête reliant à on regarde si la distance à l'arête peut être raccourcie en prenant la distance à l'arête plus le poids de l'arête qui les sépare.
  4. contient les valeurs recherchées.

Implémentation Python

# Cette fonction admet qu'il n'y a pas de cycle négatif dans le graphe. 
def bellman_ford(graph, source):

    distance = {vertex: float('infinity') for vertex in graph}
    distance[source] = 0

    for i in range(len(graph) - 1):
        for u, v, weight in graph.edges():
            if distance[u] + weight < distance[v]:
                distance[v] = distance[u] + weight

    return distance

Complexité

Spatiale :

Temporelle :


Preuve de validité

Preuve par induction

Observations :

Après répétitions :

  1. Si , alors est le coût d'un chemin de vers (pas forcément le plus court)
  2. Si un chemin de vers d'au plus arêtes, alors est au coût du plus court chemin de vers comptant au plus arêtes

Si on arrive à démontrer ces observations on aura démontré que l'algorithme est correct.

Cas initial :

On a et

Cas général :

Si a été mis à jour selon la formule alors est la longueur du chemin allant de à qui suit le chemin allant de à et ensuite vers . Ce qui prouve la première observation.

Pour la seconde observation, si on considère un chemin de longueur minimale (il peut y en avoir plusieurs) allant de à avec au plus arêtes. Soit le dernier nœud avant . Alors, le chemin allant de à dans (qu'on peut noter ) est un chemin de longueur minimale avec au plus arêtes parce que sinon il y aurait un chemin plus court avec au plus allant de à que ce qui est une contradiction.

Nous faisons maintenant l'hypothèse inductive que ( étant la fonction qui donne la somme des poids des arêtes d'un parcours).

À l'itération on calcule On sait que on a donc que ce qui démontre la seconde observation.

Comme il n'y a pas de cycle négatif le chemin le plus court ne passera pas plus d'une fois par chacun des nœuds et donc après cycles nous auront toujours le chemin le plus court.

Preuves externes :

  1. MIT
  2. Wikipedia EN, FR