ioCode
Bellman-Ford
Programmation dynamique • Cours-TP 2A
Plus courts chemins dans un graphe orienté - Algorithme de Bellman-Ford
Soit , un graphe orienté et pondéré ci-dessous ne possédant pas de circuits de poids négatif.
Si représente le nombre de sauts autorisés pour atteindre un sommet et la distance du sommet de départ au sommet en effectuant sauts, alors cela peut se traduit mathématiquement par :
Par cette formule, on exprime bien la distance entre et (le poids du chemin minimal) en saut en fonction des distances de à en sauts, c'est-à-dire la solution optimale du problème en fonction des solutions optimales des sous-problèmes.
On considère le graphe suivant :
- Représenter le graphe orienté et pondéré dessiné ci-dessus sous la forme d'une liste d'adjacence stockée dans la variable1IndiceConstruire la liste d'adjacence en associant chaque sommet à ses voisins pondérés. Il s'agit de créer une liste de liste de tuple
(sommet, poids).g. - Écrire une fonction2IndiceParcourir la structure imbriquée avec les indices des sommets pour extraire les triplets source-cible-poids.
ladj_to_triplets(g)qui renvoie la liste des triplets(u, v, poids). Par exempleladj_to_triplets([[ (1, 3) ]])renvoie[(0, 1, 3)]. - Écrire une fonction3IndiceInitialiser les distances à l'infini et la source à zéro puis étudier chaque arête.
bellman_ford(g, s0)qui calcule les plus courts chemins depuis la sources0et renvoie le couple(liste_des_distances, liste_des_prédécesseurs). Par exemplebellman_ford([[ (1, 5) ]], 0)renvoie([0, 5], [0, 0]). - Écrire une fonction4IndiceParcourir chaque liste de voisins pour accumuler les prédécesseurs pondérés dans une nouvelle structure.
pred(g)qui calcule les prédécesseurs pondérés de chaque sommet et renvoie cette structure de données. Par exemplepred([[ (1, 2) ]])renvoie[[], [(0, 2)]]. - Écrire une fonction5IndiceVérifier la mémoire cache avant de calculer la valeur minimale en combinant les appels récursifs sur les prédécesseurs.
distance(s, i, s0, pred, memo)qui calcule la distance minimale vers le sommetsen utilisant au plusiarêtes et renvoie ce résultat mémorisé. Par exempledistance(1, 1, 0, [[], [(0, 5)]], {})renvoie5. - Écrire une fonction6IndiceItérer sur tous les sommets pour récupérer leurs distances optimales via la fonction de récurrence mémorisée.
bellman_ford_desc(g, s0)qui calcule les distances depuis la sources0et renvoie la liste de ces distances. Se servir des fonctions précédentes ! Par exemplebellman_ford_desc([[ (1, 5) ]], 0)renvoie[0, 5].
Langage
Console initialisée. En attente de l'interpréteur...