Structures de données IFT-2000 2704 Abder Alikacem Arbres de recouvrement minimum 867 BOS 849 PVD ORD 187 740 144 1846 621 JFK 184 1258 802 SFO 1391 BWI 1464 337 1090 DFW 946 LAX 1235 1121 MIA Édition Septembre 2009 2342 Département d’informatique et de génie logiciel
Arbres couvrant de poids minimum Introduction Imaginons que nous ayons à connecter des villes entre elles, par exemple avec un nouveau réseau très haut débit. Un certains nombre de connexions directes point à point entre les villes sont techniquement possibles. Il nous faut choisir lesquelles parmi ces connexions nous allons effectivement mettre en place. La distance entre 2 villes dans le réseau final a peu d'importance au vu des débits; cependant les coûts d'installation du réseau ne sont évidemment pas les mêmes pour les différentes liaisons point à point. Nous aimerions donc déterminer comment connecter toutes les villes en minimisant le coût total du réseau.
Arbres couvrant de poids minimum Ce problème en théorie des graphes correspond à la recherche d'un arbre couvrant de poids minimum. L'ensemble des connexions potentielles peut être représenté par un graphe G = (X,U) dans lequel chaque arête u est associée à un coût poids(u) positif. Connecter toutes les villes correspond à sélectionner un ensemble d'arêtes F de G tel que le graphe partiel H = (X,U’) induit est connexe. Le poids de cette solution poids(H) est définie comme la somme des poids de ses arêtes. Notre problème s'énonce donc : Etant donné un graphe G = (X,U), déterminer un graphe partiel connexe H = (X,U’) de poids minimum Il est facile de voir qu'un tel graphe partiel H doit être un arbre : si H n'est pas acyclique, on peut supprimer une arête d'un de ses cycles sans le déconnecter et en faisant diminuer le poids total.
Arbres couvrant de poids minimum Définition Un arbre couvrant pour un graphe G=(X,U) est un arbre construit uniquement à partir des arêtes de U et qui connecte ("couvre") tous les sommets de X. Un arbre couvrant d'un graphe G est donc un graphe T tel que Le graphe T est un arbre. Le graphe T est un graphe partiel de G. Le problème de l'arbre couvrant de poids minimum consiste à trouver un arbre couvrant dont la somme des poids poids(u) des arêtes est minimum.
Arbres couvrant de poids minimum La seule condition, nécessaire et suffisante, pour qu'un graphe admette un arbre couvrant est qu'il soit connexe. Un arbre couvrant de poids minimum (MST, Minimum Spanning Tree) est en général différent de l'arbre des plus courts chemins (SPT, Shortest Paths Tree) construit par l’algorithme de Dijkstra. Un arbre des plus courts chemins SPT est bien un arbre couvrant, mais il minimise la distance de la racine à chaque sommet. Alors qu’un arbre couvrant de poids minimum MST est forcément non orienté et calcule la somme des poids des arêtes. Un arbre des plus courts chemins (SPT) Un arbre de poids minimum (MST) de racine A Son poids total est 14 Son poids total est 10
Arbres couvrant de poids minimum Il existe 2 algorithmes célèbres pour résoudre le problème de l'arbre couvrant de poids minimum MST. Chacun de ces 2 algorithmes utilise plus particulièrement l'une des caractérisations des arbres pour trouver un MST : soit en considérant les arbres comme des graphes connexes avec le minimum d'arêtes, soit en considérant les arbres comme des graphes acycliques avec le maximum d'arêtes. Ces 2 algorithmes utilisent également 2 techniques de résolution très différentes : Algorithme de Prim Il maintient au fur et à mesure de la construction un sous-graphe connexe qui grossit petit à petit. Algorithme de Kruskal Il maintient au fur et à mesure de la construction un graphe partiel acyclique. Si les algorithmes de recherche sont spécifiques aux graphes, l'algorithme de Kruskal utilise lui un paradigme de résolution plus général : les algorithmes gloutons.
Arbres couvrant de poids minimum Algorithme de Kruskal Le principe de l'algorithme de Kruskal pour trouver un arbre de poids minimum dans un graphe G est tout d'abord de trier les arêtes par ordre croissant de leur poids. Ensuite, dans cet ordre, les arêtes sont ajoutées une par une dans un deuxième graphe pour construire progressivement l'arbre. Une arête est ajoutée seulement si son ajout dans l’arbre n'introduit pas de cycle. Sinon, on passe à l'arête suivante dans l'ordre du tri. A la fin de la construction de l’arbre, si le nombre d’arêtes de l’arbre est inférieur au nombre de sommets–1 du graphe G, cela signifie que ce dernier n’est pas connexe.
Arbres couvrant de poids minimum Algorithme de Kruskal On part d’une solution vide. On choisit donc, à chaque fois, une arête de G de poids minimum et qui ne crée pas de cycle. Soit E l'ensemble des sommets de G. On utilisera un ensemble d'arêtes T qui sera en sortie l'arbre couvrant minimal et un ensemble d'arêtes F qui représentera les arêtes qui peuvent être choisies. T = { }; F = E ; tant que |T| < n - 1 faire trouver une arête e de F de poids minimal F = F - e si T + e est acyclique alors T = T + e finsi fin tant que
Arbres couvrant de poids minimum Algorithme de Kruskal Exemple 1 Les différentes étape pour construire l’arbre T
Arbres couvrant de poids minimum Algorithme de Kruskal Exemple 2 Reprenons le graphe suivant, et construisons l’arbre recouvrant de poids minimum à l’aide de l’algorithme de Kruskal. Poids Arêtes 2 B-C 2 D-E 3 C-D 4 B-D éléminée 4 A-E 5 A-B éléminée 6 B-E éléminée
Arbres couvrant de poids minimum Algorithme de Kruskal Complexité Si les arêtes sont classées par ordre de coût croissant, ce qui peut se faire en ; e étant le nombre d’arêtes dans le graphe, il reste à évaluer la complexité de test d’acyclicité. Si les composantes connexes du graphe T sont connues, ce test se réduit à vérifier que les extrémités de l’arête choisie sont dans eux composantes connexes distinctes. Il reste alors à gérer ces composantes connexes de manière à fusionner deux composantes connexes reliées par l’arête choisie. Cela peut se faire par la technique de fusion rapide en - comment? – L’algorithme de Kruskal a une complexité de l’ordre .
Arbres couvrant de poids minimum Algorithme de Prim L’algorithme de Kruskal veille à maintenir la propriété d’acyclicité d’un arbre alors que l’algorithme de Prim se base sur la connexité d’un arbre. En effet, l'algorithme de Prim se base sur la caractérisation des arbres comme des graphes connexes minimaux au sens de l'inclusion : on ne peut enlever une arête à un arbre sans le déconnecter. L'idée de l'algorithme est de maintenir un sous-graphe partiel connexe, en connectant à nouveau sommet à chaque étape. L'algorithme de Prim va ainsi faire grossir un arbre jusqu'à ce qu'il couvre tous les sommets du graphe. Si à une étape un ensemble A de sommets sont connectés entre eux, pour choisir le prochain sommet à connecter, l'algorithme part d'une constatation simple : dans un arbre couvrant, il existe nécessairement une arête qui relie l'un des sommets de A avec un sommet en dehors de A. Pour construire un arbre couvrant de poids minimum (MST), il suffit de choisir parmi ces arêtes sortantes celle de poids le plus faible.
Arbres couvrant de poids minimum Algorithme de Prim Pour détecter les arêtes sortantes, nous pouvons marquer au fur et à mesure de l'algorithme les sommets déjà connectés. Une arête sortante relie alors nécessairement un sommet marqué et un sommet non marqué. Reste une question : de quel sommet partir ? Eh bien le choix du sommet initial n'a pas d'importance... tout sommet doit de toute manière être relié aux autres dans l'arbre final. Si le graphe G n'est pas connexe, l'algorithme de Prim sous cette forme construit un arbre couvrant uniquement sur la composante connexe du sommet initialement marqué.
Arbres couvrant de poids minimum Algorithme de Prim L’algorithme de Prim fait donc pousser un arbre couvrant minimal en ajoutant au sous-arbre T déjà construit une nouvelle branche parmi les arêtes de poids minimal joignant un sommet de T à un sommet qui n’est pas dans ce dernier. L’algorithme s’arrête lorsque tous les sommets du graphe sont dans T. Soit X l’ensemble de sommets du graphe de départ G. On utilisera un ensemble d’arêtes qui sera en sortie l’arbre recouvrant en question, et S un ensemble qui contiendra les sommets de T. T = S= S x tant que S X faire trouver une arête e = {y,s} de poids minimal tel que yX-S et sS T = T {y,s} S = S y findutantque
Les différentes étapes pour construire l’arbre T Arbres couvrant de poids minimum Algorithme de Prim Exemple Les différentes étapes pour construire l’arbre T
Arbres couvrant de poids minimum Algorithme de Prim Complexité Si S possède k sommets, pour choisir une arête de poids minimal reliant un sommet de S à un sommet de X-S, on doit trouver le poids minimum parmi au plus k(n-k) arêtes puisque chaque sommet de S est adjacent à au plus (n-k) sommets de X-S. Or k varie entre 1 et n, donc Ce choix est effectuée n fois dans la boule tant que. Donc la complexité est en .