• Aucun résultat trouvé

Dijkstra bidirectionnel

Dans son livre [Pohl1969], Pohl introduit une premi`ere am´elioration de l’algorithme de Dijkstra. Rappelons que celui-ci parcourt « aveugl´ement » le graphe en calculant tous les chemins minimaux vers chaque nœud de celui-ci, trouv´es dans l’ordre de distance totale croissante. Dans un graphe mod´elisant un r´eseau routier, il est souvent possible de partir dans toutes les directions `a partir d’une intersection. L’algorithme de Dijkstra parcourt donc une sorte de disque autour du point d’origine.

Or, le nœud de destination ´etant connu, il est possible d’utiliser l’algorithme de Dijkstra en partant de celui-ci et en parcourant les arcs dans le sens inverse. L’id´ee g´en´erale de la recherche bidirectionnelle est d’alterner ces deux applications de l’algo- rithme. Notons Ad, Bd les ensembles NA, NB (voir description de l’algorithme de Dijks-

tra) du calcul direct, et Ar, Br ces ensembles pour le calcul inverse. Lorsque un nœud R

est dans Ad∩ Ar, on sait que P → R et R → Q sont des chemins minimaux, mais pas

n´ecessairement que leur combinaison est minimale. Il faut retenir et mettre `a jour µ, le minimum, pour tout R ∈ Ad∩ Ar, de la somme des distances de ces deux chemins.

La condition d’arrˆet de l’algorithme est alors que les deux nœuds de distance mini- mum des deux ensembles Bd et Br soient `a une distance respectivement de P et de Q

sup´erieure `a µ. Alors, il ne peut exister de chemin plus court que µ reliant P et Q. L’avantage de cette m´ethode est que l’on a explor´e deux disques de rayon µ/2 plutˆot qu’un disque de rayon µ autour de P, r´eduisant l’espace de recherche, comme le montre la figure 10, extraite d’une pr´esentation par Goldberg, Harrelson, Kaplan et Werneck dans le cadre de leurs travaux sur l’algorithme ALT ([Gold2005]).

Figure 10 – `A gauche Dijkstra unidirectionnel, `a droite Dijkstra bidirectionnel (Gold- berg et al.)

3.2

Algorithme A*

Une autre approche d’optimisation de Dijkstra, que l’on peut par ailleurs combiner avec l’approche bidirectionnelle, est d’utiliser une fonction d’estimation pour orienter l’ordre de traitement des nœuds. Cette approche est explor´ee pour la premi`ere fois par P. Hart, N. Nilsson et B. Raphael en 1968 dans [HaNi1968].

L’algorithme A* reprend le principe de l’algorithme de Dijsktra. On dit d’un nœud qu’il est « ferm´e » si on connait le plus court chemin depuis P vers celui-ci (ensemble not´e NA dans la description de l’algorithme de Dijkstra). On dit d’un nœud qu’il est

« ouvert » s’il n’est pas ferm´e et est un successeur direct d’un nœud ferm´e (ensemble NB dans la description de l’algorithme de Dijkstra). « Ouvrir » un nœud signifie donc

transf´erer un nœud dans l’ensemble NB. « Fermer » un nœud signifie donc transf´erer

un nœud dans l’ensemble NA.

Supposons que l’on ait d´efini une fonction d’estimation ˆd(R) qui `a chaque nœud associe une priorit´e d’expansion, correspondant `a une estimation de la distance d’un chemin minimal de P vers Q passant par R. Lors de l’´etape de s´election du nœud `

a fermer, l’algorithme A* pr´ef`erera choisir non pas le nœud `a distance minimale de l’origine P, mais plutˆot le nœud minimisant la fonction d’estimation ˆd(R).

Les ´etapes de l’algorithme sont alors les suivantes : 1. Ouvrir P.

2. Choisir le nœud ouvert R d’estimation ˆd(R) minimale : si c’est Q, terminer l’al- gorithme.

3. Sinon, fermer R.

4. Ouvrir ses successeurs Ri qui ne sont pas ferm´es, ou qui le sont mais dont la

nouvelle estimation ˆd(Ri)est inf´erieure `a celle avec laquelle il a ´et´e ferm´e. Aller `a

la deuxi`eme ´etape.

