Académique Documents
Professionnel Documents
Culture Documents
L’ALGORITHME DE
BELLMAN-FORD ET SON
APPLICATION AU ROUTAGE
À VECTEUR DE DISTANCE
3. RÉPÉTITION
L’algorithme répète l’étape de relaxation pour chaque arête (V1) fois, où V est le
nombre total de sommets dans le graphe. C’est parce que dans un graphe sans
cycle de poids négatif, tout chemin le plus court visite chaque sommet au plus
une fois, donc nous n’avons besoin de relaxer les arêtes que (V-1) fois au
maximum.
4. DÉTECTION DES CYCLES DE POIDS NÉGATIF
l’algorithme tente de relaxer toutes les arêtes une fois de plus. Si nous pouvons
encore relaxer une arête à ce stade, alors cela signifie qu’il y a un cycle de poids
négatif dans le graphe. C’est parce que si un tel cycle existait, nous pourrions
continuer à relaxer les arêtes indéfiniment et continuer à améliorer la distance
du sommet de destination à la source.
III. PSEUDOCODE DE L’ALGORITHME DE BELLMAN-
FORD
À l'issue de l'exécution de cet algorithme, d[u] représente la longueur d'un plus
court chemin de s à u dans G, alors que pred[u] représente le prédécesseur de u
dans un plus court chemin de s à u . La valeur null signifie qu'aucun
prédécesseur n'a pour l'instant été assigné à pred[u].
L'algorithme de Bellman-Ford n'est correct que dans un graphe sans cycle de
poids négatif. On peut détecter la présence d'un tel cycle (à condition qu'il soit
accessible depuis le sommet s) de la façon suivante : il y a un cycle de poids
négatif si et seulement si un nouveau tour de boucle fait diminuer une distance.
Ainsi, à la fin de l'algorithme, on fait :
Implémentation de l’algorithme de Bellman Ford en python :
Def Bellman Ford (graph, sommetDepart) :
distances = {}
predecesseurs = {}
for sommet in graph:
distances[sommet] = np.inf
predecesseurs[sommet] = None
distances[sommetDepart] = 0
for i in range(len(graph)-1):
for j in graph:
for k in graph[j]:
if distances[k] > distances[j] + graph[j][k]:
distances[k] = distances[j] + graph[j][k]
predecesseurs[k] = j
for i in graph:
for j in graph[i]:
assert distances[j] <= distances[i] + graph[i][j]
return distances, predecesseurs
#Liste d'ajacence du graphe
graph = {'A':{'B':15,'C':4},'B':{'E':5},'C':{'E':11,'D':2},'D':{'E':3},'E':{}}
distances, predecesseurs = bellmanFord(graph,'A’)
print("Plus courte distance pour chaque sommet de départ :")
for v in distances: print(str(v) + '-' + str(distances[v]))
Iv. APPLICATION AU ROUTAGE À VECTEUR DE DISTANCE
.