Les plus courts chemins

Transcription

Les plus courts chemins
Les plus
courts
chemins
Les plus courts chemins
Les plus
courts
chemins
Trouver le plus court chemin
Une application moderne de la théorie des graphes: le navigateur
GPS.
Comment trouver rapidement le chemin le plus court?
Les plus
courts
chemins
Plus court chemin dans un graphe
Les carrefours sont les sommets, les routes sont les arêtes.
Comment encoder les distances?
Une fonction de poids sur un graphe (V , E, ψ) est une fonction
E → R. Un graphe pondéré est un graphe muni d’une fonction de
poids.
Ici le poids est typiquement une longueur (toujours ≥ 0).
Le poids ou la longueur d’un parcours est la somme des poids des
arêtes qui le compose.
La distance d(u, v ) est la longueur du plus court chemin de u vers
v.
Ceci généralise la notion de longueur = nombre d’arêtes d’un
parcours.
Les plus
courts
chemins
Plus court chemin et plus court parcours
Pourquoi le plus court chemin, et non le plus court parcours?
Parce que c’est la même chose!
Théorème: Pour un graphe avec une fonction de poids ≥ 0, si le
plus court parcours entre u et v est de longueur d, alors le plus
court chemin entre u et v est aussi de longueur d.
Les plus
courts
chemins
Le problème du plus court chemin
Le problème du plus court chemin: étant donnés un graphe et
deux sommets u et v , trouver le chemin le plus court de u vers v .
Solution évidente: essayer tous les chemins! Temps de calcul
énorme. On veut un algorithme plus efficace.
Les plus
courts
chemins
Dijkstra
Edsger Wybe Dijkstra (1930-2002) trouve une solution efficace en
1959.
Célèbre pour ses aphorismes:
“L’informatique n’est pas plus la
science des ordinateurs que
l’astronomie n’est celle des
télescopes.”
Les plus
courts
chemins
Un exemple
Idée: on va déterminer, de proche en proche, les distances à
partir de u0 .
Les plus
courts
chemins
Algorithme de Dijkstra
Etant donné un graphe avec fonction de poids w ≥ 0, on veut
trouver la longueur du plus court chemin entre u0 et t. Par
convention, w(ab) = ∞ si les sommets a et b ne sont pas
adjacents.
On peut supposer le graphe simple, c’est-à-dire sans boucle et
avec au plus une arête entre deux sommets.
Algorithme de Dijkstra:
I
I
Initialisation: `(u0 ) = 0, `(v ) = ∞ pour v 6= u0 , S := u0 ,
u 0 = u0 .
Tant qu’il reste des sommets hors de S:
I
I
I
I
pour chaque v ∈
/ S, `(v ) = min(`(v ), `(u 0 ) + w(u 0 v ))
% MISE A JOUR DE ` ;
trouver vmin ∈
/ S tel que `(vmin ) ≤ `(v ) pour tout v ∈
/ S;
u 0 := vmin ;
S := S ∪ {u 0 }.
Les plus
courts
chemins
Ca marche!
Théorème: Après chaque MISE A JOUR DE ` dans l’algorithme,
les deux propriétés suivantes sont vérifiées:
I
pour v ∈ S, `(v ) = d(u0 , v ) et le chemin le plus court de u0 à
v reste dans S;
I
pour v ∈
/ S, `(v ) ≥ d(u0 , v ), et `(v ) est la longueur du plus
court chemin de u0 vers v dont tous les noeuds internes sont
dans S.
Ces deux propriétés maintenues à chaque passage de boucle
sont appelées des invariants de boucle.
Corollaire: L’algorithme de Dijkstra est correct.
Si on n’est intéressé que par le plus court chemin de u0 vers un
certain noeud v0 , on peut arrêter l’algorithme quand v0 ∈ S.
On peut modifier l’algorithme pour trouver les plus courts
chemins, et pas seulement leur longueur.
Les plus
courts
chemins
L’algorithme de Dijkstra est quadratique
Théorème: L’algorithme de Dijkstra sur un graphe se termine en
un temps de l’ordre n2 .
Rappel: Une fonction f (n) est de l’ordre de g(n), noté
f (n) = O(g(n)), s’il existe un réel c > 0 et un entier n0 tels que
|f (n)| ≤ c|g(n)| pour tout n > n0 .
Compter le temps “à une constante près” permet de s’affranchir
des détails de l’implémentation de l’algorithme (du langage, de
l’ordinateur, etc.).
Un temps de n2 , est-ce rapide ou lent?
Les plus
courts
chemins
L’algorithme de Dijkstra est efficace
Un algorithme qui prend comme donnée un graphe à n noeuds et
m arêtes est dit efficace s’il s’arrête en un temps polynomial,
c’est-à-dire un temps de l’ordre de P(m, n), pour un certain
polynôme P.
L’algorithme de Dijsktra est donc efficace.
Les plus
courts
chemins
Pourquoi les algorithmes efficaces sont-ils
efficaces?
Pourquoi les temps de calcul polynomiaux sont-ils considérés
comme efficace, et pas les temps de calcul exponentiels, par
exemple?
Supposons qu’un programme, sur un graphe à n noeuds,
s’exécute en un temps de T (n)µs.
T(n)
n
n2
n3
103 n3
2n
3n
n = 10
10 µs
100 µ s
1 ms
1s
1 ms
60 ms
n = 20
20 µs
400 µ s
8 ms
8s
1s
1h
n = 30
30 µs
900 µ s
27 ms
27 s
18 min
6 ans
n = 40
40 µs
1,6 ms
64 ms
64 s
13 jours
3900 siècles
n = 50
50 µs
2,5 ms
125 ms
125 s
36 ans
2.108 siècles
Les plus
courts
chemins
Applications
Quelques applications:
I
I
I
routage de données sur internet;
navigation GPS (pour distance, temps, coût, etc. minimum);
comment faire parvenir un message secret à Obama le plus
vite possible?
Les plus
courts
chemins
Recherche moderne
Algoritmes adaptifs ou pour des graphes évolutifs
Les plus
courts
chemins
Graphes dirigés
Comment tenir compte des sens uniques?
Un graphe dirigé est un triplet (V , E, ψ), où
I
V est un ensemble dont les éléments sont appelés sommets
ou noeuds;
I
E est un ensemble dont les éléments sont appelés arêtes;
I
ψ est une fonction, dite fonction d’incidence, qui associe à
chaque arête un couple de sommets.
Les définitions de parcours, chemins, poids se généralisent
aisément. L’algorithme de Dijkstra fonctionne aussi sur les
graphes dirigés.
Les plus
courts
chemins
Un exemple de graphe dirigé pondéré
Trouver les distances à partir de a:

Documents pareils