Problème du plus court chemin : Algorithmes et complexité
Transcription
Problème du plus court chemin : Algorithmes et complexité
Problème du plus court chemin : Algorithmes et complexité MSE3211A: Flot et Routage (d’après Ahuja, R.K., T.L. Magnanti and J.B. Orlin, Prentice Hall, 1993, et d’après les notes des cours de L.A. Wolsey et F. Vanderbeck ) Last update: January 10, 2011 Gautier Stauffer, MAB, Bur. A33:358, Email [email protected] PROBLÈME DU PLUS COURT CHEMIN Dans un réseau orienté avec des arcs de longueur connue, trouver un chemin de longueur minimale entre s et tous les autres noeuds. INTÉRÊTS: capture tout l’aspect optimisation du flot dans un réseaux; nombreuses applications directes, et apparait souvent comme sous problème de problèmes plus complexes; relativement facile mais nécessite beaucoup d’ingéniosité pour développer des algo très rapides (problème de grande taille ou sous-problème résolu de nombreuses fois). PROBLÈME DU PLUS COURT CHEMIN HYPOTHÈSES: cij ≤ C entier pour tout (i, j) ∃ un chemin orienté de s vers tout autre noeud i Le graphe est orienté Le réseau ne contient pas de cycle de coût négatif. CAS GENERAL: Détecter la présence d’un cycle de coût négatif (facile). Si ∃, il est difficile de trouver un plus court chemin. Détecter la présence d’un cycle de coût négatif: un problème intéressant en soi PROBLÈME DU PLUS COURT CHEMIN On a déjà vu qu’un chemin de s à i peut s’intereprêter comme un flot. En sommant tous les flots liés aux plus courts chemins de s à i pour tout i 6= s, on obtient un flot satisfaisant les contraintes suivantes : X X n−1 i =s (1) xj i = xi j − −1 i 6= s j∈N j∈N xi j ≥ 0 pour tout (i, j) Vice-versa si on résoud le problème suivant, on peut retrouver les plus courts chemins de s à tous sommet de G par le théorème de décomposition des flots. X min ci j xi j (2) (i,j)∈A X j∈N xi j − X xj i = xi j ≥ 0 j∈N n−1 −1 i =s i 6= s pour tout (i, j) (3) PROBLÈME DUAL minimiser la distance de s à tous les autres noeuds X ci j xi j min (i,j)∈A X xj i − X xi j = xi j ≥ 0 j∈N j∈N 1−n 1 i=s i 6= s (4) pour tout (i, j) ∈ A DUAL (MODÈLE DES FICELLES) di = distance au noeud i (ou de s à i si on pose ds = 0). X (di − ds ) max i6=s dj − di ≤ ci j pour tout (i, j) ∈ A = > Preuve d’optimalité Si x ∗ est réalisable, d ∗ est un vecteur de distances associé à la solution x ∗ , et d ∗ est dual réalisable, alors x ∗ et d ∗ sont optimaux. NB: Les solutions de base du problème primal sont des arbres (orientés de s vers tous les autres sommets). La solution duale associée satisfait dj − di = cij pour tous les arcs de l’arbre. PRINCIPE D’OPTIMALITÉ Propriété: Si le plus court chemin PAB de A à B passe par le noeud C, alors la portion PAC est un plus court chemin de A à C (sans quoi . . . contradiction). Conséquences: Arbre des plus courts chemins de s vers tout autre noeud Proposition (des arcs tendus) Si di représentent les longueurs de plus court chemin de s à i, alors Ps,k est un plus court chemin de s à k ssi dj = di + cij pour tout (i, j) ∈ Ps,k (= conditions de complémentarité de la dualité) PRINCIPE D’OPTIMALITÉ Proposition (des arcs tendus) Si di représentent les longueurs de plus court chemin de s à i, alors Ps,k est un plus court chemin de s à k ssi dj = di + cij pour tout (i, j) ∈ Ps,k (= conditions de complémentarité de la dualité) Preuve: Soit Ps,k ≡ (s = i1 , i2 , . . . , il = k ). Ps,k = plus court chemin = > dj = di + cij ∀(i, j) ∈ Ps,k . En effet, si dik > dik −1 + cik −1 ,ik , alors l’étiquette dik ne représente pas le longueur du plus court chemin jusqu’à ik et peut être amélioré en prenant la longueur de la portion de chemin Ps,ik . Si, au contraire, dik < dik −1 + cik −1 ,ik , alors Ps,ik n’est pas un plus court chemin jusqu’à ik . dj = di + cij ∀(i, j) ∈ Ps,k = > Ps,k = plus court chemin. En effet, longueur de Ps,k = cs,i2 + ci2 ,i3 + . . . + cil−1 ,il = dil − ds = dk |{z} |{z} | {z } di −ds 2 di −di 2 3 di −di l l−1 CONDITIONS D’OPTIMALITÉ Theorem Si les di représentent des longueurs de chemins orientés de s à i, pour tout i, alors di représentent des longueurs de plus courts chemins de s à i ssi dj ≤ di + cij pour tout (i, j) ∈ A (conditions d’optimalité du primal = réalisabilité du dual) PREUVE: conditions nécessaires: Si dj > di + cij , alors le chemin jusqu’à j n’est pas optimale et peut être amélioré en augmentant le chemin jusqu’à i de (i, j). conditions suffisantes: Prenons n’importe que chemin de s à i : Ps,j ≡ (s = i1 , i2 , . . . , ik = j) dj ≤ dik −1 + cik −1 ,ik ≤ dik −2 + cik −2 ,ik + cik −1 ,ik ≤ . . . X ck ,l = > dj ≤ (k ,l)∈Ps,j dj est donc une borne inférieure sur tous les chemins possibles de s à i 2 types d’algorithmes pour le plus court chemin di = approximation de la distance de s à i Corriger les étiquettes de distance jusqu’à ce qu’elles soient toutes optimales (label-correcting) → permet de détecter la présence d’un cycle de coût négatif Fixer (rendre permanente) les étiquettes de distance une à une en mettant aussi les autres à jour (label-setting) → ne permet pas de traiter des réseaux avec un cycle de coût négatif (Pourquoi?) → plus efficace → peut être vu comme un cas particulier du label-correcting Plus court chemin dans un graphe acyclique (Dynamic Programming; label-setting) Dans un graphe acyclique, on peut déterminer les distances des plus courts chemins sans avoir à les corrigées, à condition de le faire dans le bon ordre e.g. en utilisant l’ordre topologique Ordre Topologique Un graphe est acyclique ssi on peut numéroter les noeuds de sorte que, pour chaque arête, le noeud origine ait un numéro plus petit que le noeud destination. 2 3 5 1 4 7 6 Numérotation dans l’Ordre Topologique d’un DAG: calculer le degrés entrant de chaque noeud. Mettre le numéro suivant (initialement 0) au noeud de degrés 0. Mettre a jour les degrés entrant et réitérer. Plus court chemin dans un graphe acyclique (Dynamic Programming; label-setting) ALGO 1 (pulling): complexité O(m) Initialement d1 = 0. Pour chaque noeud j = 2, . . . , n (dans l’ordre topologique), calculer dj = mini: (i,j)∈A {di + ci j } ALGO 2 (reaching): complexité O(m) Initialement d1 = 0 et di = ∞ pour i = 2, . . . , n. Pour chaque noeud i = 1, . . . , n − 1 (dans l’ordre topologique), Pour tout j ∈ A(i), dj = min{dj , di + ci j }. ALGORITHME de DIJKSTRA (Reaching ; label-setting) Trouver des plus courts chemins de s vers tout autre noeud (c-à-d un arbre des plus courts chemins) dans un réseau qui ne contient pas d’arc de coût négatif. L’algorithme maintient une distance di pour chaque noeud i avec un statut permanent (=plus court chemin) ou temporaire (=borne sup sur le plus court chemin) . Initialement, ds = 0 et di = ∞ ∀i 6= s. A chaque itération, on choisit le noeud i dont la distance temporaire est minimale, on en fait une distance permanente et on ajuste les distances temporaires des noeuds qu’on peut atteindre du noeud i (on ajuste également le vecteur de prédécesseur). Initialisation: P = ∅, T = N, predi = −1 ∀i, ds = 0 et di = ∞ ∀i 6= s. Tant que T 6= ∅ faire - i = argmini∈T di , P = P ∪ {i}, T = T \ {i} - ∀j ∈ A(i), si dj > di + ci j (mise à jour) : dj = di + ci j et predj = i ALGORITHME de DIJKSTRA : EXEMPLE 3 2 5 3 3 4 1 1 1 2 6 6 3 6 2 2 5 1 3 1 2 6 3 6 1 1 2 6 6 7 4 2 4 2 2 5 3 3 4 1 1 2 6 2 5 3 4 6 7 4 2 5 1 2 2 2 4 7 2 1 4 2 3 3 6 7 4 4 1 1 2 2 3 5 1 1 7 2 2 4 1 1 1 2 6 6 7 2 4 2 L’algorithme de Dijkstra est CORRECT On montre par récurrence sur la taille de |P| que les sommets dans P sont labélisés avec leur distance à s (celle d’un plus court chemin). Initialement, c’est correct : P = {s}. A l’étape i, la distance temporaire minimum est un plus court chemin car les arcs sont de coûts positifs. P T l i s k Complexité de l’algorithme de Dijkstra (effort requis) Soient n le nombre de noeuds et m le nombre d’arcs. L’étape de sélection du noeud qui devient permanent requiert au plus n opérations. On l’ a fait au plus n fois; donc cela demande un total d’au plus n2 opérations. Le réajustement des distances demande qu’on examine chaque arc au plus une fois; donc ce travail requiert m opérations. Au total, l’algorithme effectue au plus n2 + m opérations ≤ 2 n2 opérations NB: peut être implementé en O(m + n log(n)) avec des monceaux de Fibonnacci ALGORITHME de BELLMAN-FORD programme dynamique; pulling; label-correcting avec liste de tous les noeuds (même si di non modifié) DÉFINITIONS: dik = la longueur du plus court chemin de s à i utilisant k arcs au plus. pik = le prédécesseur du noeud i dans le plus court chemin s à i utilisant k arcs au plus. ALGORITHME: O(n m) Pas 0: Initialiser les distances: ds0 = 0, dj0 = ∞ ∀j 6= s Pas 1: Calculer pour tout j ∈ V djk +1 = mini: (i,j)∈A {dik + ci j } ( (hyp. ci i = 0) pjk +1 = argmini: (i,j)∈A {dik + ci j } Pas 2: Si dik +1 = dik ∀i, STOP (problème résolu). Si k ≥ |N|, STOP (∃ cycle de coût néga.). Sinon k = k + 1 , retourner au pas 1. Exemple pour Ford-Bellman 2 2 3 −2 −3 −2 −1 1 4 2 3 1 djk +1 = min{dik + ci j } (hyp. ci i = 0 ) i d1 d2 d3 d4 k =0 0 ∞ ∞ ∞ k =1 0 2 2 ∞ k =2 0 2 2 3 k =3 0 0 2 3 k =4 -2 0 2 3 Plus court chemin entre toute paire de noeuds Algorithme de Floyd-Warshall Algorithme dynamique : Soit d k (i, j) longueur du plus court chemin de i à j et ne passant que par les noeuds 1, 2, . . . , k − 1. PROPRIÉTÉ: dk +1 (i, j) = min{ d k (i, j) , d k (i, k ) + d k (k , j) } POURQUOI? → solution optimale cherchée : d(i, j) = d n+1 (i, j) Plus court chemin entre toute paire de noeuds Algorithme de Floyd-Warshall Algorithme de Floyd-Warshall d(i, j) = ∞ et pred(i, j) = 0 pour tout (i, j) ∈ N × N d(i, i) = 0 pour tout i ∈ N d(i, j) = cij et pred(i, j) = i pour tout (i, j) ∈ A for k = 1 à n do for tout (i, j) ∈ N × N do if d(i, j) > d(i, k ) + d(k , j) then d(i, j) = d(i, k ) + d(k , j) pred(i, j) = pred(k , j) If d(i, i) < 0, then we have detected a negative cost cycle end if end for end for avec pred(i, j) le prédécesseur de j dans le chemin de i à j de longueur d(i, j) Complexité : O(n3 ) n itérations et pour chacune d’elles n2 itérations pour parcourir les (i, j) ∈ N × N