0% ont trouvé ce document utile (0 vote)
30 vues4 pages

TD7 Chemins (8371)

Le document présente des exercices sur la recherche du plus court chemin dans un graphe orienté, en utilisant l'algorithme de Dijkstra et l'algorithme de Bellman-Ford. Il aborde des cas avec des poids d'arcs positifs et négatifs, ainsi que des modifications des algorithmes pour résoudre différents problèmes de chemin. Les exercices incluent des applications pratiques et des questions théoriques sur les relations entre les distances et les poids des arcs.

Transféré par

Logbo Axelle
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
30 vues4 pages

TD7 Chemins (8371)

Le document présente des exercices sur la recherche du plus court chemin dans un graphe orienté, en utilisant l'algorithme de Dijkstra et l'algorithme de Bellman-Ford. Il aborde des cas avec des poids d'arcs positifs et négatifs, ainsi que des modifications des algorithmes pour résoudre différents problèmes de chemin. Les exercices incluent des applications pratiques et des questions théoriques sur les relations entre les distances et les poids des arcs.

Transféré par

Logbo Axelle
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

L3 Informatique/MIAGE 2021–2022

TD7 : Recherche du plus court chemin dans un graphe orienté


— Rappel : cas des valeurs positives sur les arcs —

Algorithm 1 Dijkstra (G, l, s)


Require: Graph G = (V, E) with positive edge weights {le > 0 : e ∈ E} and s ∈ V .
Ensure: ∀u ∈ V, dist(u) is set to the shortest distance from s to u; prev(u) points to the previous
of u on this shortest path.
1: for u ∈ V do
2: dist(u) ← ∞
3: prev(u) ← nil
4: end for
5: dist(s) ← 0
6: P ← ∅ . P contains the vertices v, such that dist(v) is definitively computed.
7: T ← V . T contains the vertices v, such that dist(v) is only an upper bound.
8: while T 6= ∅ do
9: u ← argmin dist(v)
Sv∈T
10: P ← P {u}
11: T ← T \ {u}
12: for (u, v) ∈ E do
13: if dist(v) > dist(u) + l(u, v) then
14: dist(v) = dist(u) + l(u, v)
15: prev(v) ← u
16: end if
17: end for
18: end while
19: return (dist, prev)

Exercice 1 (Algorithme de Dijkstra).


1. Appliquer l’algorithme de Dijkstra (Algorithme 1) au graphe de la figure 1 afin de
calculer les chemins de poids minimal entre A et les autres sommets du graphe.
À la fin du calcul :
— chaque sommet i sera associé à un couple (dist(i), prev(i)) ;
— l’arborescence des chemins les plus courts de A sera mise en évidence sur le
graphe (exemple : mise en gras des arcs concernés).
2. Quelle est la relation entre dist(x), dist(y) et l(x, y) pour tout arc (x, y) de l’arbo-
rescence fabriquée par l’algorithme de Dijkstra ? Notons cette relation R.
3. Montrer à l’aide d’un exemple que lorsque les poids peuvent être négatifs, l’algorithme
de Dijkstra ne donne pas nécessairement les plus courts chemins. Est-ce que la relation
R est vraie dans ce cas aussi ?

1
1000 20
A C E
700 327
250 334

B D F
150 1001

Figure 1 – Graphe pour l’exercice 1 Figure 2 – Graphe avec des arcs pon-
. dérés dans Z

Exercice 2 (Chemin de valeur optimale dans un graphe avec des arcs de longueur/poids
quelconque). On considère le graphe de la figure 2
1. On cherche à obtenir les chemins les plus courts permettant de rejoindre tous les
sommets du graphe à partir de a. Quels sont les algorithmes vus en cours pour
résoudre ce problème ? Connaissez-vous plusieurs variantes de ces algorithmes ? Si
oui, appliquer la variante dont les conditions d’application sont vérifiées.
2. Comment modifier cet algorithme de façon à résoudre le problème de recherche des
chemins les plus longs ? À quelle condition cet algorithme est-il applicable ?
Appliquer l’algorithme modifié sur le graphe ci-dessus.
3. En ajoutant une constante suffisamment grande au poids de chaque arc, on peut
rendre ce poids positif. On décide alors d’appliquer l’algorithme de Dijkstra au nou-
veau graphe pondéré pour trouver les plus courts chemins de a à tout sommet. Cette
idée est-elle bonne ? Justifiez.
4. On considère maintenant un graphe pondéré où tous les poids ont une valeur négative.
En considérant l’opposé des poids, peut-on résoudre le problème du plus court chemin
à l’aide de l’algorithme de Dijkstra ?
5. Pour un graphe quelconque, comment modifier l’algorithme de Dijkstra de façon à
ce qu’il trouve le chemin le plus court du sommet initial a à un sommet t supposé
donné ?
6. Pour un graphe quelconque, comment modifier l’algorithme considéré dans la pre-
mière question pour faire la même chose ?

2
Exercice 3. On considère le graphe défini par la matrice d’adjacence suivante :

a b c d e f g h
a 1 1 1 1
b 1 1 1
c 1 1
d 1
e 1 1 1
f 1 1
g 1
h

Ce graphe est pondéré, mais un accident a fait disparaître presque toutes les informations
sur la valeur des arcs. Cependant, on sait que :
1. Toutes les valeurs sont entières, non négatives ;
2. La valeur de l’arc (e, d) est égale à 5 ;
3. Les valeurs minimales disti des chemins de a à i (calculées en additionnant les valeurs
des arcs) sont égales à :

Sommet a b c d e f g h
dist 0 8 7 15 10 3 13 20

4. Dans l’arborescence des chemins de valeur minimale issus de a, on a prevh = g,


prevg = b. Cette arborescence est unique.
Déterminer l’arborescence des chemins de valeur minimale issus de a (en particulier la
valeur des arcs qui la composent), ainsi qu’un minorant de la valeur des arcs qui n’appar-
tiennent pas à cette arborescence.

3
— Rappel : présence de valeurs négatives sur les arcs —

Algorithm 2 Bellman-Ford(G, l, s)
Require: Graph G = (V, E) with edge weights {le : e ∈ E} with no negative cycles and s ∈ V .
Ensure: ∀u ∈ V reachable from s, dist(u) is set to the shortest distance from s to u.
1: for u ∈ V do
2: dist(u) ← ∞
3: end for
4: dist(s) ← 0
5: k ← 1
6: while k ≤ |V | − 1 do
7: for (u, v) ∈ E do
8: dist(v) ← min {dist(v), dist(u) + l(u, v)}
9: end for
10: k ←k+1
11: end while
12: return dist

Algorithm 3 Bellman-Ford_bis(G, l, s)
Require: Graph G = (V, E) with edge weights {le : e ∈ E} and s ∈ V .
Ensure: ∀u ∈ V reachable from s, distk (u) is set to the shortest distance from s to u over all
paths with at most k arcs. It also detects the presence of negative cycle.
1: for u ∈ V do
2: dist0 (u) ← ∞
3: end for
4: dist0 (s) ← 0
5: stable ← f alse
6: k ← 1
7: while k ≤ |V | and ¬stable do
8: distk (s) ← 0
9: for v ∈ V \ {s} do
10: distk (v) = min {distk−1 (v), min distk−1 (u) + l(u, v)}
u∈Γ−1 (V )
11: end for ^
12: stable ← distk (v) = distk−1 (v)
v∈V
13: k ←k+1
14: end while
15: if k = |V | + 1 then
16: return there is at least one negative cycle
17: end if
18: return dist

Vous aimerez peut-être aussi