Programmer l'algorithme de Bellman

Notions utilisées

Cahier des charges

Le programme sert à calculer des plus courts chemins en O(m) dans un graphe sans circuit à m arcs. Nous décrivons précisément le résultat attendu.

L'utilisateur dispose d'un graphe orienté d'ordre "ordre", dont les sommets sont notés 0, 1, ..., ordre - 1. Les arcs de ce graphe sont valués par des nombres entiers de signes quelconques. Le graphe est décrit dans un fichier contenant d'abord l'ordre du graphe puis la liste des arcs codés sous la forme suivante : origine extrémité longueur.
Par exemple, le graphe ci-dessous :


graphe1

est décrit par le fichier graphe1.don.

Par exemple, avec graphe1.don, l'exécution du programme pourrait donner :
 bellman
Indiquez le nom du fichier décrivant le graphe
graphe1.don

Depuis quel sommet voulez-vous calculer les distances ? 
(taper -1 pour terminer) : 2

Depuis 2 :
pour atteindre 0, on peut suivre : 2 1 0    distance parcourue : -4.000000
pour atteindre 1, on peut suivre : 2 1    distance parcourue : 3.000000

Depuis quel sommet voulez-vous calculer les distances ? 
(taper -1 pour terminer) : 1

Depuis 1 :
pour atteindre 0, on peut suivre : 1 0    distance parcourue : -7.000000
le sommet 2 n'est pas accessible

Depuis quel sommet voulez-vous calculer les distances ? 
(taper -1 pour terminer) : -1

Spécifications

Numérotation topologique

Afin de savoir s'il y a un circuit et de pouvoir calculer des plus courts chemins, le programme effectuera une numérotation topologique. Nous rappelons ici une façon de calculer une numérotation topologique. On utilise une pile P, et les numéros sont calculés entre 0 et ordre - 1 et mis dans un tableau de nom num. On calcule en même temps un tableau donnant la réciproque de la numérotation topologique : si ce tableau est noté deNum, deNum[i] doit valoir x si et seulement si le numéro topologique de x vaut i.

Algorithme de Bellman

L'algorithme part de l'hypothèse que le graphe est sans circuit et utilise une numérotation topologique mise dans le tableau num.
Supposons qu'il s'agisse de déterminer l'arborescence des plus courts chemins depuis un sommet noté ici départ, sommet qui n'est pas nécessairement racine du graphe. L'algorithme utilise deux tableaux que nous appelons distance et antécédent et procède de la façon suivante. Les sommets qui, à la fin de l'algorithme, ont une distance qui vaut infini sont les sommets qui ne sont pas accessibles à partir de départ. Pour les autres sommets, le tableau distance indique la distance depuis le sommet départ et le tableau antécédent permet de retrouver les plus courts chemins cherchés.

Le travail à faire


Irene Charon
Last modified: Wed Oct 10 19:38:35 MEST 2001