Cours sur les graphes : petit contrôle

publicité
IUT Info 2 GI
Année 2007-08
Période 1 et 2
Cours sur les graphes : petit contrôle
Florent Madelaine
Algorithme 1 : Bellman-Ford
Données
→
−
G un graphe orienté valué sans circuit de longueur strictement négative
→
−
s un sommet de G
Variables locales
L tableau des distances depuis s
/* indexé par les sommets */
Nom :Corrigé
Prénom :
L’algorithme de Bellman-Ford
On rappelle l’algorithme vu en cours ci-contre.
P red tableau des prédécesseurs sur un plus court chemin depuis s
(u, v) un arc
début
initialisation
L[s] := 0
pour tous les sommet v 6= s faire L[v] := +∞
tant que L change faire
/* relaxation de l’arc (u, v) */
→
−
pour chaque arc (u, v) de G faire
→
−
si L(v)>L(u)+length((u, v, G )) alors
→
−
L(v) :=L(u)+length((u, v, G ))
a- Expliquer comment faire pour stocker les plus courts chemins calculés ?
On mémorise pour chaque sommet, son prédécesseur sur un chemin depuis la source s. Ainsi à chaque fois qu’on relâche un arc (u, v), cela
signifie que le chemin de s à v passe dorénavant par u, autrement dit
le prédécesseur de v est maintenant le sommet u. On peut par exemple
stocker ces prédécesseurs dans un tableaux indexé par les sommets du
graphe.
b- Améliorer le pseudo-code ci-contre pour mettre en place ce stockage des
plus courts chemins.
Pred[v] :=u
finsi
finprch
fintq
c- Donner un exemple de graphe orienté valué pour lequel il y a un chemin
entre deux sommets s et t mais il n’y a pas de plus court chemin de s à t.
On peut considérer par exemple un graphe pour lequel il y a un chemin
non-élémentaire entre les deux sommets s et t, chemin qui a donc un
circuit qu’on choisira en plus de poids total négatif (par exemple −1).
fin
Sorties : L, le tableau des distances des plus court chemins de s
P red, le tableau des prédécesseurs sur un plus court chemin depuis s
1
Les Algorithmes
Cours sur les graphes
d- En plus de calculer des plus courts chemins d’une source à tous les autres
sommets dans un graphe sans circuit de poids négatif, quelle autre fonction peut remplir l’algorithme de Belman-Ford dans un graphe quelconque ?
On peut décider si le graphe a un circuit de poids négatif. En effet, on a
vu en cours que l’algorithme effectue au plus n-1 itérations de la boucle
Tant Que dans un graphe sans circuit négatif. Donc, pour un graphe
quelconque, il suffit de faire une nième itération et de vérifier si oui ou
non lors de cette ultime itération le tableau L a changé.
Algorithme 2 : Variante de Bellman-Ford
Données
→
−
G un graphe orienté valué sans circuit de longueur strictement
négative
→
−
t un sommet de G
Variables locales
L tableau des distances depuis un sommet à t
Succ tableau des successeurs sur un plus court chemin à t
(u, v) un arc
début
initialisation
L[t] := 0
Variante de Bellman Ford
pour tous les sommet v =
6 t faire L[v] := +∞
tant que L change
faire
/* relaxation de l’arc (u, v) */
→
−
pour chaque arc (u, v) de G faire
→
−
si L(u)>L(v)+length((u, v, G ))
alors
→
−
L(u) :=L(v)+length((u, v, G ))
→
−
Soit G un graphe orienté et valué sans circuit négatif. On veut calculer
→
−
la distance des plus courts chemins de n’importe quel sommet de G à un
sommet particulier t. On veut aussi calculer un plus court chemin depuis
chaque sommet vers le sommet t.
e- En procédant de manière similaire à l’algorithme de Bellman Ford, donnez
le pseudo-code d’un algorithme pour réaliser cette tâche.
Succ[u] :=v
finsi
finprch
fintq
f- Expliquer comment faire pour stocker les plus courts chemins calculés ?
On mémorise pour chaque sommet, son successeur sur un chemin vers t.
Ainsi à chaque fois qu’on relâche un arc (u, v), cela signifie que le chemin
de u à t passe dorénavant par v, autrement dit le successeur de u est
maintenant le sommet v. On peut par exemple stocker ces successeurs
dans un tableaux indexé par les sommets du graphe.
fin
Sorties :
L, le tableau des distances des plus court chemins à t
Succ, le tableau des successeurs sur un plus court chemin à t
2
Les Algorithmes
Cours sur les graphes
Techniques de preuves sur les graphes
c- Faire au choix l’une des deux questions suivantes.
→
−
(1) Soit G un graphe orienté valué. Soient s, m et t trois sommets distincts
→
−
de G . Soit C un circuit de poids −1 passant par m. Soit P1 un chemin
de s à m et P2 un chemin de m à t de poids respectifs 1 et 2. Montrer
par l’absurde qu’il n’y a pas de plus court chemin de s à t.
a- Qu’est-ce qu’une preuve par l’absurde ?
Il s’agit d’une preuve pour laquelle on suppose le contraire de ce qu’on
veut montrer et on montre qu’on obtient une contradiction. Ainsi, on
peut conclure que ce qu’on veut montrer est bien vrai.
(2) Soit G un graphe (non-orienté). Soient s et t deux sommets de G. Montrez par récurrence que si il existe un chemin de s à t alors il existe un
chemin élémentaire de s à t
(1) On suppose qu’il y a un plus court chemin P de s à t de longueur
`. Soit P 0 le chemin de s à t de la forme suivante : P1 puis q fois C
puis P2 . La longueur totale de ce chemin est 1 − q + 2. Si on choisit
q suffisamment grand, on obtient une contradiction puisque P 0 est
un chemin plus court que la longueur du plus court chemin P. Par
exemple, on peut choisir q > 3 − ` et alors on a bien 1 − q + 2 < `.
b- Qu’est-ce qu’une preuve par récurrence ?
Il s’agit d’une preuve pour laquelle on montre une propriétée qui dépend d’une variable n, qu’on note P (n). Par exemple dans le cas de
graphes, n est le nombre de sommets, ou bien le nombre d’arêtes, ou
encore le nombre de fois ou une variable est répétée dans un chemin
non-élémentaire. La preuve a alors 3 étapes.
(2) Soit P un chemin de s à t. On prouve le résultat par récurrence sur
le nombre de (( boucles )) dans P (ici, une boucle est une répétition
d’un sommet dans le chemin P) en montrant la propriétée suivante.
P(n) Si il existe un chemin de s à t avec au plus m boucles, alors il
existe un chemin élémentaire de s à t (sans boucle).
(i) n = 0. Le chemin est déjà élémentaire et il n’y a rien à montrer.
(i) D’abord on montre que P est vrai pour la première valeur de n (par
exemple P (0) est vraie).
(ii) On suppose P (n) vraie. Montrons P (n + 1). Le chemin P a
n + 1 boucles. En particulier il a une boucle autour d’un sommet
x, c’est-à-dire que P est de la forme : s, . . . , s0 , x, . . . , x, t0 , . . . , t.
Considérons le chemin P 0 obtenu en enlevant cette boucle, il est
de la forme s, . . . , s0 , x, t0 , . . . , t et n’a plus que n boucles. Comme
P (n) est vraie, il existe donc un chemin élémentaire de s à t.
(ii) Ensuite, on montre que si P (n) est vraie, alors P (n + 1) est vraie.
(iii) Finalement, on peut conclure que P est vraie pour tout n puisque :
P (0) est vraie ⇒ P (1) est vraie ⇒ P (2) est vraie ⇒ . . . etc.
(iii) Conclusion : la propriétée est vraie pour tout n et on a bien
montré le résultat demandé.
3
Téléchargement