AccueilđŸ‡«đŸ‡·Chercher

Algorithme de Hopcroft-Karp

En informatique, l'algorithme de Hopcroft-Karp est un algorithme qui prend en entrĂ©e un graphe biparti et qui produit en sortie un couplage de cardinalitĂ© maximum, c'est-Ă -dire un ensemble d'arĂȘtes aussi grand que possible avec la propriĂ©tĂ© que deux arĂȘtes ne partagent jamais une extrĂ©mitĂ©. L'algorithme a une complexitĂ© en temps en dans le pire des cas, oĂč est l'ensemble des arĂȘtes et est l'ensemble des sommets du graphe, et il est supposĂ© que . Dans le cas de graphes denses, la borne devient , et pour des graphes alĂ©atoires creux, le temps est pratiquement linĂ©aire (en ).

Algorithme de Hopcroft-Karp
DĂ©couvreurs ou inventeurs
John Hopcroft, Richard Karp, Alexander V. Karzanov (en)
Date de découverte
ProblÚmes liés
Algorithme, algorithme de la théorie des graphes (d)
Structure des données
Basé sur
Complexité en temps
Pire cas
Complexité en espace
Pire cas

L'algorithme a Ă©tĂ© dĂ©crit par John Hopcroft et Richard Karp en 1973[1]. De mĂȘme nature que d'autres algorithmes antĂ©rieurs de calcul de couplages comme l'algorithme hongrois ou la mĂ©thode d'Edmonds[2], l'algorithme de Hopcroft-Karp incrĂ©mente itĂ©rativement la taille d'un couplage partiel par le calcul de chemins d'augmentation : ce sont des suites d'arĂȘtes qui sont alternativement dans et en dehors du couplage, de sorte que le remplacement des arĂȘtes dans le couplage par celles qui sont en dehors produit un couplage plus grand. Toutefois, au lieu de dĂ©terminer juste un seul chemin d'augmentation Ă  chaque itĂ©ration, l'algorithme calcule Ă  chaque phase un ensemble maximal de chemins d'augmentation de longueur minimale. Il en rĂ©sulte que itĂ©rations suffisent. Le mĂȘme principe a aussi Ă©tĂ© employĂ© pour dĂ©velopper des algorithmes plus compliquĂ©s de couplage dans des graphes non bipartis, avec la mĂȘme complexitĂ© en temps que l’algorithme de Hopcroft-Karp.

Chemins d’augmentation

Un sommet qui n'est pas extrĂ©mitĂ© d'une arĂȘte d'un couplage partiel est appelĂ© un sommet libre. La notion de base sur laquelle repose l’algorithme est celle de chemin d'augmentation ; c'est un chemin qui commence en un sommet libre, qui finit en un sommet libre, qui alterne des arĂȘtes hors du couplage et dans le couplage, et qui passe au plus une fois par chaque sommet, c'est-Ă -dire un chemin qui commence et finit en des sommets libres distincts, qui alterne des arĂȘtes hors du couplage et dans le couplage, et qui passe au plus une fois par chaque arĂȘte. Il rĂ©sulte de cette dĂ©finition que, Ă  l'exception de ses extrĂ©mitĂ©s, tous les sommets d'un chemin d'augmentation, s'il y en a, sont de sommets non libres. Un chemin d'augmentation peut consister en une seule arĂȘte qui est hors du couplage et dont les deux extrĂ©mitĂ©s sont des sommets libres. Plus gĂ©nĂ©ralement, un chemin d'augmentation a une arĂȘte de plus hors du couplage que dans le couplage.

Si est un couplage et est un chemin d'augmentation relativement Ă  , alors la diffĂ©rence symĂ©trique des deux ensembles d'arĂȘtes constitue un couplage de taille . Ainsi, en trouvant des chemins d'augmentation, on accroĂźt par diffĂ©rence symĂ©trique la taille d'un couplage.

