Vous êtes sur la page 1sur 4

-SA

Theorie des Graphes

Math
ematiques
TP n 6

Recherche du plus court chemin

-NC

DUT Informatique
semestre 2
Exercice 1

-BY

Algorithme de Bellman-Ford-Kalaba
On veut calculer les chemins de longueur minimale dans un graphe a` partir dun
sommet sen utilisant lalgorithme :

1.fr

lice

nce

CC

fonction [Dist, P red] = BELLMAN(G, s)


Initialisation : n = nombre de sommets de G
P red = tableau des predecesseurs initialise `a 0
Dist = tableau des distances initialise `a + (sauf Dist(s) = 0)
W = matrice des poids des arcs ( si larc nexiste pas)
Traitement : k = 1
tant que k n et il y a eu des modifications `a letape precedente faire
pour tout sommet x faire
pour tout y successeur de x faire
si Dist(x) + W (x, y) < Dist(y)
alors modifier Dist(y) et P red(y) = x
fin
fin faire
fin faire
k =k+1
fin faire

nes

-ren

1. Ecrire
une fonction [Dist,Pred] = Bellman (G,s) qui calcule les distances minimale depuis le sommet s et les listes de predecesseurs correspondantes, suivant
lalgorithme de Bellman-Ford-Kalaba.
2. Verifier quon retrouve bien les resultats obtenus dans lexercice precedent.

k x
0 0

4
3

phi

lipp

1
0

e.ro

10

ux@

uni
v

3. Ajouter la commande disp([k x Dist Pred]) juste avant la fin de la conditionnelle si alors fin et lancer la commande Bellman(G,1). Completer en
consequence le tableau de calcul des distances minimales pour le graphe exo637G.graph
depuis le sommet s = 1 :

Dist
3
4

1
0

2
0

Pred
3
4
0
0

5
0

-SA

Theorie des Graphes

DUT Informatique
semestre 2

Math
ematiques
TP n 6

-NC

Recherche du plus court chemin

Exercice 2

5
6

nce

CC

-BY

Chemins de longueur maximale


Le graphe exo895G.graph, ci-dessous, ne poss`ede pas de chemins minimaux (`a cause
du circuit de poids negatif (4, 5, 6, 4)) mais poss`ede des chemins maximaux . On peut
utiliser les memes algorithmes pour calculer les chemins maximaux chemins minimaux que ceux pour en remplacant les < par > dans les conditionnelles et par
dans les initialisations.

10

lice

1.fr

1. Ecrire
une fonction [Dist,Pred] = Bellman Max (G,s) qui calcule les distances
maximale depuis le sommet s et les listes de predecesseurs correspondantes, suivant
lalgorithme de Bellman-Ford-Kalaba.
Indication : au depart il faut remplacer les par dans Dist

e.ro

ux@

uni
v

-ren

lipp

1
0

phi

k x
0 0

Dist
2
3
4

nes

2. Completer le tableau de calcul des distances maximales avec depuis le sommet


s = 1 suivant lalgorithme de Bellman-Ford-Kalaba :

1
0

2
0

Pred
3
4
0
0

5
0

6
0

-SA

Theorie des Graphes

Math
ematiques
TP n 6

Recherche du plus court chemin

-NC

DUT Informatique
semestre 2
Exercice 3

Algorithme de Dijkstra

lice

nce

CC

-BY

fonction [Dist, P red] = DIJKSTRA(G, s)


Initialisation : n = nombre de sommets de G
P red = tableau des predecesseurs initialise `a 0
Dist = tableau des distances initialise `a + (sauf Dist(s) = 0)
W = matrice des poids des arcs ( si larc nexiste pas)
C = {1; 2; . . . ; n} (liste des sommets restant `a traiter)
Traitement :
tant que C 6= faire
x = sommet de C le plus proche de s et retirer x de C
pour tout sommet y C faire
si Dist(x) + W (x, y) < Dist(y)
alors modifier Dist(y) et P red(y) = x
fin
fin faire
fin faire

