a flot (raf) : g = (s, a)
Transcription
a flot (raf) : g = (s, a)
Flot maximum Ahmed Bouajjani ENS Cachan, Magistère STIC, 2004-05 Problème du flot maximum • Réseau à flot (RAF) : G = (S, A) un graphe orienté + c : A → R≥0 (capacité des arcs). (On étend c à S 2 : c(u, v) = 0 pour (u, v) 6∈ A) • Il existe 2 sommets particuliers, une source s et un puit t, tels que ∀u ∈ S − {s, t}. s ; u ; t Problème du flot maximum • Réseau à flot (RAF) : G = (S, A) un graphe orienté + c : A → R≥0 (capacité des arcs). (On étend c à S 2 : c(u, v) = 0 pour (u, v) 6∈ A) • Il existe 2 sommets particuliers, une source s et un puit t, tels que ∀u ∈ S − {s, t}. s ; u ; t • Un flot est une fonction f : S 2 → R satisfaisant les propriétés : 1. ∀u, v. f (u, v) ≤ c(u, v), 2. ∀u, v. f (u, v) = −f (v, u), P 3. ∀u ∈ S − {s, t}, nous avons v∈S f (u, v) = 0 P • La valeur du flot f est définie par |f | = v∈S f (s, v) Problème du flot maximum • Réseau à flot (RAF) : G = (S, A) un graphe orienté + c : A → R≥0 (capacité des arcs). (On étend c à S 2 : c(u, v) = 0 pour (u, v) 6∈ A) • Il existe 2 sommets particuliers, une source s et un puit t, tels que ∀u ∈ S − {s, t}. s ; u ; t • Un flot est une fonction f : S 2 → R satisfaisant les propriétés : 1. ∀u, v. f (u, v) ≤ c(u, v), 2. ∀u, v. f (u, v) = −f (v, u), P 3. ∀u ∈ S − {s, t}, nous avons v∈S f (u, v) = 0 P • La valeur du flot f est définie par |f | = v∈S f (s, v) • Problème : Etant donnés G, c, s, et t, trouver un flot de valeur maximum. Propriétés Pour X, Y ⊆ S, on pose f (X, Y ) = X X f (x, y) x∈X y∈Y Lemme 1 : Etant donné RAF G = (S, A) et un flot f , on a 1. ∀X ⊆ S. f (X, X) = 0, 2. ∀X, Y ⊆ S. f (X, Y ) = −f (Y, X), 3. ∀X, Y, Z ⊆ S. X ∩ Y = ∅, nous avons f (X ∪ Y, Z) = f (X, Z) + f (Y, Z) f (Z, X ∪ Y ) = f (Z, X) + f (Z, Y ) Lemme 2 : Etant donné un RAF G = (S, A) et un flot f , on a |f | = f (S, t) Propriétés (preuve du Lemme 2) Lemme 2 : Etant donné un RAF G = (S, A) et un flot f , on a |f | = f (S, t). |f | = = = = = = f (s, S) f (S, S) − f (S − {s}, S) −f (S − {s}, S) f (S, S − {s}) f (S, t) + f (S, S − {s} − {t}) f (S, t) Capacité résiduelle, graphe résiduel • G = (S, A), c une capacité, et f un flot, • Capacité résiduelle d’un arc : cf (u, v) = c(u, v) − f (u, v) • Graphe résiduel : Gf = (S, Af ) avec Af = {(u, v) ∈ S 2 : cf (u, v) > 0} • Les arcs de Af sont soit des arcs de A, soit leurs inverses • Si f (u, v) < c(u, v), alors cf (u, v) > 0, et donc (u, v) ∈ Af , • Si f (u, v) > 0, alors f (v, u) < 0, ⇒ cf (v, u) > 0, ⇒ (v, u) ∈ Af • |Af | ≤ 2|A| Augmentation de flot Lemme 3 : Soit Gf le graphe résiduel induit par le flot f , et soit f 0 un flot dans Gf . Alors, la fonction f + f 0 est un flot dans G dont la valeur est |f + f 0| = |f | + |f 0|. (f + f 0)(u, v) = ≤ = = f (u, v) + f 0(u, v) f (u, v) + cf (u, v) f (u, v) + c(u, v) − f (u, v) c(u, v) (f + f 0)(u, v) = f (u, v) + f 0(u, v) = −f (v, u) − f 0(v, u) = −(f + f 0)(v, u) ··· Chemin augmentant • Un chemin augmentant est un chemin de s à t dans Gf • Soit p un chemin augmentant. La capacité résiduelle de p : cf (p) = min{cf (u, v) : (u, v) ∈ p} Lemme 4 : Soit f un flot dans G, et soit p un chemin augmentant dans Gf . On considère la fonction fp : S 2 → R telle que : fp = cf (p) si(u, v) ∈ p = −cf (p) si(v, u) ∈ p = 0 sinon Alors, la fonction fp est un flot dans Gf avec |fp| = cf (p) > 0. Augmentation de flot (suite) Corollaire 1 : Soit f un flot dans G et Gf le graphe résiduel induit par f . Soit p un chemin augmentant dans Gf , et soit la fonction f 0 = f + fp. Alors, la fonction f 0 est un flot dans G avec |f 0| = |f | + |fp| > |f |. Immédiat à partir des 2 lemmes précédents. Coupure • Coupure (U, V ) : U ⊆ S, V = S − U avec s ∈ U et t ∈ V . • Soit f un flot. Le flot à travers (U, V ) est f (U, V ). • La capacité de la coupure (U, V ) est c(U, V ). Lemme 5 : Soit G un RAF, soit f un flot de G, et soit (U, V ) une coupure de G. Alors, le flot à travers (U, V ) est f (U, V ) = |f |. f (U, V ) = = = = = f (U, S) − f (U, U ) f (U, S) f (s, S) + f (U − {s}, S) f (s, S) (f (U − {s}, S) = 0 conservation de flot) |f | Coupure (suite) Lemme 5 : Soit G un RAF, soit f un flot de G, et soit (U, V ) une coupure de G. Alors, le flot à travers (U, V ) est f (U, V ) = |f |. Corollaire 2 : Pour tout flot f et toute coupure (U, V ) de G, nous avons |f | ≤ c(U, V ). Soit (U, V ) une coupure de G et soit f un flot. On a : |f | = f (U, V ) XX = f (u, v) ≤ u∈U v∈V X X u∈U v∈V = c(U, V ) c(u, v) Théorème flot-max coupure-min Thm 1: Soit f un flot dans un réseau de flot G. Alors les trois conditions suivantes sont équivalentes : 1. f est un flot maximum dans G 2. Le graphe résiduel Gf n’a pas de chemin augmentant 3. |f | = c(U, V ) pour une certaine coupure (U, V ) de G Théorème flot-max coupure-min (preuve) Thm 1: Soit f un flot dans un réseau de flot G. Alors les trois conditions suivantes sont équivalentes : 1. f est un flot maximum dans G 2. Le graphe résiduel Gf n’a pas de chemin augmentant 3. |f | = c(U, V ) pour une certaine coupure (U, V ) de G • (1) ⇒ (2): Si p est un chemin augmentant dans Gf , alors Coro 1 ⇒ |f + fp| est un flot de G avec |f + fp| > |f |. Contradiction. • (2) ⇒ (3): Soit U = {u ∈ S : s ;Gf u}, et soit V = S − U . – (U, V ) est une coupure (t 6∈ V puisque il n’existe pas de chemin de s à t) – ∀u ∈ U. ∀v ∈ V. f (u, v) = c(u, v) : sinon (u, v) ∈ Af et on aurait alors v ∈ U . – Lemme 5 ⇒ |f | = f (U, V ) = c(U, V ). • (3) ⇒ (1): Coro 2 ⇒ |f | ≤ c(U, V ) pour toute coupure (U, V ). On a alors : |f | = c(U, V ) implique f est un flot max. Algorithme de Ford-Fulkerson Ford-Fulkerson(G, s, t) = pour tout (u, v) ∈ A faire f [u, v] ← 0 ; f [v, u] ← 0 tant que il existe un chemin p dans Gf entre s et t faire cf (p) ← min{cf (u, v) : (u, v) ∈ p} pour tout (u, v) ∈ p faire f [u, v] ← f [u, v] + cf (p) f [v, u] = −f [u, v] Complexité : O(A|f ∗|) où f ∗ est le flot max. Algorithme de Edmonds-Karp Edmonds-Karp = Ford-Fulkerson + choix du chemin augmentant le plus court Thm 2: Le nombre total des opérations d’augmentation de flot effectuées par l’algorithme de EK est en O(SA) Algorithme de Edmonds-Karp Edmonds-Karp = Ford-Fulkerson + choix du chemin augmentant le plus court Thm 2: Le nombre total des opérations d’augmentation de flot effectuées par l’algorithme de EK est en O(SA) Corollaire : Le temps d’exécution de l’algorithme de Edmunds-Karp est en O(SA2). Chaque opération peut être faite en O(A) en utilisant le BFS Complexité de Edmonds-Karp Lemme 6 : Au cours de l’exécution de EK sur G, pout tout sommet v ∈ S − {s, t}, la distance δf (s, v) de v à s dans le graphe Gf croit avec chaque augmentation de flot. • Supposons qu’il existe une augmentation de flot causant la diminution de la distance à s pour un certain sommet v ∈ S − {s, t}, • Soit f le flot juste avant cette augmentation de flot, et soit f 0 le flot juste après, • Soit v le sommet avec δf 0 (s, v) minimum parmi les sommets dont la distance a diminué par l’opération. (On a δf 0 (s, v) < δf (s, v).) • Soit p = s ; u → v le plus court chemin de s à v dans Gf 0 . On a δf 0 (s, u) = δf 0 (s, v) − 1. • Choix de v ⇒ distance de u n’a pas diminué. On a δf 0 (s, u) ≥ δf (s, u). Complexité de Edmonds-Karp Lemme 6 : Au cours de l’exécution de EK sur G, pout tout sommet v ∈ S − {s, t}, la distance δf (s, v) de v à s dans le graphe Gf croit avec chaque augmentation de flot. • Supposons qu’il existe une augmentation de flot causant la diminution de la distance à s pour un certain sommet v ∈ S − {s, t}, • Soit f le flot juste avant cette augmentation de flot, et soit f 0 le flot juste après, • Soit v le sommet avec δf 0 (s, v) minimum parmi les sommets dont la distance a diminué par l’opération. (On a δf 0 (s, v) < δf (s, v).) • Soit p = s ; u → v le plus court chemin de s à v dans Gf 0 . On a δf 0 (s, u) = δf 0 (s, v) − 1. • Choix de v ⇒ distance de u n’a pas diminué. On a δf 0 (s, u) ≥ δf (s, u). • On montre que (u, v) 6∈ Af : Car sinon on aurait δf (s, v) ≤ δf (s, u) + 1 ≤ δf 0 (s, u) + 1 = δf 0 (s, v) Complexité de Edmonds-Karp Lemme 6 : Au cours de l’exécution de EK sur G, pout tout sommet v ∈ S − {s, t}, la distance δf (s, v) de v à s dans le graphe Gf croit avec chaque augmentation de flot. • Supposons qu’il existe une augmentation de flot causant la diminution de la distance à s pour un certain sommet v ∈ S − {s, t}, • Soit f le flot juste avant cette augmentation de flot, et soit f 0 le flot juste après, • Soit v le sommet avec δf 0 (s, v) minimum parmi les sommets dont la distance a diminué par l’opération. (On a δf 0 (s, v) < δf (s, v).) • Soit p = s ; u → v le plus court chemin de s à v dans Gf 0 . On a δf 0 (s, u) = δf 0 (s, v) − 1. • Choix de v ⇒ distance de u n’a pas diminué. On a δf 0 (s, u) ≥ δf (s, u). • On montre que (u, v) 6∈ Af . • (u, v) 6∈ Af et (u, v) ∈ Af 0 ⇒ le flot de v à u a augmenté • ⇒ le plus court chemin de s à u dans Gf utilise l’arc (v, u) • Donc δf (s, v) = δf (s, u) − 1 ≤ δf 0 (s, u) − 1 = δf 0 (s, v) − 2 Complexité de Edmonds-Karp (suite) Thm 2: Le nombre total des opérations d’augmentation de flot par EK est en O(SA) • Soit p un chemin augmentant dans Gf . Un arc (u, v) ∈ p est critique si cf (p) = cf (u, v). • Soit u, v ∈ S tels que (u, v) ∈ A. • Chemin augmentant = chemin plus court ⇒ quand (u, v) est critique pour la 1ere fois: δf (s, v) = δf (s, u) + 1 • Après l’augmentation de flot, (u, v) disparait. Il réapparait si (v, u) est dans un chemin augmentant. Soit f 0 le flot dans G à ce moment là. On a : δf 0 (s, u) = δf 0 (s, v) + 1 • On a donc : δf 0 (s, u) = δf 0 (s, v) + 1 ≥ δf (s, v) + 1 (Lemme 6) = δf (s, u) + 2 • Entre 2 moments où (u, v) est critique, δf (s, u) croit d’au moins 2 • On a toujours 0 ≤ δf (s, u) ≤ |S| − 2, ou éventuellement δf (s, u) = ∞ • (u, v) est critique au plus O(S) fois ⇒ nb d’arcs critiques en O(SA) • Chaque chemin augm. a au moins un arc critique ⇒ nb d’op. augm. en O(SA) Préflots • G = (S, A) un RAF. Un préflot est une fonction f : S 2 → R telle que 1. ∀u, v. f (u, v) ≤ c(u, v), 2. ∀u, v. f (u, v) = −f (v, u), 3. ∀u ∈ S − {s}. f (S, u) ≥ 0 • Soit e(u) = f (S, u) l’excés de flot en u • Un sommet u ∈ S − {s, t} est débordé si e(u) > 0 (Rem: par définition s et t ne sont jamais débordés) Algorithmes Push-Relabel - opérations de base • G = (S, A) un RAF, une source s et un puit t, f un préflot dans G • Une fonction de hauteur est une fonction h : S → N telle que h(s) = |S|, h(t) = 0, et ∀(u, v) ∈ Af . h(u) ≤ h(v) + 1. Push(u, v) = (Précondition: e[u] > 0, cf (u, v) > 0, et h[u] = h[v] + 1) (Effet: Ajoute df (u, v) = min(e[u], cf (u, v)) au flot de u à v) df (u, v) ← min(e[u], cf (u, v)) f [u, v] ← f [u, v] + df (u, v) ; f [v, u] = −f [u, v] e[u] ← e[u] − df (u, v) ; e[v] ← e[v] + df (u, v) Relabel(u) = (Précondition: e[u] > 0 et ∀(u, v) ∈ Af . h[u] ≤ h[v]) (Effet: Augmente la hauteur de u) h[u] ← 1 + min{h[v] : (u, v) ∈ Af } Un Algorithme Générique Initialiser-Préflot(G, s) = pour tout u ∈ S faire h[u] ← 0 ; e[u] ← 0 h[s] ← |S| pour tout (u, v) ∈ A faire f [u, v] ← 0 ; f [v, u] ← 0 pour tout u ∈ Adj(s) faire f [s, u] ← c(s, u) ; f [u, s] ← −c(s, u) e[u] ← c(s, u) ; e[s] ← e[s] − c(s, u) Push-Relabel-Générique(G) = Initialiser-Préflot(G, s) tant que il est possible d’appliquer une opération Push ou Relabel faire choisir une opération appliquable est l’exécuter Correction de l’algorithme Push-Relabel (préliminaires) Lemme 1: u est débordé ⇒ soit Push soit Relabel est applicable à u. Lemme 2: ∀u ∈ S, h[u] ne décroit jamais au cours de l’exécution. De plus, à chaque appel de Relabel(u), h[u] croit d’au moins 1. Lemme 3: La propriétée “h est une fonction de hauteur” est invariante. – Initialement, h est une fonction de hauteur. – h[s] = |S| et h[t] = 0 est invariante: s et t ne sont jamais débordés (par def). – Relabel(u) maintient la propriété: ∗ Soit (u, v) ∈ Af . Relabel(u) assure h[u] ≤ h[v] + 1. ∗ Soit (v, u) ∈ Af . HI ⇒ h(v) ≤ h(u) + 1 avant Relabel(u). Par Lemme 2, h(v) ≤ h(u) + 1 reste vraie après l’appel. – Push(u, v) maintient la propriété: ∗ (v, u) est ajouté à Af : h[v] = h[u] − 1 < h[u] + 1 ∗ (u, v) est supprimé de Af : pas de problème Correction de l’algorithme Push-Relabel (préliminaires) Lemme 4: Soit G = (S, A) un RAF, f un préflot dans G, et h un fonction de hauteur sur S. Alors il n’y a pas dans Gf de chemin de s à t. • Supposons qu’il existe p = hv0, v1, . . . , vk i un chemin dans Gf avec v0 = s et vk = t. • On suppose que p est simple: ⇒ k < |S| • h est une fonction de hauteur: ⇒ ∀i = 0, 1, . . . , k − 1. h[vi] ≤ h[vi+1] + 1 • ⇒ h[s] ≤ h[t] + k = k < |S|. Contradiction (h[s] est toujours = |S|). Correction partielle de l’algorithme Push-Relabel Thm 3: Si l’algorithme Push-Relabel-Générique termine, alors le préflot f qu’il calcule est un flot maximum. • On a l’invariant: à chaque itération, f est un préflot (Push préserve les préflot par def) • A la fin, on ∀u ∈ S − {s, t}. e[u] = 0 (sinon une opération serait applicable - Lemme 1) • ⇒ f est un flot • h est une fonction de hauteur (Lemme 3) : Lemme 4 ⇒ pas de chemins de s à t dans Gf . • Thm 1 ⇒ f est flot max Arrêt + Complexité (préliminaires) Lemme 5: Pour tout u débordé, il existe un chemin (simple) de u à s dans Gf . • Soit u tel que e[u] > 0. Soit U = {v ∈ S : u ;Gf v}, et U = S − U . • Supposons que s ∈ U . • On prouve que ∀w ∈ U , ∀v ∈ U. f (w, v) ≤ 0. (f (w, v) > 0 ⇒ f (v, w) < 0, ⇒ cf (v, w) = c(v, w) − f (v, w) > 0, ⇒ (v, w) ∈ Af ) • f (U , U ) ≤ 0 ⇒ e(U ) = = = ≤ f (S, U ) f (U , U ) + f (U, U ) f (U , U ) 0 • On a ∀u ∈ S − {s}. e(u) ≥ 0. • U ⊆ S − {s} ⇒ ∀v ∈ U. e(v) = 0. Contradiction (u ∈ U et u débordé). Arrêt + Complexité (préliminaires) Lemme 6: Le propriété “∀u ∈ S. h[u] ≤ 2|S| − 1” est invariante. • Propriété vraie pour s et t. • Soit u ∈ S − {s, t}. – Initiallement h[u] = 0. On montre que la propriété est préservée par Relabel(u). – Lemme 5: ⇒ ∃p = hv0, v1, . . . , vk i, avec v0 = u, vk = s, et k ≤ |S| − 1 (p est simple). – ∀i = 0, 1, . . . , k − 1, on a (vi, vi+1) ∈ Af . – Lemme 3 (h est une fonction de hauteur) ⇒ ∀i = 0, 1, . . . , k − 1, h[vi] ≤ h[vi+1] + 1 – ⇒ h[u] = h[v0] ≤ h[vk ] + k ≤ h[s] + (|S| − 1) = 2|S| − 1. Arrêt + Complexité (préliminaires) Lemme 6: Le propriété “∀u ∈ S. h[u] ≤ 2|S| − 1” est invariante. • Propriété vraie pour s et t. • Soit u ∈ S − {s, t}. – Initiallement h[u] = 0. On montre que la propriété est préservée par Relabel(u). – Lemme 5: ⇒ ∃p = hv0, v1, . . . , vk i, avec v0 = u, vk = s, et k ≤ |S| − 1 (p est simple). – ∀i = 0, 1, . . . , k − 1, on a (vi, vi+1) ∈ Af . – Lemme 3 (h est une fonction de hauteur) ⇒ ∀i = 0, 1, . . . , k − 1, h[vi] ≤ h[vi+1] + 1 – ⇒ h[u] = h[v0] ≤ h[vk ] + k ≤ h[s] + (|S| − 1) = 2|S| − 1. Corollaire : Le nombre des opération Relabel est au plus 2|S|−1 par sommet, et donc globalement < 2|S|2. Arrêt + Complexité (préliminaires) Push(u, v) est saturant si cf (u, v) devient = 0 après l’opération. Lemme 7: 1. Le nombre des Push saturant est au plus 2|S||A|. 2. Le nombre des Push non saturant est au plus 4|S|2(|S| + |A|). Preuve du (2): P • Soit Φ = v:e[v]>0 h[v]. (Initiallement Φ = 0.) • Une opération Relabel(u) fait croitre Φ d’au plus 2|S|. • Un Push(u, v) saturant fait croitre Φ d’au plus 2|S| (v peut devenir débordé). • Un Push(u, v) nonsaturant fait décroitre Φ d’au moins 1: – u n’est plus débordé (−h[u]) – v est débordé, sauf si v = s (+h[v] ou +0) – nous avons h[u] = h[v] + 1 • Total de la croissance: 2|S|(2|S|2 + 2|S||A|) = 4|S|2(|S| + |A|). • Φ ≥ 0 ⇒ nombre des décroissances (Push non saturant) est ≤ 4|S|2(|S| + |A|). Arrêt + Complexité Thm : Push-Relabel-Générique effectue un nombre d’opération en O(S 2A). Une implémentation de l’algorithme s’exécute en un temps O(S 2A).