RĂ©ciproquement, si un couplage n'est pas optimal, soit la diffĂ©rence symĂ©trique oĂč est un couplage maximal. Comme et sont tous deux des couplages, chaque sommet a degrĂ© au plus 2 dans ; l'ensemble est donc constituĂ© d'un ensemble de cycles disjoints, d'un ensemble de chemins avec autant d'arĂȘtes dans que en dehors de , de chemins d'augmentation pour , et de chemins d'augmentation pour ; mais ce dernier cas est exclu puisque est maximal. Les cycles et les chemins qui ont autant d'arĂȘtes dans et en dehors du couplage ne contribuent pas Ă  la diffĂ©rence de taille entre et , de sorte que cette diffĂ©rence est Ă©gale au nombre de chemins d'augmentation pour dans . Ainsi, chaque fois qu'il existe un couplage plus grand que le couplage courant , il doit aussi exister un chemin d'augmentation. Si un tel chemin d'augmentation ne peut ĂȘtre trouvĂ©, l'algorithme par incrĂ©mentation termine puisque alors est optimal.

La notion de chemin d'augmentation dans un problĂšme de couplage est Ă©troitement liĂ©e Ă  celle de chemin augmentant dans le problĂšme de flot maximum ; ce sont des chemins oĂč on peut augmenter la quantitĂ© de flot entre les extrĂ©mitĂ©s. On peut transformer le problĂšme du couplage biparti en une instance du problĂšme du flot maximum, de sorte que les chemins alternants du problĂšme de couplage deviennent des chemins augmentant dans le problĂšme de flot[3]. En fait, une gĂ©nĂ©ralisation de la technique utilisĂ©e dans l'algorithme de Hopcroft-Karp Ă  des rĂ©seaux de flots arbitraire est connue sous le nom d'algorithme de Dinic.

Algorithme

L'algorithme peut ĂȘtre dĂ©crit par le pseudo-code suivant :

Entrée: un graphe biparti
Sortie: un couplage
répéter
ensemble maximal de chemins d'augmentation sans sommets communs et de longueur minimale
jusqu'Ă 

Plus prĂ©cisĂ©ment, soient et les deux ensembles dans la bipartition des sommets de , et soit le couplage courant entre et . Une arĂȘte dans est dite couplĂ©e, les autres sont non couplĂ©es. L'algorithme opĂšre par phases, et chaque phase consiste en les Ă©tapes suivantes :

  • Un algorithme de parcours en largeur partitionne les sommets du graphe en couches. Les sommets libres de sont utilisĂ©s comme sommets de dĂ©part du parcours et forment la premiĂšre couche de la partition. Au premier niveau du parcours il n'y a que des arĂȘtes non couplĂ©es puisque par dĂ©finition les sommets libres ne sont pas extrĂ©mitĂ©s d'une arĂȘte couplĂ©e. Dans les Ă©tapes suivantes du parcours, le arĂȘtes traversĂ©es doivent alternativement ĂȘtre couplĂ©es et non couplĂ©es. Plus prĂ©cisĂ©ment, lors de la recherche des successeurs d'un sommet de , seules des arĂȘtes non couplĂ©es peuvent ĂȘtre parcourues, alors qu'Ă  partir d'un sommet de , seules des arĂȘtes couplĂ©es peuvent ĂȘtre parcourues. La recherche se termine Ă  la premiĂšre couche oĂč un ou plusieurs sommets libres de sont atteints.
  • Les sommets libres de de la couche sont rĂ©unis en un ensemble . Ainsi, un sommet est dans l'ensemble si et seulement s'il est l'extrĂ©mitĂ© d'un chemin d'augmentation de longueur minimale.
  • L'algorithme dĂ©termine un ensemble maximal de chemins d'augmentation de longueur sans sommet commun[4]. L'ensemble de chemins disjoints est calculĂ© par un algorithme de parcours en profondeur partant de l'ensemble vers les sommets libres dans , en utilisant les couches du parcours en largeur pour guider le parcours : le parcours en profondeur ne peut suivre que des arĂȘtes vers des sommets pas encore utilisĂ©s de la couche suivante, et les chemins dans l'arbre du parcours en profondeur doivent suivre alternativement des arĂȘtes couplĂ©es et non couplĂ©es. Lorsqu'un chemin d'augmentation pour un des sommets de est trouvĂ©, la recherche en profondeur redĂ©marre Ă  partir du sommet de dĂ©part suivant dans . Tout sommet rencontrĂ© durant le parcours en profondeur est immĂ©diatement marquĂ© comme utilisĂ© ; en effet, s'il n'y a pas de chemin de ce sommet vers Ă  ce moment du parcours, alors le sommet ne pourra pas ĂȘtre utilisĂ© non plus Ă  un moment ultĂ©rieur du parcours. Ceci garanti que le temps du parcours en profondeur est en . On peut aussi opĂ©rer dans l'autre direction, des sommets libres de vers ceux de [5], qui est la variante utilisĂ©e dans le pseudo-code ci-dessous.
  • Tous les chemins ainsi trouvĂ©s sont utilisĂ©s pour agrandir .

L'algorithme se termine quand on ne trouve plus de chemin d'augmentation dans le parcours en largeur utilisée dans la premiÚre partie d'une phase.

Exemple

PremiĂšre phase.

Le graphe biparti de l'exemple ci-contre a 5 sommets et 10 arĂȘtes. Dans la partie gauche, avant la premiĂšre phase, tous les sommets sont libres, le couplage est vide. Tous les chemins d'augmentation sont rĂ©duits Ă  une seule arĂȘte entre un sommet de et un sommet de . Un parcours en largeur sĂ©lectionne par exemple les arĂȘtes , , et (en choisissant, pour chaque sommet de U Ă©ligible, le sommet de V de plus petit indice). Cet ensemble de chemins est bien maximal, tous ont mĂȘme longueur 1, le couplage obtenu est de taille 4, et il reste deux sommets libres, et .

Dans la deuxiĂšme phase, il s'agit de trouver les chemins d'augmentation de longueur minimale, Ă  partir du seul sommet libre de U (ou Ă  partir du seul sommet libre de V). Le chemin indiquĂ© en gras alterne des arĂȘtes noires, hors couplage, et des arĂȘtes rouges, dans le couplage. Il est de longueur 5. On voit bien qu'il n'existe pas de chemin de longueur 3 (les chemins sont toujours de longueur impaire), mais il y a un chemin de longueur 7, Ă  savoir . Le couplage rĂ©sultant de la diffĂ©rence symĂ©trique du couplage prĂ©cĂ©dent avec le chemin de longueur 5 donne le couplage de taille 5 de l'exemple. Il est maximal parce qu'il n'y a plus aucun sommet libre.

DeuxiĂšme phase

Analyse

Chaque phase consiste en un parcours en largeur suivi d'un parcours en profondeur. Chaque phase peut donc ĂȘtre rĂ©alisĂ©e en temps . Par consĂ©quent, les premiĂšres phases, pour un graphe Ă  sommets et arĂȘtes, prennent un temps .

On peut montrer[5] que chaque phase augmente d'au moins 1 la longueur du plus court chemin d'augmentation : dans une phase, on dĂ©termine un ensemble maximal de chemins d'augmentation d'une certaine longueur, donc tout autre chemin d'augmentation doit ĂȘtre plus long. Par consĂ©quent, une fois les phases initiales de l'algorithme exĂ©cutĂ©es, le plus court chemin d'augmentation restant contient au moins arĂȘtes. Or, la diffĂ©rence symĂ©trique entre un couplage Ă©ventuellement optimal et le couplage partiel obtenu aprĂšs les phases initiales de l’algorithme est une collection de chemins d'augmentation sans sommets communs, et de cycles alternants. Si chaque chemin dans cette collection a longueur au moins , il y a au plus chemins dans cette collection, et la taille d'un couplage optimal diffĂšre de la taille de par au plus arĂȘtes. Comme chaque phase de l’algorithme augmente la taille du couplage d'au moins une unitĂ©, il y a au plus phases supplĂ©mentaires avant que l'algorithme termine .

Comme l'algorithme exécute au total au plus phases, il prend un temps en dans le pire des cas.

Dans de nombreux cas, le temps d'exĂ©cution peut ĂȘtre plus court que ce qu'indique cette analyse dans le pire des cas. Par exemple, l'analyse de la complexitĂ© en moyenne pour des graphes creux biparti alĂ©atoires menĂ©e par Bast et al. 2006, amĂ©liorant des rĂ©sultats antĂ©rieurs de Motwani 1994, montre qu'avec une grande probabilitĂ©, tous les couplages non optimaux ont des chemins d'augmentation de longueur logarithmique. Il en rĂ©sulte que, pour ces graphes, l'algorithme de Hopcroft-Karp requiert phases et un temps total en .

Comparaison avec d'autres algorithmes de couplage

Pour des graphes creux, l'algorithme de Hopcroft-Karp continue d'ĂȘtre l'algorithme le plus rapide connu dans le pire des cas, mais pour des graphes denses (pour lesquels ) un algorithme ultĂ©rieur de Alt et al. 1991 donne une borne lĂ©gĂšrement meilleure, Ă  savoir . Leur algorithme commence par l'emploi de l'algorithme de poussage/rĂ©Ă©tiquetage et quand le couplage obtenu par cette mĂ©thode est prĂšs de l'optimum, bascule sur la mĂ©thode de Hopcroft-Karp.

Divers auteurs ont rĂ©alisĂ© des comparaisons expĂ©rimentales de d’algorithmes de couplage de graphes bipartis. Leurs rĂ©sultats, tels que rĂ©sumĂ©s dans un rapport technique de Setubal 1996, tendent Ă  montrer que la mĂ©thode de Hopcroft-Karp n'est pas aussi bonne en pratique qu'en thĂ©orie : d'autres mĂ©thodes sont plus rapides, en utilisant des parcours en largeur ou en profondeur plus simples pour la dĂ©termination des chemins d'augmentation, ou des techniques de poussage/rĂ©Ă©tiquetage.

Graphes non biparti

La mĂȘme façon de dĂ©terminer un ensemble maximal de chemins d'augmentation de longueur minimale pour trouver un couplage de taille maximale s'applique aussi dans des graphes non biparti, et pour la mĂȘme raison les algorithmes basĂ©s sur cette idĂ©e demandent au plus phases. Toutefois, pour les graphes non biparti, trouver les chemins d'augmentation pour chacune des phases est plus difficile. En s'appuyant sur divers travaux antĂ©rieurs Micali et Vazirani 1980 ont montrĂ© comment implĂ©menter chaque phase de l'algorithme en temps linĂ©aire, ce qui finalement donne un algorithme pour le couplage dans les graphes non bipartis qui a la mĂȘme borne de complexitĂ© que l'algorithme de Hopcroft-Karp pour les graphes bipartis. La technique de Micali-Vazirani est complexe, et leur article ne contient pas tout le dĂ©tail des preuves ; une version qui se veut plus claire a Ă©tĂ© publiĂ©e ensuite par Peterson et Loui 1988, et d'autres mĂ©thodes ont Ă©tĂ© proposĂ©es par d'autres auteurs[6]. En 2012, Vazirani a fourni une dĂ©monstration simplifiĂ©e de l'algorithme de Micali-Vazirani algorithm[7].

Pseudo-code

Dans les pseudo-code ci-dessous, et forment la partition des sommets du graphe, et NIL est un somme spĂ©cial. Pour un sommet u de U, Pair_U[u] est NIL si u est libre, et sinon est Ă©gal Ă  l'autre extrĂ©mitĂ© de l'arĂȘte Ă  laquelle il est couplĂ©. De mĂȘme pour Pair_V[v].

