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: