Algorithme d'Edmonds pour les couplages
En informatique, plus prĂ©cisĂ©ment en thĂ©orie des graphes, l'algorithme d'Edmonds pour les couplages (blossom algorithm en anglais), aussi connu sous le nom d'algorithme des fleurs et des pĂ©tales[1] est un algorithme pour construire des couplages maximaux sur les graphes. L'algorithme a Ă©tĂ© dĂ©veloppĂ© par Jack Edmonds en 1961[2], et publiĂ© en 1965[3]. Ătant donnĂ© un graphe quelconque G = (V, E), l'algorithme trouve un couplage M tel que chaque sommet de V est incident Ă au plus une arĂȘte dans E et M est de cardinal maximal. Le couplage est construit en amĂ©liorant itĂ©rativement un couplage vide initial le long de chemins augmentant dans le graphe. Contrairement au couplage biparti, ce couplage se base sur l'idĂ©e qu'un cycle de longueur impaire dans le graphe (fleur) est contractĂ© en un seul sommet, la recherche se poursuivant de maniĂšre itĂ©rative dans le graphe contractĂ©.
L'algorithme a une complexitĂ© temporelle en , oĂč est le nombre d'arĂȘtes du graphe et est son nombre de sommets. L'algorithme de Micali et Vazirani permet de rĂ©soudre le mĂȘme problĂšme en , cependant il est beaucoup plus compliquĂ©[4].
Le blossom algorithm est historiquement important car il a donnĂ© la premiĂšre preuve qu'un couplage maximal pouvait ĂȘtre trouvĂ© en un temps polynomial, ce qui prouve que le problĂšme de couplage maximal est dans la classe de complexitĂ© P.
Chemins augmentant
Ătant donnĂ© G = (V, E) et un couplage M de G, un sommet v est couplĂ©, appariĂ©, ou couvert par M s'il existe une arĂȘte de M incidente Ă v.
Un chemin en G est un chemin alternant, s'il passe alternativement par des arĂȘtes de M et des arĂȘtes de E \ M.
Un chemin augmentant P est un chemin alternant qui commence et se termine par deux sommets non couverts par M distincts. Notez que le nombre d'arĂȘtes de E \ M dans un chemin augmentant est supĂ©rieur de un au nombre d'arĂȘtes de M, et par consĂ©quent, le nombre total d'arĂȘtes dans un chemin augmentant est impair.
Une augmentation de couplage le long d'un chemin augmentant P est l'opération consistant à remplacer M par un nouveau couplage ? .
D'aprĂšs le lemme de Berge, le couplage M est maximal si et seulement s'il n'y a pas de chemin augmentant de M dans G.[5] - [6] Par consĂ©quent, soit un couplage est maximal, soit il peut ĂȘtre augmentĂ©. Ainsi, Ă partir d'un couplage initial, nous pouvons calculer un couplage maximal en augmentant le couplage actuel avec des chemins augmentant tant que nous pouvons en trouver, et renvoyer le rĂ©sultat obtenu s'il ne reste plus de chemins augmentant. Nous pouvons formaliser l'algorithme comme suit :
ENTRĂE: Graphe G, couplage initial M sur G SORTIE: couplage maximal M* sur G A1 fonction find_maximum_matching (G, M) : M* A2 P â find_augmenting_path (G, M) A3 si P est non vide alors A4 renvoyer find_maximum_matching (G, augmentation de M le long de P) A5 sinon A6 renvoyer M A7 fin si
Nous devons encore décrire comment trouver efficacement des chemins augmentant. Le sous-programme qui réalise cette tùche utilise des fleurs et des contractions.
Fleurs et contractions
Ătant donnĂ© un graphe G = (V, E) et un couplage M de G, une fleur B est un cycle dans G constituĂ© de 2k + 1 arĂȘtes dont exactement k appartiennent Ă M. En outre, une fleur comporte un sommet v (sa base) tel qu'il existe un chemin alternant de longueur paire (la tige ) de v Ă un sommet w non couvert par M.
Trouver des fleurs:
- Parcourez le graphe Ă partir d'un sommet non couvert par M.
- Ătiquetez ce sommet comme un sommet externe "e".
- En commençant par ce sommet, alternez l'Ă©tiquetage entre les sommets intĂ©rieurs "i" et extĂ©rieurs "e" de sorte qu'aucun sommet adjacent ne possĂšde le mĂȘme libellĂ©.
- Si nous nous retrouvons avec deux sommets adjacents étiquetés comme "e" externes, alors nous avons un cycle de longueur impaire et donc une fleur.
DĂ©finissons le graphe contractĂ©' G' comme le graphe obtenu Ă partir de G en contractant chaque arĂȘte de B, et dĂ©finissons le couplage contractĂ© M' comme le couplage de G correspondant Ă M, c'est-Ă -dire le couplage obtenu en retirant Ă M toutes les arĂȘtes de B.
Montrons que G' a un chemin augmentant de M' si et seulement si G a un chemin augmentant de M, et que tout chemin augmentant P' de M dans G peut ĂȘtre Ă©tendu en un chemin augmentant de M dans G.
Le chemin Ă©tendu est obtenu en annulant la contraction par B du graphe G, et en intercalant dans P' les arĂȘtes qui doivent l'ĂȘtre[7].
- Si P' traverse un chemin u â vB â w dans G', alors ce chemin est remplacĂ© par le chemin u â (u'â ... â w') â w dans G, oĂč les sommets u' et w' de la fleur ainsi que le chemin (u'â ... â w') dans B sont choisis pour s'assurer que le nouveau chemin est toujours alternant (u' n'est pas couvert par , ).
- si P ' a une extrĂ©mitĂ© vB, alors le chemin u â vB dans G' est remplacĂ© par le segment u â (u 'â ... â v') dans G, oĂč les sommets u' et v' de la fleur ainsi que le chemin (u'â ... â v') dans B sont choisis pour s'assurer que le nouveau chemin est toujours alternant (v' n'est pas couvert par M, ).
Ainsi, la recherche peut ĂȘtre effectuĂ©e Ă partir du graphe obtenu en contractant les fleurs. Cette rĂ©duction est au cĆur de l'algorithme d'Edmonds.
Trouver un chemin augmentant
La recherche d'un chemin augmentant utilise une structure de donnĂ©es auxiliaire constituĂ©e d'une forĂȘt F dont les arbres correspondent Ă des portions spĂ©cifiques du graphe G. Cette forĂȘt F est la mĂȘme que celle utilisĂ©e pour trouver un couplage maximal dans un graphe biparti (sans avoir besoin de rĂ©duire les fleurs). A chaque itĂ©ration, l'algorithme soit (1) trouve un chemin augmentant, (2) trouve une fleur et s'appelle rĂ©cursivement sur le graphe contractĂ© correspondant, ou (3) conclut qu'il n'y a pas de chemin augmentant. La structure auxiliaire est construite par la procĂ©dure incrĂ©mentale dĂ©crite ci-dessous[7].
La procĂ©dure de construction considĂšre les sommets v et les arĂȘtes e de G et met Ă jour F de maniĂšre incrĂ©mentale si nĂ©cessaire. Si v est dans un arbre T de la forĂȘt, nous noterons root(v) la racine de T. Si u et v sont tous les deux dans le mĂȘme arbre T dans F, nous noterons distance(u, v) la longueur du chemin unique de u Ă v dans T.
ENTRĂE: un graphe G, un couplage M sur G
SORTIE: un chemin augmentant P dans G ou le chemin vide si aucun chemin augmentant n'est trouvé
B01 fonction find_augmenting_path(G, M) :
B02 F â forĂȘt vide
B03 retirer toutes les marques sur des sommets et arĂȘtes de G, marquer toutes les arĂȘtes de M
B05 pour tout sommet v non couvert par M faire
B06 créer un arbre singleton {v} et l'ajouter à F
B07 fin pour
B08 tant que qu'il y a un sommet v non marqué dans F avec distance(v, racine(v)) paire faire
B09 tant qu'il existe une arĂȘte non marquĂ©e e = {v, w} faire
B10 si w n'est pas dans F alors
// w apparaĂźt dans M, donc on ajoute e et l'arĂȘte de M incidente Ă w Ă F
B11 x â sommet correspondant Ă w dans M
B12 ajouter les arĂȘtes {v, w} et {w, x} Ă l'arbre de v
B13 sinon
B14 si la distance(w, racine (w)) est impaire alors
// Ne fais rien.
B15 sinon
B16 si racine(v) â racine(w) alors
// On stocke un chemin augmentant en F{e}.
B17 P â chemin(racine(v) â ... â v ) â (w â ... â racine(w))
B18 renvoyer P
B19 sinon
// On contracte une fleur de G et on recherche un chemin dans le graphe contracté.
B20 B â fleur formĂ©e par e et les arĂȘtes sur le chemin v â w dans T
B21 G', M' â contraction de G et M par B
B22 P' â find_augmenting_path (G', M')
B23 P â Ă©tendre P' Ă G
B24 renvoyer P
B25 fin si
B26 fin si
B27 fin si
B28 marquer l'arĂȘte e
B29 fin tant que
B30 marquer le sommet v
B31 fin tant que
B32 renvoyer le chemin vide
B33 Fin fonction
Exemples
Les quatre figures suivantes illustrent l'exĂ©cution de l'algorithme. Les lignes en pointillĂ©es indiquent des arĂȘtes qui ne sont actuellement pas prĂ©sentes dans la forĂȘt.
Tout d'abord, l'algorithme traite une arĂȘte hors forĂȘt pour provoquer l'expansion de la forĂȘt actuelle (lignes B10 â B12).
Ensuite, il dĂ©tecte une fleur et contracte le graphe au niveau de cette fleur (lignes B20 â B21).
Enfin, il localise un chemin augmentant P' dans le graphe contractĂ© (ligne B22) et le ramĂšne au graphe d'origine (ligne B23). Notez qu'il est ici crucial que l'algorithme puisse contracter des fleurs; en effet, il ne peut pas trouver P directement dans le graphe de dĂ©part car la ligne B17 de l'algorithme ne considĂšre que des arĂȘtes qui n'appartiennent pas Ă la forĂȘt et qui relient des sommets Ă distance paire des racines.
Analyse
La forĂȘt F construite par la fonction find_augmenting_path() est une forĂȘt alternĂ©e:
- un arbre T dans G est un arbre alterné par rapport à M, si
- T contient exactement un sommet r non couvert par M appelé racine de l'arbre
- chaque sommet Ă une distance impaire de la racine a exactement deux arĂȘtes incidentes dans T,
- tous les chemins de r aux feuilles de T sont de longueur paire, leurs arĂȘtes impaires ne sont pas dans M et leurs arĂȘtes paires sont dans M.
- une forĂȘt F dans G est une forĂȘt alternĂ©e par rapport Ă M, si
- ses composants connexes(?) sont des arbres alternés
- chaque sommet non couvert par M dans G est une racine d'arbre alterné dans F.
Chaque itération de la boucle commençant à la ligne B09 ajoute un arbre T à F (ligne B10), ou trouve un chemin augmentant (ligne B17), ou trouve une fleur (ligne B20). Il est facile de voir que la complexité temporelle de cet algorithme est en .
Couplage biparti
Lorsque G est biparti, il n'y a pas de cycles impairs dans G. Dans ce cas, aucune fleur n'est jamais trouvĂ©e, et on peut simplement supprimer les lignes B20 â B24 de l'algorithme. L'algorithme se rĂ©duit ainsi Ă l'algorithme standard pour construire un couplage maximum dans un graphe biparti[6] oĂč l'on recherche un chemin augmentant par un simple parcours de graphe : c'est par exemple le cas de l'algorithme de Ford-Fulkerson.
Couplage pondérée
Le problĂšme du couplage maximal peut ĂȘtre gĂ©nĂ©ralisĂ© en attribuant des poids aux arĂȘtes dans G et en recherchant un ensemble M qui produit un couplage du poids total maximal (minimal) : c'est le problĂšme de couplage de poids maximal. Ce problĂšme peut ĂȘtre rĂ©solu par un algorithme combinatoire qui utilise l'algorithme d'Edmonds non pondĂ©rĂ© comme sous-programme[5]. Kolmogorov en fournit une implĂ©mentation en C++ efficace[8].
Références
- Claire Mathieu, « Leçon inaugurale sur les algorithmes », sur CollÚge de France, .
- Edmonds, Jack (1991), "A glimpse of heaven", in J.K. Lenstra; A.H.G. Rinnooy Kan; A. Schrijver (eds.), History of Mathematical Programming --- A Collection of Personal Reminiscences, CWI, Amsterdam and North-Holland, Amsterdam, pp. 32â54
- Edmonds, Jack, « Paths, trees, and flowers », Can. J. Math., vol. 17,â , p. 449â467 (DOI 10.4153/CJM-1965-045-4)
- Micali, Silvio et Vazirani, Vijay « An O(V1/2E) algorithm for finding maximum matching in general graphs » ()
â21st Annual Symposium on Foundations of Computer Science - LovĂĄsz, LĂĄszlĂł et Plummer, Michael, Matching Theory, AkadĂ©miai KiadĂł, (ISBN 963-05-4168-8)
- Karp, Richard, "Edmonds's Non-Bipartite Matching Algorithm", Course Notes. U. C. Berkeley (PDF)
- Tarjan, Robert, "Sketchy Notes on Edmonds' Incredible Shrinking Blossom Algorithm for General Matching", Course Notes, Department of Computer Science, Princeton University (PDF)
- (en) Vladimir Kolmogorov, « Blossom V: a new implementation of a minimum cost perfect matching algorithm », Mathematical Programming Computation, vol. 1, no 1,â 2009-07-xx, p. 43â67 (ISSN 1867-2949 et 1867-2957, DOI 10.1007/s12532-009-0002-8, lire en ligne, consultĂ© le )