Algorithme

function Hopcroft-Karp
    for each u in U
        Pair_U[u] = NIL
    for each v in V
        Pair_V[v] = NIL
    matching = 0
    while BFS() 
        for each u in U
            if Pair_U[u] == NIL
                if DFS(u) 
                    matching = matching + 1
    return matching

Au départ, tous les sommets de U et V sont libres. Chaque phase commence par un parcours en largeur, suivi d'un parcours en profondeur à partir des sommets libres de U. Chaque parcours en profondeur réussi fournit un chemin d'augmentation.

Parcours en largeur

function BFS ()
    for each u in U
        if Pair_U[u] == NIL
            Dist[u] = 0
            Enqueue(Q,u)
        else
            Dist[u] = ∞
    Dist[NIL] = ∞
    while not Empty(Q)
        u = Dequeue(Q)
        if Dist[u] < Dist[NIL] 
            for each v in Adj[u]
                if Dist[ Pair_V[v] ] == ∞
                    Dist[ Pair_V[v] ] = Dist[u] + 1
                    Enqueue(Q,Pair_V[v])
    return Dist[NIL] != ∞

Parcours en profondeur

function DFS (u)
    if u != NIL
        for each v in Adj[u]
            if Dist[ Pair_V[v] ] == Dist[u] + 1
                if DFS(Pair_V[v]) 
                    Pair_V[v] = u
                    Pair_U[u] = v
                    return true
        Dist[u] = ∞
        return false
    return true

Explication

Soit U, V la partition des sommets. L'idĂ©e est d'ajouter deux sommets fictifs, un de chaque cĂŽtĂ© du graphe: uDummy est reliĂ© Ă  tous les sommets libres de U et vDummy est reliĂ© Ă  tous les sommets libres de V. Ainsi, en exĂ©cutant un parcours en largeur BFS depuis uDummy vers vDummy, on obtient un chemin le plus court entre un sommet libre de U et un sommet libre de V. Comme le graphe est biparti, ce chemin zigzague entre U et V. Cependant, il faut vĂ©rifier que l'on sĂ©lectionne toujours une arĂȘte couplĂ©e pour aller de V Ă  U. Si une telle arĂȘte n'existe pas, on termine au sommet vDummy. Si ce critĂšre est observĂ© au cours de BFS, alors le chemin gĂ©nĂ©rĂ© rĂ©pond aux critĂšres pour ĂȘtre un chemin d'augmentation de longueur minimale. Les sommets uDummy et vDummy qui servent Ă  cette explication ne figurent pas explicitement dans le pseudo-code.

Une fois un chemin d'augmentation de longueur minimale trouvĂ©, il faut s'assurer d'ignorer les autres chemins, plus longs. Pour cela, l'algorithme BFS dĂ©core les nƓuds dans le chemin avec leur distance avec la source. Ainsi, aprĂšs le parcours BFS, on commence par chaque sommet libre dans U, et on suit le chemin en suivant des nƓuds dont la distance augmente de 1. Quand on arrive finalement au sommet destination vDummy, si sa distance est 1 de plus que le dernier nƓud dans V alors on sait que le chemin suivi est l'un des chemins les plus courts possibles. Dans ce cas, on peut procĂ©der Ă  la mise Ă  jour du couplage sur le chemin de U Ă  V. Chaque sommet dans V sur ce chemin, sauf le dernier, est un sommet non libre. Ainsi, la mise Ă  jour du couplage pour ces sommets dans V aux sommets correspondants dans U Ă©quivaut Ă  supprimer l'arĂȘte prĂ©cĂ©demment couplĂ©e et d'ajouter une nouvelle arĂȘte libre au couplage. Cela revient Ă  faire la diffĂ©rence symĂ©trique (c'est-Ă -dire supprimer les arĂȘtes communes au couplage prĂ©cĂ©dent et ajouter des arĂȘtes non communes du chemin d'augmentation au nouveau couplage).

