AccueilđŸ‡«đŸ‡·Chercher

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 ? .

Augmentation along a path

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.

Example of a blossom

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 , ).

Path lifting when P’ traverses through vB, two cases depending on the direction we need to choose to reach vB

  • 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, ).

Path lifting when P’ ends at vB, two cases depending on the direction we need to choose to reach vB

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).

Forest expansion on line B10

Ensuite, il dĂ©tecte une fleur et contracte le graphe au niveau de cette fleur (lignes B20 – B21).

Blossom contraction on line 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.

Detection of augmenting path Pâ€Č in Gâ€Č on line B17

Lifting of Pâ€Č to corresponding augmenting path in G on line B25

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

  1. Claire Mathieu, « Leçon inaugurale sur les algorithmes », sur CollÚge de France, .
  2. 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
  3. Edmonds, Jack, « Paths, trees, and flowers », Can. J. Math., vol. 17,‎ , p. 449–467 (DOI 10.4153/CJM-1965-045-4)
  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
  5. Lovåsz, Låszló et Plummer, Michael, Matching Theory, Akadémiai Kiadó, (ISBN 963-05-4168-8)
  6. Karp, Richard, "Edmonds's Non-Bipartite Matching Algorithm", Course Notes. U. C. Berkeley (PDF)
  7. Tarjan, Robert, "Sketchy Notes on Edmonds' Incredible Shrinking Blossom Algorithm for General Matching", Course Notes, Department of Computer Science, Princeton University (PDF)
  8. (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 )
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.