540 likes | 708 Vues
Le problème du plus court chemin. Énoncé du problème et construction d’un modèle. Partitionnement des sommets par niveaux d’un graphe fortement connexe sans circuit. Théorème d’optimalité de Bellman-Pontryagin. Algorithme de type Futur-Passé. Algorithme de type Passé-Futur (version graphique).
E N D
Le problème du plus court chemin Énoncé du problème et construction d’un modèle Partitionnement des sommets par niveaux d’un graphe fortement connexe sans circuit Théorème d’optimalité de Bellman-Pontryagin Algorithme de type Futur-Passé Algorithme de type Passé-Futur (version graphique) Approche vorace – Algorithme de DIJKSTRA Recherche du pcc entre chaque paire de sommets – Algorithme de FLOYD & WARSHALL
Énoncé du problème : Considérons n villes V1, V2, …, Vn reliées entre elles par un réseau routier. Bob séjournant en V1 désire se rendre à la ville Vn. En examinant le réseau routier reliant ces 2 villes et, parmi toutes les possibilités qui s’offrent à lui, il retient quelques villes intermédiaires V2, V3, …, Vn-1 par lesquelles il pourrait passer. Bob a un budget limité et désire se rendre de V1 à Vn par le plus court chemin sans nécessairement passer par toutes les villes intermédiaires. Par quelles villes, Bob doit-il passer pour minimiser la distance totale parcourue ? Le problème du plus court chemin
Construction d’un modèle : Le réseau de transport de Bob peut se traduire facilement sous la forme d’un graphe : Vn-2 V2 V4 Vn V1 V3 Vn-1 où les sommets représentent les villes et où les arcs représentent les routes possibles pour aller d’une ville à l’autre. Note : En l’absence d’arcs entre 2 villes, cela signifie qu’il n’y a pas de route directe entre celles-ci. Le problème du plus court chemin
Matrice associée au graphe : Nous définissons un graphe orienté G = (S, U) où S = {s1, s2, …, sn}, l’ensemble des sommets du graphe, U = {(x, y) S x S | il existe une route directe allant de x à y}, l’ensemble des arcs du graphe. Une matrice A = (aij), i = 1, 2, …, n associée au graphe G j = 1, 2, …, n est définie comme suit : 1 si (si, sj) U aij = 0 autrement. Le problème du plus court chemin
Exemple : 2 3 1 4 6 5 1 2 3 4 5 6 • 0 1 1 0 0 0 • 0 0 1 1 0 0 • 0 0 0 1 1 0 • 1 0 0 0 1 0 • 1 1 0 0 0 1 • 0 0 0 0 0 0 Matrice associée à G : Le problème du plus court chemin
Matrice des distances : Soit D = (dij) la matrice des distances entre chacune des villes où dij représente la distance de la route reliant directement la ville Vi à la ville Vj. On suppose par convention que : dij = + si i j et (si, sj) U 0 si i = j. Note : Cette matrice des distances peut représenter une mesure de temps, de coût, de probabilité ou autre chose. Le problème du plus court chemin
Exemple d’un graphe arc-valué : 3 B C 4 9 4 2 8 6 A E D 3 7 7 6 13 G F 2 H Le problème du plus court chemin
Exemple d’un graphe arc-valué : Soit le réseau routier suivant et le graphe correspondant, Le problème du plus court chemin
Formulation du problème : En ajoutant un arc fictif (sn, s1), on obtient : dij zij Min i = 1, 2, …, n j = 1, 2, …, n tel que (si, sj) U = 0 i. zij - zki sujet à j = 1, 2, …, n tel que (si, sj) U k = 1, 2, …, n tel que (sk, si) U zn1 = 1 i = 1, 2, …, n; j = 1, 2, …, n tel que (si, sj) U. zij 0 Cela équivaut à envoyer une unité de flot de 1 à n au moindre coût. C’est donc un cas particulier du problème de flot à coût minimal. Le problème du plus court chemin
Remarque : Nous sommes amenés à résoudre 3 types de problèmes impliquant des plus courts chemins : • un pcc entre un sommet i et un sommet j; • un pcc entre un sommet i et tous les autres sommets du graphe; • un pcc entre chaque paire de sommets dans un graphe. Les méthodes proposées pour résoudre le premier problème sont appropriées pour les 2 autres problèmes également. On peut utiliser la méthode du simplexe en programmation linéaire pour résoudre ce problème mais il existe des méthodes beaucoup plus efficaces. Le problème du plus court chemin
Rappel de quelques définitions sur la structure de graphe : Chemin : Une suite d’arcs u1, u2, …, uk telle que l’extrémité terminale de chaque arc coïncide avec l’extrémité initiale de l’arc suivant dans la suite. Chemin de longueur k : Un chemin comprenant k arcs. Exemple : Chemin de longueur 5 du graphe G (1,2) – (2, 3) – (3, 5) – (5, 2) – (2, 4). Circuit : Un chemin de longueur finie dont le sommet origine est identique au sommet extrémité du chemin. Exemple : Circuit de longueur 4 du graphe G (2, 3) – (3, 5) – (5, 1) – (1, 2). Le problème du plus court chemin
Si un graphe orienté contient un circuit dont la longueur est < 0 (un cycle négatif), il se peut que le plus court chemin n’existe pas. -5 1 1 6 1 5 4 2 -1 3 2 3 On exclut d’emblée ce type de graphe de la discussion subséquente. Le problème du plus court chemin
Graphe non orienté : U désigne plutôt un ensemble d’arêtes i.e. un ensemble de paires non ordonnées de sommets de S. Exemple : (3, 2) – (3, 5) – (1,5) – (2, 1) sont des arêtes du graphe. Chaîne d’un graphe non orienté : Une suite d’arêtes distinctes u1, u2, …, uk avec la propriété qu’il existe k + 1 sommets x1, x2, …, xk+1 tels que ui (xi, xi+1), 1 i k. Exemple : (3, 2) – (3, 5) – (1,5) – (2, 1) est une chaîne. Cycle : Une chaîne où x1 = xk+1. Graphe connexe : Graphe non orienté dans lequel il est toujours possible de relier entre eux 2 sommets quelconques par une chaîne. Le problème du plus court chemin
Résolution du plus court chemin sur un graphe non orienté : Cela se ramène au même problème que celui posé sur un graphe orienté, à condition que les dij 0 pour tout (i,j). Il s’agit de remplacer chaque arête (i, j) dans le graphe par 2 arcs (i, j) et (j, i) portant tout deux la même mesure dij = dji. Si l’un des dij était < 0, ceci créerait des cycles négatifs. Graphe fortement connexe : Graphe orienté où il existe tjrs un chemin allant de x à y x, y S. Nous allons nous intéresser dans ce qui suit aux graphes fortement connexes sans circuit. Le problème du plus court chemin
Relation d’ordre strict R Soit un graphe orienté G fortement connexe et sans circuit, soit x, y S et x y, considérons la relation suivante : (R) x y il existe un chemin de longueur non nulle de x vers y. Note : R est dite aussi relation d’antériorité : si x y , on dira que x est un ancêtre de y et que y est un descendant de x. R est transitive : x y et y z x z. R est antisymétrique : x y non (y x). Le problème du plus court chemin
Partitionnement des sommets par niveaux d’un graphe fortement connexe sans circuit Tous les éléments d’un même niveau n’ont pas d’ancêtres dans le niveau qui suit, ni de descendants dans le niveau qui précède. Les éléments du premier niveau n’ont pas d’ancêtres et ceux du dernier niveau n’ont pas de descendants. L’ordre des sommets d’un même niveau est indifférent i.e. les sommets d’un même niveau ne sont pas reliés entre eux par des arcs. Une décomposition par niveaux existe toujours mais elle n’est pas nécessairement unique. Le problème du plus court chemin
Illustration de la méthode de partitionnement des sommets par niveaux d’un graphe fortement connexe sans circuit Exemple : 1 8 5 4 2 7 6 3 Ai la iième ligne de la matrice associée au graphe. Le problème du plus court chemin
V0 – A5 = V1 – A2 = V2 – A6 = V3 – A1 – A3 = V4 – A7 = V5 – A4 = Le problème du plus court chemin
Procédé : Déterminons d’abord les sommets qui n’ont pas d’ancêtres : V0 = A1 + A2 + … + A8. On constate que le sommet 5 n’admet aucun arc du type (- , 5). Le sommet 5 forme donc le niveau I. Pour déterminez le niveau II, il faut chercher tous les sommets dont le seul ancêtre est 5 : V1 = V0 – A5. Le sommet 2 n’a pas d’autres ancêtres que le sommet 5. Le sommet 2 forme donc le niveau II. Comme on peut le constater, pour obtenir les sommets d’un niveau, il suffit d’enlever au vecteur précédent les lignes associées aux sommets du niveau précédent. Le problème du plus court chemin
Le graphe peut alors se mettre sous la forme : Note : Le sommet 1 peut être indifféremment placé dans l’un quelconque des niveaux IV, V ou VI. En supposant les sommets 1 et 3 au niveau IV, on peut choisir comme ordonnancement : 5 – 2 – 6 – 1 – 3 – 7 – 4 – 8 ou encore 5 – 2 – 6 – 3 – 1 – 7 – 4 – 8.
Note : Le PCC de V1 à V8 se résume au graphe : Solution triviale. 8 1 Le PCC de V2 à V8 se résume au graphe suivant (il faut négliger V5 et les arcs qui en sont issus) : 1 8 2 6 7 4 3 Le problème du plus court chemin
Théorème d’optimalité de Bellman-Pontryagin : Il s’énonce sous l’une des 2 formes suivantes : Passé - Futur Tout chemin reliant la ville V1 à la ville Vn est optimal si tout chemin partiel de V1 à Vk issu de ce chemin est lui-même optimal de V1 à Vk et ce pour tous les indices k de ce chemin. Futur - Passé Tout chemin reliant la ville V1 à la ville Vn est optimal si tout chemin partiel de Vk à Vn issu de ce chemin est lui-même optimal de Vk à Vn et ce pour tous les indices k de ce chemin. Le problème du plus court chemin
Reprenons l’exemple présenté antérieurement : 3 B C 4 9 4 2 8 6 A E D 3 7 7 6 13 G F 2 H En énumérant tous les chemins possibles de A à H, on en déduit que la distance minimale est 17 et que le PCC est AEFH. Note : On peut vérifier que le théorème est satisfait pour E et F. Le problème du plus court chemin
Présentation d’un algorithme de type Futur-Passé : Renumérotons les villes selon un ordonnancement obtenu à l’aide de l’approche précédente. A B G E C D F H . . . . . . . . . . . . . . . . . . . . . . . . 1 2 3 4 5 6 7 8 3 4 4 5 2 2 7 4 3 9 7 6 3 6 13 8 1 6 7 2 8 Le problème du plus court chemin
Il s’agit d’énumérer les chemins de longueur au plus k = 1, puis au plus k = 2, et ainsi de suite, dont l’extrémité terminale est la ville n. Posons vk(i) longueur du PCC de i à n ayant au plus k arcs, i = 1, 2, …, n. vk(n) = 0, k = 1, 2, …, n. Remarque : Posons pk(i) indicateur servant à retracer le PCC de i à n ayant au plus k arcs, i = 1, 2, …, n. v1(i) = din, i = 1, 2, …, n - 1. k = 1 p1(i) = i, i = 1, 2, …, n. k > 1 vk(i) = MIN (dij + vk-1(j) ) i = 1, 2, …, n - 1. 1jn pk(i) = la valeur j pour laquelle MIN est atteint. Le problème du plus court chemin
À quel moment s’arrête-t-on ? Étant donné qu’il est toujours possible d’ordonnancer un graphe connexe et sans circuit et de classer ses sommets par niveaux, s’il y a N niveaux, le sommet 1 appartient au premier niveau, le sommet n au dernier niveau, les chemins reliant le sommet 1 au sommet n sont au plus de longueur N – 1. En pratique, on arrête à l’itération k où vk(i) = vk-1(i) i. Comment retracer le chemin optimal de i à n ? (i, pk-1(i), pk-2(pk-1(i)), …, p1(p2(p3(… pk-1(i))), n) en éliminant les valeurs identiques. Le problème du plus court chemin
Considérons l’exemple précédent : i 1 2 3 4 5 6 7 8 v1(i) 6 2 0 p1(i) 1 2 3 4 5 6 7 8 v2(i) 15 9 8 6 2 0 p2(i) 1 2 7 7 7 6 7 8 v3(i) 17 11 15 9 8 6 2 0 p3(i) 4 5 7 7 7 6 7 8 v4(i) 17 11 15 9 8 6 2 0 p4(i) 4 5 7 7 7 6 7 8 L’algorithme s’arrête car v4(i) = v3(i) i. Exemple : Chemin optimal du sommet 1 au sommet 8 : (1 – 4 – 7 – 8) avec une longueur = 17.
Énoncé de l’algorithme de Bellman – Kalaba (Type Futur – Passé) (0) Renuméroter les sommets suivant l’ordonnancement précédent. Réécrire la matrice des distances. (1) Poser v1(i) = din, i = 1, 2, …, n, p1(i) = i, i = 1, 2, …, n. Poser k = 2. vk(i) = MIN (dij + vk-1(j) ) i = 1, 2, …, n - 1. 1jn (2) Faire pk(i) = la valeur j pour laquelle MIN est atteint. Poser vk(n) = 0, pk(n) = n. (3) Si vk(i) = vk-1(i) i alors aller à (4) sinon faire k = k + 1 aller à (2). (4) vk-1(1) représente la valeur optimale du problème posé. Le problème du plus court chemin
Il reste à retracer le chemin optimal. (5) Poser t = k – 1 et x(t) = 1. (6) Faire x(t – 1) = pt(x(t)). (7) Si t > 1 alors faire t = t – 1, aller à (6) sinon le chemin optimal est le suivant : (1, x(k-2), x(k-3), …, x(2), x(1), n) où on élimine tous les sommets qui se répètent sauf un. Il reste à renuméroter les indices comme ils étaient initialement. FIN Le problème du plus court chemin
Remarque : Il n’est pas nécessaire d’ordonnancer les sommets du graphe avant d’appliquer l’algorithme, mais cela est préférable, car il nous permet d’avoir des sous la diagonale de la matrice des distances. Cela permet de simplifier l’algorithme précédent ! • 1 2 3 4 5 6 7 8 • 0 9 3 8 • 0 4 3 • 0 7 13 • 0 2 7 • 0 4 6 • 0 6 • 0 2 • 0 Le problème du plus court chemin
Énoncé de l’algorithme de type Passé – Futur (0) Renuméroter les sommets suivant l’ordonnancement précédent. Réécrire la matrice des distances. (1) Poser u1(j) = d1j, j = 1, 2, …, n, p1(j) = j, j = 1, 2, …, n. Poser k = 2. (2) Soit uk(j) longueur du PCC de 1 à j ayant au plus k arcs, j = 1, 2, …, n. uk(j) = MIN (dij + uk-1(i) ) j = 2, 3, …, n. 1in faire pk(j) = la valeur i pour laquelle MIN est atteint. Poser uk(1) = 0, pk(1) = 1. (3) Si uk(j) = uk-1(j) j alors aller à (4) sinon faire k = k + 1, aller à (2). Le problème du plus court chemin
(4) uk-1(n) représente la valeur optimale du problème posé. Il reste à retracer le chemin optimal. (5) Poser t = k – 1 et x(t) = n. (6) Faire x(t – 1) = pt(x(t)). (7) Si t > 1 alors faire t = t – 1, aller à (6) sinon le chemin optimal est le suivant : (1, x(1), x(2), …, x(k - 2), n) où on élimine tous les sommets qui se répètent sauf un. Il reste à renuméroter les indices comme ils étaient initialement. FIN Le problème du plus court chemin
Critère d’arrêt de cet algorithme : u1(j) u2(j) u3(j) u4(j) … uk(j) longueur du pcc entre 1 et j j. Si le graphe contient au moins un chemin entre 1 et j et il n’y a pas de cycles négatifs, alors un pcc contiendrait au plus n-1 arcs ce qui implique que un-1(j) longueur du pcc entre 1 et j j. En fait, l’algorithme arrête lorsque uk(j) = uk-1(j) j. Le problème du plus court chemin
Considérons l’exemple précédent : i 1 2 3 4 5 6 7 8 u1(j) 0 9 3 8 p1(j) 1 2 3 4 5 6 7 8 u2(j) 0 9 3 8 10 15 p2(j) 1 2 3 4 4 6 4 8 u3(j) 0 9 3 8 10 14 15 17 p3(j) 1 2 3 4 4 5 4 7 u4(j) 0 9 3 8 10 14 15 17 p4(j) 1 2 3 4 4 5 4 7 L’algorithme s’arrête car u4(j) = u3(j) j. Exemple : Chemin optimal du sommet 1 au sommet 8 : (1 – 4 – 7 – 8) avec une longueur = 17.
Version « graphique » de l’algorithme de type Passé – Futur Il est possible d’appliquer directement ces algorithmes sur le graphe lui-même au moyen d’un marquage des sommets. À chaque sommet j est associé une double case : Indicateur servant à retracer le PCC de 1 à j. Valeur minimale des chemins allant du sommet 1 à ce sommet j. Reprenons le même exemple. Le problème du plus court chemin
Pour déterminer les valeurs minimales associées aux sommets, il est préférable de procéder à leurs évaluations selon un ordonnancement connu : 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8. k = 1 3 8 4 5 9 2 4 4 5 2 2 7 4 3 9 7 3 3 6 3 1 0 6 6 13 8 1 6 7 7 2 8 8 Le problème du plus court chemin
k = 2 3 8 4 4 10 9 2 4 4 5 2 2 7 4 3 9 7 3 3 6 3 1 0 14 5 6 13 8 1 6 7 15 4 2 8 17 7 Idem. k = 3 Le problème du plus court chemin
Reprenons le même exemple sans ordonnancement des sommets. L’ordre A - B - C - D - E - F - G – H sera respecté. k = 1 3 9 B C B C 4 9 4 2 D 8 6 8 E A E D A 0 3 7 7 6 13 G F 2 3 G F H H Le problème du plus court chemin
k = 2 3 9 B E 10 B C 4 9 4 2 C 14 8 6 8 E A E D A 0 3 7 7 6 13 G F 2 3 G E 15 H F 17 Idem. k = 3 Note : Lorsqu’il n’existe pas de cycles de longueur négative, cette méthode convient. Le problème du plus court chemin
Arborescence des plus courts chemins avec comme origine A À partir des résultats obtenus, on peut construire facilement une telle arborescence. 3 9 B E 10 B C 4 9 4 2 C 14 8 6 8 E A E D A 0 3 7 7 6 13 G F 2 3 G E 15 H F 17 Le problème du plus court chemin
Approche vorace – Algorithme de DIJKSTRA (dij > 0) Posons LC(s) longueur du pcc entre 1 et s dont les sommets intermédiaires font partie de C, s S. pC(s) le sommet qui précède s dans ce pcc. (1) Poser C = {1}. LC(i) = d1i, i = 2, …, n 0, i = 1. Poser pC(s) = 1 s 1 S. Trouver k S – C tel que MIN LC(j) est atteint. j S – C (2) Poser C = C {k}. Si C <> S alors poser LC(j) = MIN{LC(j) , LC(k) + dkj} j S–C si MIN est atteint à LC(k) + dkj, pC(j) = k j S–C (3) Retournez à l’étape 2.
Théorème : À chaque itération de l’algorithme, lorsque k est ajouté à C, LC(k) est la longueur du pcc de 1 à k, sans restriction. Exemple : 2 7 2 2 5 5 5 3 1 4 7 1 4 1 3 7 4 5 6 Note : L’algorithme fournit le pcc de 1 à tout autre sommet. Si l’on cherche le pcc entre 1 et un sommet s, alors on peut arrêter l’algorithme au moment où s entre dans C.
C 7 5 6 4 2 3 1 0 2 5 4 LC {1} pC 1 1 1 1 1 1 0 2 4 9 4 LC {1, 2} pC 1 2 2 1 1 1 0 2 4 9 4 7 LC {1, 2, 3} pC 1 2 2 1 3 1 0 2 4 9 4 7 LC {1, 2, 3, 5} pC 1 2 2 1 3 1 0 2 4 8 4 7 14 LC {1, 2, 3, 5, 6} pC 1 2 6 1 3 6 Le problème du plus court chemin
0 2 4 8 4 7 13 LC {1, 2, 3, 5, 6, 4} pC 1 2 6 1 3 4 pcc entre 1 et 7 : 7, pC(7), pC(4), pC(6), …, 1 ou encore 7, 4, 6, 3, 2, 1. Le tracé du pcc est obtenu en procédant à reculons. Note : S’il n’y a pas de chemin entre 1 et j dans le graphe, alors LC(j) = à la fin de l’algorithme. Le problème du plus court chemin
Recherche du pcc entre chaque paire de sommets L’algorithme de FLOYD – WARSHALL admet des arcs de longueur négative mais pas de cycles négatifs. On pourrait appliquer l’un des algorithmes précédents n fois pour obtenir ce résultat mais l’algorithme suivant est plus efficace. Posons Lij(m) = longueur d’un pcc entre i et j, sujet à la condition que le chemin ne passe pas par les sommets m, m+1, …, n (i et j exceptés), nous avons l’équation de récurrence suivante : Lij(m+1) = min {Lij(m), Lim(m) + Lmj(m)}. Le pcc ne passe pas par m. Le pcc passe par m. Le problème du plus court chemin
Énoncé de l’algorithme FLOYD - WARSHALL (1) Poser Lij(1) = dij, i,j = 1, 2, …, n. pij(1) = j, j = 1, 2, …, n. Poser k = 1. i,j = 1, 2, …, n, (2) Faire Lij(k+1) = min {Lij(k), Lik(k) + Lkj(k)}, Si le pcc passe par k alors pij(k + 1) = k sinon pij(k + 1) = pij(k) (3) Si k == n alors aller à (4) sinon faire k = k + 1, aller à (2). Le problème du plus court chemin
Il reste à retracer le chemin optimal entre i et j. (4) Poser x(1) = j, x(2) = pij(n+1) et t = 3. (5) Faire x(t) = pix(t-1)(n+1). (6) Si t <> n - 1 alors faire t = t + 1, aller à (5) sinon le chemin optimal est le suivant : (i = x(t+1), x(t), …, x(1) = j). FIN Le problème du plus court chemin
2 Exemple : 4 3 4 4 1 1 1 -2 3 L(1) L(2) L(3) L(4) • 0 4 • 0 1 4 -2 0 1 3 0 • 0 4 • 0 1 4 -2 2 0 1 3 0 • 0 4 58 • 0 1 4 -2 2 0 1 3 4 0 0 4 5 6 -1 0 1 2 -2 2 0 1 2 3 4 0 p(1) p(2) p(3) p(4) 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 13 4 1 2 3 4 1 2 22 1 2 3 4 1 1 3 4 1 2 2 4 1 2 2 3 3 2 3 3 1 1 3 2 3 2 2 4
L(5) 0 4 5 6 -1 0 1 2 -2 2 0 1 2 3 4 0 p(5) 1 2 2 3 3 2 3 3 1 1 3 2 3 2 2 4 Chemin optimal entre 1 et 4 : x 1 3 2 4 Le problème du plus court chemin
Conclusion Ce sujet a été traité dans la plupart des livres portant sur la recherche opérationnelle. Toutefois, je vous réfère au livre suivant : « Ronald L. Rardin, Optimization in Operations Research. Prentice Hall, 1998, 919p. » Le problème du plus court chemin