Le choix de la fonction d’estimation est crucial. En effet, certains choix de fonction ˆ

dne garantissent pas que l’algorithme trouve effectivement le plus court chemin entre P et Q. Un choix classique de fonction d’estimation pour un nœud ouvert R est la somme de la distance calcul´ee de P `a R not´ee dc(P, R) et de la distance `a vol d’oiseau entre R

et Q not´ee dv(R, Q).

ˆ

d(R) = dc(P, R) + dv(R, Q)

De mani`ere g´en´erale, toute fonction d’estimation ˆdcompos´ee d’une part de dc(P, R)

et d’autre part d’une borne inf´erieure sur la distance minimale entre R et Q est ac- ceptable pour l’algorithme A*, au sens qu’elle assure `a celui-ci de trouver une solution optimale. Remarquons que si cette borne inf´erieure est 0, l’algorithme A* est exacte- ment l’algorithme de Dijkstra, et plus cette borne inf´erieure est ´elev´ee, plus l’algorithme est rapide en temps de calcul.

La figure 11 illustre les arcs explor´es par l’algorithme A* dans un r´eseau routier.

Figure 11 – Algorithme A*

3.3

Algorithme ALT

Goldberg et Harrelson introduisent dans [Gold2004] l’algorithme A* with Triangle Inequality and Landmarks (ALT). C’est une variante de l’algorithme A* qui effectue un pr´etraitement pour d´efinir sa fonction d’estimation. L’id´ee repose sur l’´etablissement

d’un petit nombre, seize dans leur article, de Landmarks (lieux de r´ef´erence) dans le graphe et l’utilisation de l’in´egalit´e triangulaire pour d´efinir la fonction d’estimation.

Avant tout calcul de plus court chemin, pour chaque lieu de r´ef´erence L, est calcul´e le plus court chemin vers et partant de chaque nœud R du graphe, que l’on notera respectivement d(R, L) et d(L, R).

On suppose d´emontr´e que ce que l’on appelle distance entre deux nœuds, c’est-`a- dire la somme des poids des arcs du plus court chemin les reliant, respecte l’in´egalit´e triangulaire.

Lors du d´eroulement de l’algorithme A*, pour un nœud R ouvert, les deux in´egalit´es triangulaires d(R, Q) + d(Q, L) ≥ d(R, L) et d(L, R) + d(R, Q) ≥ d(L, Q) sont vraies pour tout landmark L. La fonction b de borne inf´erieure de la distance minimum d(R, Q) est alors d´efinie par la formule suivante, avec L un sous-ensemble de landmarks, bien choisi en fonction de P et Q.

b(R) =max

L∈L{d(L, Q) − d(L, R), d(R, L) − d(Q, L)}

Cette formule diminue consid´erablement l’ensemble de nœuds explor´es, et le calcul de la borne d´epend du nombre de landmarks utilis´es. Il faut ´egalement noter que plus il y a de landmarks, plus l’espace m´emoire stockant les matrices de distances est important.

Figure 12 – ALT bidirectionnel (Goldberg et al.)

La figure 12 montre les arcs et nœuds explor´es par cet algorithme ainsi que la position des landmarks utilis´es pour calculer la borne inf´erieure.

3.4

Arc flags

La m´ethode de marquage des arcs (arc flags, ou edge labels) est une autre technique d’optimisation permettant de r´eduire le temps de calcul en orientant la direction des arcs explor´es par l’algorithme. Elle n´ecessite un pr´etraitement qui associe `a chaque arc a du graphe un sur-ensemble de tous les nœuds pr´esents sur un plus court chemin commen¸cant par a. La premi`ere application de cette id´ee, introduite dans [ScWa1999], consiste pr´e-calculer tous les plus courts chemins en partant de chaque arc a, sans les stocker car cela prendrait trop de m´emoire, et conserver une donn´ee angulaire d´eter- minant M(a). Une autre approche plus efficace, introduite dans [Laut2004], consiste `

