Conception de réseaux Frédéric Meunier 14 décembre 2016 Ecole des Ponts, France Préliminaire sur les graphes Un arbre est un graphe connexe sans cycle. Propriété : si un arbre a n sommets, il a alors n − 1 arêtes. Propriété : Soit G un graphe connexe. S’il a au moins autant d’arêtes que de sommets, alors il a un cycle. ARBRE COUVRANT DE POIDS MIN Un problème de réseau n villages distances entre village i et village j A B C D E F G A B C D E F G 0 3 8 9 10 5 5 3 0 9 9 12 5 4 8 9 0 2 10 9 9 9 9 2 0 11 9 8 10 12 10 11 0 11 11 5 5 9 9 11 0 1 5 4 9 8 11 1 0 Trouver le réseau routier de distance totale minimale qui relie tous les villages, sachant qu’un tronçon relie toujours deux villages (pas d’embranchement sur les routes). Modélisation • Graphe complet Kn = (V , E). • Fonction de poids w : E → R+ . • Chercher F ⊆ E tel que P e∈F w (e) soit minimum et tel que le graphe (V , F ) soit connexe. On peut supposer que T := (V , F ) est un arbre. (car les poids sont ≥ 0.) Arbre couvrant de poids minimal Problème précédent = problème d’arbre couvrant de poids minimal. Arbre couvrant de G = (V , E) : c’est un arbre T = (V , F ) avec F ⊆ E. Problème PROBLÈME DE L’ARBRE COUVRANT DE POIDS MINIMAL Données. Graphe G = (V , E), fonction de poids w : E → R. Tâche. Trouver un arbre couvrant de plus petit poids. Polynomialité Théorème Il existe un algorithme polynomial qui résout le problème de l’arbre couvrant de poids minimal. Algorithme de Kruskal Algorithme de Kruskal résout simplement ce problème. • Trier les arêtes par poids croissant : e1 , . . . , em . • Poser F := {e1 }, i := 1. • Répéter Faire i := i + 1. Si F ∪ {ei } ne contient pas de cycle, faire F := F ∪ {ei }. Preuve de l’optimalité Forêt F = (V , F ) est bonne s’il existe un arbre couvrant T = (V , F 0 ) de poids minimal avec F ⊆ F 0 . Théorème Soit F = (V , F ) une bonne forêt, soit une coupe δ(X ) (avec X ⊆ V ) disjointe de F et soit e une arête de poids minimal dans δ(X ). Alors (V , F ∪ {e}) est encore une bonne forêt. Algorithme de Kruskal ajoute à chaque itération l’arête de plus petit poids dans la coupe δ(K ), où K est l’une des deux composantes connexes de F = (V , F ) incidentes à ei . Illustration e 1 2 arêtes d’une bonne forêt 4 X Algorithme glouton Un tel algorithme est glouton. A chaque étape : meilleur choix local. Ici, cela donne l’optimum. C’est un résultat remarquable : pour la plupart des problèmes, l’algorithme glouton ne donne pas l’optimum. ARBRES DE STEINER DE POIDS MINIMUM Problème PROBLÈME DE L’ARBRE DE STEINER DE POIDS MINIMUM Données. Graphe G = (V , E), fonction de poids w : E → R+ et ensemble de sommets S ⊆ V , appelés terminaux. Tâche. Trouver un arbre de plus petit poids couvrant S. Arbre couvrant S : arbre T = (V 0 , F ), avec S ⊆ V 0 ⊆ V et F ⊆ E. Applications Les applications de ce problème sont nombreuses : • conception de réseau gazier, • conception de réseau routier, • conception de réseau informatique. Complexité Théorème Le problème de l’arbre de Steiner est NP-difficile, même si tous les poids sont égaux à 1. Formulation linéaire Proposition Soit r un sommet arbitraire, r ∈ S. Résoudre le problème de l’arbre de Steiner de coût minimum, c’est résoudre X Min w (e)xe e∈E s.c. X xe ≥ 1 ∀X ⊆ V \ {r } tel que X ∩ S 6= ∅ e∈δ(X ) xe ∈ {0, 1} ∀e ∈ E Formulation linéaire En notant C = {X ⊆ V \ {r } : X ∩ S 6= ∅}, le programme linéaire est donc X Min w (e)xe s.c. e∈E X xe ≥ 1 X ∈C e∈δ(X ) xe ∈ {0, 1} e ∈ E. (P) Le problème précédent a deux caractéristiques qui le rende difficile à résoudre. • il est en nombres entiers. • il a un nombre exponentiel de contraintes. Adaptation du branch-and-bound pour gérer un nombre exponentiel de contraintes : branch-and-cut. Séparer les contraintes Idée principale : on suppose que l’on dispose d’un algorithme A qui résout SEPARATION DES CONTRAINTES POUR ARBRE DE STEINER Données. Vecteur x ∈ RE+ . Tâche. Renvoie ‘oui’ si x satisfait toutes les contraintes P 0 Pe∈δ(X ) xe ≥ 1 pour X ∈ C. Si non, renvoie X ∈ C tel que e∈δ(X 0 ) xe < 1. Branch-and-cut On fait un branch-and-bound. Pour résoudre la relaxation linéaire de (P) : On choisit C 0 ⊆ C. 1. On résout P min Pe∈E w (e)xe 0 s.c. e∈δ(X ) xe ≥ 1 X ∈ C 0 ≤ xe ≤ 1 e∈E Cela donne une solution x̄. 2. On applique A sur x̄. • Si ‘oui’, alors on continue le branch-and-bound (on a résolu la relaxation linéaire de (P)). • Si non, on retourne en 1. en ajoutant le X 0 obtenu par A à C0. Séparation pour l’arbre de Steiner L’algorithme A de séparation des contraintes pour l’arbre de Steiner existe : Mettre x̄e comme capacité de e, pour e ∈ E. A r fixé : calculer pour tout s dans S \ {r } une r-s coupe de capacité minimum. Si l’une de ces coupes δ(X 0 ) a une capacité < 1, alors P X 0 ∈ C et e∈δ(X 0 ) x̄e < 1. Recherche locale Recherche locale classique pour le problème de l’arbre de Steiner : Pour tout V 0 ⊆ V tel que S ⊆ V 0 , on calcule par Kruskal l’arbre couvrant V 0 de poids mininimum n’utilisant que les sommets de V 0 : donne le coût de V 0 . Alors V 0 est voisin de V 00 si l’on est dans une des ces situations 1. V 00 := V 0 \ {v 0 } pour un v 0 ∈ V 0 , (drop) 2. V 00 := V 0 ∪ {v 00 } pour un v 00 ∈ V \ V 0 (add) ou 3. V 00 := V 0 \ {v 0 } ∪ {v 00 } (swap).