On n'a pas Ă  vĂ©rifier explicitement que les chemins d'augmentation sont disjoints : aprĂšs avoir fait la diffĂ©rence symĂ©trique pour un chemin, aucun de ses sommets ne peut ĂȘtre considĂ©rĂ© Ă  nouveau justement parce que Dist[Pair_V[v]] est diffĂ©rent de Dist[u]+1 (puis qu'il est Ă©gal Ă  Dist[u]).

Les deux lignes du pseudo-code :

Dist[u] = ∞
return false

servent dans le cas oĂč il n'y a pas de chemin d'augmentation de longueur minimale Ă  partir d'un sommet donnĂ© ; dans ce cas, DFS retourne la valeur false. Pour marquer qu'il est inutile de visiter ces sommets Ă  nouveau, on pose Dist[u]= ∞.

Enfin, comme dĂ©jĂ  annoncĂ©, on n'a pas explicitement besoin de uDummy ; il sert seulement Ă  mettre les sommets libres de U dans la file au dĂ©marrage de BFS ce que l’on peut aussi bien faire Ă  l'initialisation. Le sommet vDummy peut ĂȘtre ajoutĂ© Ă  V par commoditĂ© (et s'y trouve dans de nombreuses implĂ©mentations) ; il sert Ă  coupler les sommets de V vers vDummy. De cette façon, si le sommet final dans V n'est pas couplĂ© Ă  un sommet dans U alors on termine le chemin d'augmentation en vDummy. Dans le pseudo-code ci-dessus, vDummy est notĂ© NIL.

Notes

  1. Hopcroft et Karp 1973.
  2. Edmonds 1965
  3. Voir par exemple Ahuja, Magnanti et Orlin 1993, Section 12.3 : bipartite cardinality matching problem, p. 469–470.
  4. Maximal signifie qu'aucun chemin ne peut ĂȘtre ajoutĂ©. Cela ne veut pas dire que c'est le nombre maximum de tels chemins, problĂšme qui serait autrement difficile Ă  rĂ©soudre. Heureusement, l'algorithme se contente d'un ensemble maximal.
  5. Mahajan 2010
  6. Gabow et Tarjan 1991 et Blum 2001.
  7. Vazirani 2012.

Bibliographie

  • [1993] Ravindra K. Ahuja, Thomas L. Magnanti et James B. Orlin, Network Flows: Theory, Algorithms and Applications, Prentice-Hall, .
  • [1991] Helmut Alt, Norbert Blum, Kurt Mehlhorn et Manfred Paul, « Computing a maximum cardinality matching in a bipartite graph in time », Information Processing Letters, vol. 37, no 4,‎ , p. 237–240 (DOI 10.1016/0020-0190(91)90195-N).
  • [2006] Holger Bast, Kurt Mehlhorn, Guido Schafer et Hisao Tamaki, « Matching algorithms are fast in sparse random graphs », Theory of Computing Systems, vol. 39, no 1,‎ , p. 3–14 (DOI 10.1007/s00224-005-1254-y).
  • Norbert Blum, « A Simplified Realization of the Hopcroft-Karp Approach to Maximum Matching in General Graphs », Tech. Rep. 85232-CS, Computer Science Department, Univ. of Bonn,‎ (lire en ligne).
  • JoĂŁo C. Setubal, « Sequential and parallel experimental results with bipartite matching algorithms », Tech. Rep. IC-96-09, Inst. of Computing, Univ. of Campinas,‎ (lire en ligne).
  • Vijay Vazirani, « An Improved Definition of Blossoms and a Simpler Proof of the MV Matching Algorithm », CoRR abs/1210.4594,‎ (arXiv 1210.4594).

Articles connexes

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.