a d´ecouper le graphe en r´egions et `a marquer chaque arc par une ou plusieurs de ces r´egions.

Pendant le calcul, lorsqu’un nœud R doit ˆetre ouvert, il est ignor´e s’il n’est pas marqu´e avec la r´egion de la destination Q.

Figure 13 – Arc flags [ScWa1999]

La figure 13 montre, dans un r´eseau de train, `a gauche les arcs explor´es par l’algo- rithme Dijkstra, `a droite les arcs explor´es avec l’optimisation de marquage des arcs.

3.5

Reach et shortcuts

Gutman propose dans [Gutm2004] une approche d’optimisation bas´ee sur le concept de port´ee ou « reach » des nœuds. Intuitivement, Gutman d´efinit la port´ee d’un nœud

comme une repr´esentation de la longueur des plus courts chemins qui passent par ce nœud. Un nœud qui a une grande port´ee est un nœud qui se trouve sur un grand plus court chemin, au sens de la somme des poids qui le composent, ou dans une autre m´etrique bien choisie. Ainsi, les nœuds sur des autoroutes et des routes nationales ont une plus grande port´ee que les nœuds sur des routes secondaires.

Dans l’algorithme de Dijkstra modifi´e, lorsqu’un nœud R doit ˆetre ouvert, il est ignor´e si la port´ee du nœud est `a la fois inf´erieure `a la distance calcul´ee depuis P et `a une borne inf´erieure de la distance jusqu’`a Q du type distance `a vol d’oiseau. En effet, si la port´ee est plus petite, il est impossible qu’un plus court chemin reliant P `a Q passe par R.

Le principal d´efaut de cet algorithme est que le temps de pr´etraitement est ex- trˆemement ´elev´e : il faut calculer tous les plus courts chemins du graphe. Certaines heuristiques peuvent ˆetre effectu´ees pendant le pr´etraitement, pour r´eduire le temps de calcul.

Shortcuts La m´ethode Reach est consid´erablement am´elior´ee par Goldberg, Kaplan et Werneck dans [Gold2006] grˆace `a l’int´egration de shortcuts (arcs de « raccourcis »), repr´esentant un plus court chemin entre deux nœuds reli´es par une succession d’arcs. Cela a pour effet de diminuer les valeurs de port´ee des nœuds interm´ediaires. Ainsi, les auteurs observent une acc´el´eration `a la fois de l’algorithme de pr´etraitement qui g´en`ere les port´ees de chaque nœud, et de l’algorithme de calcul de plus court chemin lui-mˆeme. La figure 14 illustre les arcs explor´es par cet algorithme dans sa variante bidirec- tionnelle, sans les shortcuts `a gauche, et avec shortcuts `a droite.

3.6

Contraction Hierarchies

Le fait que les r´eseaux routiers sont de nature hi´erarchique, compos´es de tron¸cons plus importants que d’autres, et l’id´ee de cr´eer des arcs de « raccourcis » donnent naissance `a des techniques d’acc´el´eration hi´erarchique dont le principe est de trier les tron¸cons par importance et parcourir le sous-graphe des art`eres principales.

Les premiers algorithmes utilisant ces id´ees sont l’« Highway Node Routing » intro- duit dans [ScWa1999], et aussi l’« Highway Hierarchies » d´ecrit dans [Sand2006]. Une version am´elior´ee de ces derniers, que nous avons choisi de pr´esenter ci-dessous, est l’algorithme « Contraction Hierarchies », propos´e par R. Geisberger dans son m´emoire [Geis2008].

