Académique Documents
Professionnel Documents
Culture Documents
8 L'Algorithme de Dijkstra
8 L'Algorithme de Dijkstra
Représentation
2 L'algorithme
2.1 Principe
Variables
L'ensemble T
T ⊂ S est l'ensemble des sommets déjà traités : ceux pour lesquels on a déjà
déterminé d (x), distance minimale de a à x.
Si x ∈ T , le plus court chemin de a à x est dans T , et il est de longueur
d (x) = dp (x).
L'ensemble R
R est l'ensemble des sommets restant à traiter.
Si x ∈ R, dp (x) est la longueur du plus court chemin de a à x dont x est
le seul sommet dans R.
2.2 Initialisation
1
Variante
2.3 L'algorithme
Terminaison
Complexité
3 Justication rapide
Les invariants de boucle
On choisit x dans R = S\T tel que dp (x) soit minimal ; soit l la longueur
d'un chemin c = (a, ..., y) quelconque (pas nécessairement dans T ) dont
l'extrémité y ∈ R ; soit z le premier sommet dans ce chemin qui n'est pas
dans T ; soit l0 la longueur de la partie de c entre a et z .
On constate que
dp (x) ≤ dp (z) ≤ l0 ≤ l
Ce dp (x) est donc la longueur d'un plus court chemin issu de a, dont l'ex-
trêmité est quelconque dans R.
Il en découle que
∀y ∈ R, dp (x) ≤ d (y)
Deux conséquences :
- d (x) = dp (x)
- ∀y ∈ R, d (x) ≤ d (y) : les d (x) sont obtenus dans l'ordre croissant.
4 Programme
2
import random as rd
nb_sommets, n_Max = 3, 10**6
graphe = [[rd.randint(-3, 5) for j in range(nb_sommets)] for i
in range(nb_sommets)]
R, T = [k for k in range(nb_sommets)], []
dp = [0] + [n_Max for k in range(1,nb_sommets)]
def prochain_sommet(): # choisit le sommet suivant
prochain = -1 # et renvoie -1 à défaut
minimum = n_Max
for sommet in R:
if dp[sommet] < minimum:
prochain = sommet
minimum = dp[sommet]
return prochain
x = prochain_sommet()
while x != -1: # cas où il n'y a plus de sommet
T.append(x) # accessible dans r
R.remove(x)
for y in R:
if graphe[x][y] >= 0 and dp[x] + graphe[x][y] < dp[y]:
dp[y] = dp[x] + graphe[x][y]
x = prochain_sommet()
1
5 Reconstitution du chemin optimal
On dénit un tableau prédécesseur qui donne pour chaque sommet le précé-
dent dans un chemin optimal.
Dans l'algorithme précédent, étape c : si d (x) + w (x, y) < d (y)..., on
note qu'il faut passer par x pour atteindre y ; prédécesseur est mis à jour
par
pred (y) = x
A tout instant, pred (x) permet de reconstituer un chemin de a à x de
longueur dp (x).
Quand x entre dans T , d (x) et pred (x) sont déjà dénitifs.
4
import random as rd
nb_sommets, n_Max = 3, 10**6
graphe = [[rd.randint(-3, 5) for j in range(nb_sommets)] for i
in range(nb_sommets)]
R, T = [k for k in range(nb_sommets)], []
dp = [0] + [n_Max for k in range(1,nb_sommets)]
precedent = nb_sommets*[-1]
def prochain_sommet(): # choisit le sommet suivant
prochain = -1 # et renvoie -1 à défaut
minimum = n_Max
for sommet in R:
if dp[sommet] < minimum:
prochain = sommet
minimum = dp[sommet]
return prochain
x = prochain_sommet()