1.fr

C
1
{1 ;2 ;3 ;4 ;5} 0

lipp

D
{}

phi

s
0

e.ro

ux@

uni
v

-ren

nes

1. Ecrire
une fonction [C,x] = Sommet Optimal(Dist,C) qui trouve le sommet x
de C dont la distance Dist(x) est minimale et retire x de C (voir les exemples
page suivante) dans le cas ou toutes les distances des sommets de C sont infinies la
fonction doit renvoyer x=0 et C=[ ].

2. Ecrire
une fonction [Dist,Pred] = Dijkstra(G,s) qui calcule les distances minimales depuis le sommet s dans le graphe G et les listes de predecesseurs correspondantes, suivant lalgorithme de Dijkstra-Moore. Ajouter un controle au debut
de Dijkstra(G,s) pour que la fonction ne sexecute que si les arcs du graphe G
ont tous un poids positif. Sinon on renverra des matrices vides pour Dist et Pred
et un message davertissement dans la console (avec warning ou disp).
Indication : les poids des arcs sont dans G.edge weight les couleurs dans G.edge color
3.
8
1
4
Verifier les resultats sur le graphe
9
exo427G.graph,
ci-contre,
2
10
1
2
completer le tableau de calcul
des distances minimales et faire
1
apparatre larbre des distances
minimales en rouge.
5
3
5

Dist
2
3
4

5 1 2
0 0

Pred
3 4 5
0 0 0

-SA

Theorie des Graphes

Math
ematiques
TP n 6

Recherche du plus court chemin

-NC

DUT Informatique
semestre 2

CC

On peut utiliser des tableaux pour ma- pour le graphe G suivant :


nipuler des listes de sommets
8
1
4
-->C=[1:5] // cr
eation automatique
9
C =
1.
2.
3.
4.
5.
10
1
2

-BY

Commandes scilab utiles pour ce TP

lice

nce

1
-->// remplir un tableau manuellement
-->C=[4 3 1 5 2]
5
3
5
C =
4.
3.
1.
5.
2.
Exemples de resultats que vous devriez obtenir avec la fonction Sommet_Optimal
-->// obtenir une valeur dun tableau
-->C(1)
-->C=[1:5],Dist=[%inf 0 3 %inf 1]
ans =
C =
4.
1.
2.
3.
4.
5.

phi

lipp

e.ro

ux@

uni
v

-ren

nes

1.fr

Dist =
-->// sortir cette valeur du tableau
Inf
0.
3.
Inf
1.
-->C(1)=[]
-->[C,x] = Sommet_Optimal(Dist,C)
C =
x =
3.
1.
5.
2.
2.
Utiliser la fonction Matrice_Poids C =
1.
3.
4.
5.
(faites en TP) pour recuperer le poids des
-->C=[1 3 4],Dist=[%inf 0 3 %inf 1]
arcs dans lalgorithme de Dijkstra :
C =
-->W=Matrice_Poids(G)
1.
3.
4.
W =
Dist =
Inf
0.
3.
Inf
1.
Inf
Inf
10.
8.
Inf
-->[C,x] = Sommet_Optimal(Dist,C)
Inf
Inf
Inf
Inf
Inf
x =
Inf
Inf
Inf
Inf
5.
3.
Inf
9.
1.
Inf
Inf
C =
Inf
1.
Inf
2.
Inf
1.
4.
-->C=[1:5],Dist=%inf+zeros(1,5)
-->[G.head;G.tail] // les arcs
C =
ans =
1.
2.
3.
4.
5.
Dist =
4.
3.
3.
5.
4.
2.
2.
Inf
Inf
Inf
Inf
Inf
1.
1.
4.
3.
5.
4.
5.
-->[C,x] = Sommet_Optimal(Dist,C)
x =
-->G.edge_weight // les poids
0.
ans =
C =
8. 10.
1.
5.
2.
9.
1.
[]