L’id´ee est d’ordonner les nœuds du graphe par un ordre total d’« importance », puis de contracter le graphe en ajoutant de mani`ere it´erative des arcs de « raccourcis » autour de tous les nœuds du graphe, que l’on supprime virtuellement par ordre d’importance croissante. Cela cr´e´e autant de couches superpos´ees de graphes qu’il y a de nœuds dans le graphe, avec le graphe inf´erieur ´egal au graphe originel, et les graphes des couches sup´erieures comprenant de moins en moins de nœuds et d’arcs. Lorsque l’on contracte un nœud U du graphe, on pr´eserve les plus courts chemins du graphe de la couche sup´erieure en rempla¸cant tous les chemins de la forme hV, U, Wi par un arc raccourci de mˆeme coˆut (V, W), seulement si hV, U, Wi est le seul plus court chemin entre V et W.

Figure 15 – Contraction du nœud u ([Geis2008])

Pour trouver le plus court chemin entre deux nœuds P et Q, on applique au graphe contract´e un algorithme de Dijkstra bidirectionnel, qui n’´evalue que les arcs menant `a des nœuds d’importance plus ´elev´ee que leur origine. Pour restituer le r´esultat, il suffit de d´e-contracter r´ecursivement les arcs « raccourcis » du r´esultat.

L’importance d’un nœud est d´efinie de mani`ere `a minimiser le nombre de raccourcis (V, W) ajout´es tout en maximisant le nombre de chemins hV, U, Wi qu’ils permettent de court-circuiter. Il est ´egalement important de contracter le graphe de mani`ere « uni- forme ». Ces deux composantes rentrent en compte lors du choix du prochain nœud `a contracter.

Nous ne d´etaillerons pas plus les nombreuses heuristiques et techniques d’optimisa- tions, aussi bien au niveau du calcul de l’importance des nœuds que de l’application des contractions ou des calculs d’itin´eraire.

Les temps de pr´etraitement et les temps de calcul d’itin´eraire sont exceptionnelle- ment rapides. En effet, on trouve dans [BDGM2016] des r´esultats d’exp´erimentations

sur l’Europe enti`ere qui rapportent un temps de pr´etraitement de cinq minutes et un temps de calcul d’itin´eraire moyen inf´erieur `a une milliseconde, contre plus de deux secondes pour l’algorithme de Dijkstra classique.

3.7

Hub Labeling

Parmi les techniques d’optimisation, certaines consistent `a n’utiliser que des plus courts chemins d´ej`a calcul´es lors d’un pr´etraitement, et pas le graphe lui-mˆeme. Parmi celles-ci, nous retiendrons et expliquerons bri`evement les algorithmes de Hub Labeling ([Abra2011]) et de Transit Node Routing ([Bast2006]). Le pr´etraitement peut lui-mˆeme utiliser une des techniques d’optimisation expliqu´ee pr´ec´edemment, par exemple celle des Contraction Hierarchies.

Pour chaque nœud U du graphe, un ensemble de labels L(U), c’est-`a-dire de plus courts chemins vers d’autres nœuds, est calcul´e de fa¸con `a ce que pour tout nœud V, il existe un nœud dans L(U) ∩ L(V) ´egalement inclus dans le plus court chemin de U vers V.

Alors, le plus court chemin entre U et V peut ˆetre directement consult´e en m´emoire en combinant les labels de L(U) avec les labels de L(V), et en s´electionnant le plus court. Nous n’expliquerons pas ici comment choisir les « hubs », c’est-`a-dire les nœuds interm´ediaires entre chaque nœud du graphe.

Cette m´ethode a pour avantage un temps de calcul quasi-instantan´e, inf´erieur `a une microseconde, mais elle souffre d’un temps de pr´etraitement extrˆemement long, accompagn´e d’un espace m´emoire requis pour stocker les labels tr`es ´elev´e.