Problème du flot maximum 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 DE FLOT MAXIMUM Dans un réseau orienté avec des capacités sur les arcs, envoyer autant de flot que possible entre un noeud source s et un noeud puits t, sans excéder les capacités. DONNÉES / Hypothèses Un graphe orienté G = (N, A) avec les noeuds s & t; Des bornes 0 ≤ ui j ≤ U entier, pour chaque arc (i, j). 6 ∃ chemin s − t dont tous les arcs ont une capacité infinie (i, j) ∈ A (j, i) ∈ A (on peut avoir uji = 0) = > Pas d’arcs parallèles FORMULATION 2 v s max v s.a. 7 10 t 1 v P j∈N + (i) 6 10 3 xi j − P j∈N − (i) 0 ≤ xi j ≤ ui j xj i = 8 < v pour i = s 0 pour i 6= s, t : −v pour i = t pour tout (i, j) ∈ A PROBLÈME DUAL: COUPE de capacité MINIMALE On interprete v comme un arc fictif entre t et s et on cherche à maximiser le flot sur cet arc PRIMAL X xi j − j∈N + (i) DUAL max xt s X xj i = 0 xi j ≤ ui j ∀(i, j) 6= (t, s) xi j ≥ 0 ∀i (yi ) j∈N − (i) min X (zi j ) ∀(i, j) 6= (t, s) ui j zi j (i,j)6=(t,s) yi − yj + zi j ≥ 0 ∀(i, j) 6= (t, s) yt − ys = 1 zi j ≥ 0 ∀(i, j) 6= (t, s) Toute (S, T )-coupe peut etre representée dans le dual yi = 1 si i est dans la partition de noeud coté t et zéro si coté s zi j = 1 si l’arc (i, j) est dans la coupe s - t et zéro sinon. FLOT MAXIMUM ET COUPE MINIMALE: dualité Pour toute coupe s-t, c-à-d (S, T ) tel que S ∋ s et T = N \ S ∋ t, le flot au travers de la coupe est égal au flot v entrant en s / sortant de t. + v 0 v = = = P xs j − j∈N − (i) xj s P ( j∈N + (i) xi j − j∈N − (i) xj i ) i∈S\{s} P P i∈S, j∈T xi j − j∈T , i∈S xj i P P + (s) j∈NP Pour toutes coupes s-t, le flot au travers de la coupe est inférieur ou égal à la capacité de la coupe (DUALITÉ FAIBLE): v = ≤ P x i∈S, j∈T P ij − P i∈S, j∈T j∈T , i∈S ui j xj i = CAP(S, T ) Theorem Le flot maximum égale la capacité minimale d’ une coupe s-t (DUALITÉ FORTE): max v = min(S,T ) CAP(S, T ) Applications : PROBLÈMES DE CONNEXITÉ La sécurisation de réseaux de télécom demande de prévoir des chemins disjoints entre paires de noeuds. Deux chemims de s à t sont disjoints en termes d’arcs s’ils n’ont aucun arc en commun. Deux chemims de s à t sont disjoints en termes de noeuds s’ils n’ont aucun noeud en commun en-dehors de s et t. Theorem Le nombre maximum de chemins de s à t disjoints en terme d’arcs égale le nombre minimum d’arcs qu’il faudrait enlever pour disconnecter s de t. Theorem Le nombre maximum de chemins de s à t disjoints en terme de noeuds égale le nombre minimum de noeuds qu’il faudrait enlever pour disconnecter s de t. Deux Types d’Algo pour le MAX FLOW ALGORITHME DES CHEMINS D’AUGMENTATION Trouver un chemin de s à t avec une capacité résiduelle et augmenter le flot le long de ce chemin. A chaque itération le flot vérifie les équations de conservation du flot en chaque noeud. PREFLOW-PUSH Envoie le plus de flot possible vers les noeuds voisins, ré-envoie l’excès de flot d’où il provient. De proche en proche, le flot est ainsi acheminé de s à t, tandis que l’excès retourne en s. A chaque itération le flot ne vérifie pas nécessairement les équations de conservation du flot en chaque noeud; donc, il peut y avoir un excès de flot en certain noeud (d’où le nom de “pré-flot”). ALGORITHME DES CHEMINS D’AUGMENTATION Trouver un chemin de s à t avec une capacité résiduelle et augmenter le flot le long de ce chemin. 1er chemin d’augmentation 2 v s v s t 10 3 3 2ème chemin d’augmentation 3ème chemin d’augmentation 2 2 1 s t 6 6 3 7 7 t 1 6 2 7 10 s 1 t 1 3 ALGORITHME DES CHEMINS D’AUGMENTATION RÉSEAU RÉSIDUEL Pour mieux se représenter le flot courant et les possibilités d’augmentation Pour un flot x donné dans un graphe G = (N, A), le réseau résiduel G(x) est défini par les arcs sur lesquels il reste une capacité positive: rij = uij − xij + xji ∀(i, j) ∈ A L’algorithme de flot-max de FORD-FULKERSON SCHEMATIQUEMENT On recherche un chemin d’augmentation en étiquetant les noeuds qu’ on peut atteindre depuis s. Si on en trouve un, alors on augmente le flot le long de ce chemin d’une quantité égale à la capacité résiduelle du chemin, sinon, on a identifié une coupe dont la capacité est égale à la valeur du flot courant. L’algorithme de flot-max de FORD-FULKERSON x =0 while 1 do for tout i ∈ N do label(i) = 0, pred(i) = 0 end for label(s) = 1, LIST = {s} while LIST 6= ∅ et label(t) == 0 do Soit i ∈ LIST , poser LIST = LIST \ {i} + for tout (i, j) ∈ δG(x ) (i) do if label(j) == 0 then label(j) = 1, pred(j) = i, LIST = LIST ∪ {j} end if end for end while if (label(t) 6= 1), break Remonter les pred(.) à partir de t = > s − t chemin P δ = min{rij | (i, j) ∈ P} xij = xij + δ pour tout (i, j) ∈ P Mettre à jour G(x) end while L’algorithme est correct (donne une solution optimale) L’algorithme termine avec un ensemble S ∋ s de noeuds qui peuvent recevoir un flot depuis s et S 6∋ t. Soit S l’ensemble des noeuds tels que label(i) == 1 à la fin de l’algorithme et T = N \ S. Donc, (S, T ) forme une coupe s-t. Propriétés : La capacité résiduelle de cette coupe est zéro: r (S, T ) = 0 La capacité de cette coupe est égal à v : v = CAP(S, T ) En effet, les noeuds de T n’ont pas pu être étiquetés, parce que les arcs de la coupe (S, T ) ont une capacité résiduelle nulle. ∀(i, j) ∈ (S, T ), ri j = 0 ∈ G(x) ⇔ ∀(i, j) ∈ (S, T ), xi j = ui j ∀(i, j) ∈ (T , S), xi j = 0 Donc v = = P x i∈S, j∈T P ij − P i∈S, j∈T j∈T , i∈S ui j xj i = CAP(S, T ) Résultats Theorem (algo correct) L’algorithme des chemins d’augmentation produit une solution x de valeur v et une coupe (S, T ) de capacité v . Corollary (max-flot/min cut) La quantité maximum de flot de s à t dans un réseaux est égale au mimium de la capacité de toute coupe s-t. Corollary (condition d’optimalité) Le flot x ∗ est maximum ssi G(x ∗ ) ne contient plus de chemin d’augmentation. Corollary (intégralité) Si les capacités sont entières, le problème de flot maximun admet une solution entière. COMPLEXITÉ DE L’ALGORITHME Si les capacités ui j sont entières et bornées par U, alors v ≤ nU: U U v s 1 2 U n Comme on augmente le flot d’au moins 1 à chaque augmentation (les donées sont supposées entières), il y a au plus n U augmentations. Pour chaque augmentation, le travail nécessaire à l’identification d’un chemin d’augmentation (étiquetage) prend O(m) opérations. La complexité totale est donc O(n m U). COMPLEXITÉ DE L’ALGORITHME INCONVÉNIENT DE L’ALGORITHME U v 2 s U 1 U t v U 3 COMMENT AMÉLIORER LA COMPLEXITÉ? Plus court chemin ( ♯ min d’arcs) d’augmentation: O(n2 m) Algorithmes des chemins d’augmentation le long de plus courts chemins Idée : Pousser du flot sur les chemins les plus courts évite de corriger des erreurs en repoussant du flots en sens inverse Soit d(i) la distance minimale (en nombre d’arc de i à t dans G(x): d(t) = 0 d(i) ≤ d(j) + 1 pour tout (i, j) ∈ G(x ), i.e. rij > 0 Les distances minimales se calculent en faisant un parcours “reverse”de G(x) en profondeur d’abord au départ de t. Si d(i) ≥ n, alors il n’existe pas dans G(x) de chemin allant de i à t. Définition : On dit que l’arc (i, j) de G(x) est admissible si rij > 0 et d(i) = d(j) + 1 (arc tendu pour le problème des plus chemin en terme de nombre d’arcs). Algorithme des plus courts chemins augmentants x = 0, Calculer les labels de distances exacts d(i), i = s while d(s) < n do if il existe un arc admissible (i, j) ∈ δ + (i) then /* on ajoute (i,j) au chemin partiel */ pred(j) = i, i = j if i == t then /* on augmente le flot */ Remonter les pred(.) à partir de t → s − t chemin P δ = min{rij | (i, j) ∈ P}, xij = xij + δ pour tout (i, j) ∈ P Mettre à jour G(x), i = s end if else /* on corrige d(i) et on enlève i du chemin partiel */ d(i) = min{d(j) + 1 | (i, j) ∈ δ + (i) et rij > 0} if i 6= s then i = pred(j) end if end if end while Algorithmes des chemins d’augmentation le long de plus courts chemins Complexité : O(n2 m2 ) Chaque augmentation rend un arc inadmissible; quand un arc devient inadmissible, il ne pourra plus être considéré tant qu’une distance n’a pas augmenté; Chaque d(i) peut augmenter au plus n fois, donc au total, il y a au plus n2 accroissements de distance; le nombre de chemin augmentant est borné par le nombre de fois qu’on peut annuler la capacité residuelle d’un arc, soit O(n2 m). chaque itération coute O(m). Algorithmes des chemins d’augmentation le long de plus courts chemins Inconvénient de l’algo des chemins d’aug. le long de plus courts ch.: U v U U 1 1 1 1 1 1 1 1 1 1 v Algorithmes des pré-flots Idée des algorithmes de préflots: pousser tout le flot possible, quitte à avoir un excédant de flot à un noeud i: i est actif si X X xij > 0 xji − e(i) = (j,i)∈δ − (i) (i,i)∈δ + (i) Algorithme générique O(n2 m) x = 0, Calculer les labels de distances exacts d(i), xsj = usj pour tout (s, j) ∈ δ + (s),d(s) = n while il existe un noeud actif i do if il existe un arc admissible (i, j) ∈ δ + (i) then /* on pousse un maximum de flot sur (i,j) */ δ = min{e(i), rij } xij = xij + δ Mettre à jour G(x) else /* on change le label de i */ d(i) = min{d(j) + 1 | (i, j) ∈ δ + (i) et rij > 0} end if end while