En informática , el algoritmo de Hopcroft-Karp (a veces llamado con mayor precisión algoritmo de Hopcroft-Karp-Karzanov ) [ 1 ] es un algoritmo que toma un grafo bipartito como entrada y produce un emparejamiento de cardinalidad máxima como salida: un conjunto de tantas aristas como sea posible con la propiedad de que no hay dos aristas que compartan un extremo. Se ejecuta entiempo en el peor de los casos , dondees un conjunto de aristas en el grafo,es el conjunto de vértices del grafo, y se supone queEn el caso de grafos densos , el límite de tiempo se convierte eny para grafos aleatorios dispersos se ejecuta en tiempocon alta probabilidad . [ 2 ]
El algoritmo fue descubierto por John Hopcroft y Richard Karp ( 1973 ) e independientemente por Alexander Karzanov ( 1973 ) . [ 3 ] Al igual que en métodos anteriores para emparejamiento, como el algoritmo húngaro y el trabajo de Edmonds (1965) , el algoritmo de Hopcroft-Karp aumenta repetidamente el tamaño de un emparejamiento parcial al encontrar caminos de aumento . Estos caminos son secuencias de aristas del grafo, que alternan entre aristas en el emparejamiento y aristas fuera del emparejamiento parcial, y donde la arista inicial y final no están en el emparejamiento parcial. Encontrar un camino de aumento nos permite incrementar el tamaño del emparejamiento parcial, simplemente intercambiando las aristas del camino de aumento (poniendo en el emparejamiento parcial las que no estaban, y viceversa). Los algoritmos más simples para emparejamiento bipartito, como el algoritmo de Ford-Fulkerson , encuentran un camino de aumento por iteración: el algoritmo de Hopcroft-Karp en cambio encuentra un conjunto máximo de caminos de aumento más cortos, para asegurar que solo Se necesitan iteraciones en lugar deiteraciones. El mismo rendimiento deSe puede lograr encontrar emparejamientos de cardinalidad máxima en grafos arbitrarios, con el algoritmo más complejo de Micali y Vazirani. [ 4 ]
El algoritmo de Hopcroft-Karp puede considerarse un caso especial del algoritmo de Dinic para el problema del flujo máximo . [ 5 ]
Ampliando caminos
Un vértice que no es el punto final de una arista en alguna coincidencia parcialSe denomina vértice libre . El concepto básico en el que se basa el algoritmo es el de una ruta de aumento , una ruta que comienza en un vértice libre, termina en un vértice libre y alterna entre aristas coincidentes y no coincidentes dentro de la ruta. De esta definición se deduce que, excepto los extremos, todos los demás vértices (si los hay) en la ruta de aumento deben ser vértices no libres. Una ruta de aumento podría constar de solo dos vértices (ambos libres) y una única arista no coincidente entre ellos.
Sies una coincidencia, yes una ruta de aumento relativa a, entonces la diferencia simétrica de los dos conjuntos de aristas,, formaría una pareja con el tamañoDe este modo, al encontrar rutas de aumento, un algoritmo puede incrementar el tamaño del emparejamiento.
Por el contrario, supongamos que un emparejamientono es óptimo y dejarsea la diferencia simétricadóndees una coincidencia óptima . Porqueyson ambos emparejamientos, cada vértice tiene grado como máximo 2 en. Entoncesdebe formar una colección de ciclos disjuntos, de caminos con un número igual de aristas coincidentes y no coincidentes en, de aumentar las rutas paray de aumentar las rutas para; pero esto último es imposible porquees óptimo. Ahora, los ciclos y los caminos con igual número de vértices coincidentes y no coincidentes no contribuyen a la diferencia de tamaño entrey, por lo que esta diferencia es igual al número de caminos de aumento paraenPor lo tanto, siempre que exista una coincidenciamayor que el ajuste actual, también debe existir una ruta de aumento. Si no se puede encontrar una ruta de aumento, un algoritmo puede terminar de forma segura, ya que en este casodebe ser óptimo.
Un camino de aumento en un problema de emparejamiento está estrechamente relacionado con los caminos de aumento que surgen en los problemas de flujo máximo , caminos a lo largo de los cuales se puede aumentar la cantidad de flujo entre los terminales del flujo. Es posible transformar el problema de emparejamiento bipartito en una instancia de flujo máximo, de modo que los caminos alternados del problema de emparejamiento se conviertan en caminos de aumento del problema de flujo. Basta con insertar dos vértices, origen y sumidero, e insertar aristas de capacidad unitaria desde el origen a cada vértice eny desde cada vértice enal fregadero; y deje que los bordes deatienen capacidad unitaria. [ 6 ] Una generalización de la técnica utilizada en el algoritmo de Hopcroft-Karp para encontrar el flujo máximo en una red arbitraria se conoce como el algoritmo de Dinic .
Algoritmo
El algoritmo puede expresarse en el siguiente pseudocódigo .
- Entrada : Grafo bipartito
- Salida : Coincidencia
- repetir
- Conjunto máximo de caminos de aumento más cortos disjuntos en vértices
- hasta
En más detalle, deje queysean los dos conjuntos en la bipartición dey deje que la coincidencia deaen cualquier momento ser representado como el conjuntoEl algoritmo se ejecuta en fases. Cada fase consta de los siguientes pasos.
- Una búsqueda en anchura divide los vértices del grafo en capas.
- Los vértices libres ense utilizan como vértices iniciales de esta búsqueda y forman la primera capa de la partición. En el primer nivel de la búsqueda, solo hay aristas sin emparejar, ya que los vértices libres enPor definición, no son adyacentes a ningún borde coincidente.
- En los niveles subsiguientes de la búsqueda, se requiere que los bordes recorridos alternen entre coincidentes y no coincidentes. Es decir, al buscar sucesores desde un vértice en, solo se pueden recorrer los bordes no coincidentes, mientras que desde un vértice enSolo se pueden recorrer las aristas coincidentes.
- La búsqueda finaliza en la primera capa.donde uno o más vértices libres ense alcanzan.
- Debido a que cada ruta que llega a un nodo coincidente procede inmediatamente a su pareja en la coincidencia, algunas implementaciones asignan la misma profundidad a ambos vértices, incrementando la profundidad solo cuando se recorre una arista no coincidente.
- Todos los vértices libres enen la capase recopilan en un conjunto. Es decir, un vérticese pone ensi y solo si finaliza un camino de aumento más corto.
- El algoritmo encuentra un conjunto máximo de caminos de aumento disjuntos de vértices de longitud( Máximo significa que no se pueden añadir más caminos de este tipo. Esto es diferente de encontrar el número máximo de dichos caminos, lo cual sería más difícil. Afortunadamente, en este caso basta con encontrar un conjunto máximo de caminos).
- Este conjunto se puede calcular mediante búsqueda en profundidad (DFS) a partir dea los vértices libres en, utilizando el método de capas de búsqueda en amplitud para guiar la búsqueda: el DFS solo puede seguir aristas que conduzcan a un vértice no utilizado en la capa anterior, y las rutas en el árbol DFS deben alternar entre aristas coincidentes y no coincidentes.
- Una vez que se encuentra un camino de aumento entre uno de los vértices eny los vértices libres en, el DFS continúa desde el siguiente vértice de inicio.
- Cualquier vértice encontrado durante la DFS puede marcarse inmediatamente como usado, ya que si la DFS tiene éxito se utilizará, mientras que si la DFS no tiene éxito (no hay ruta desde él a un vértice libre ena través de los vértices restantes no utilizados), entonces no tiene sentido explorar más allá de ese vértice en ningún punto posterior en el DFS. Esto garantizatiempo de ejecución para el DFS.
- También es posible trabajar en la otra dirección, desde vértices libres ena aquellos en, que es la variante utilizada en el pseudocódigo que aparece a continuación .
- Cada uno de los caminos encontrados de esta manera se utiliza para ampliar.
El algoritmo finaliza cuando la búsqueda en anchura de una de las fases no encuentra más rutas de aumento.
Análisis
Cada fase consta de una única búsqueda en amplitud y una única búsqueda en profundidad. Por lo tanto, se puede implementar una única fase entiempo. Por lo tanto, el primerofases, en un gráfico convértices ybordes, tómese su tiempo.
Cada fase aumenta la longitud del camino de aumento más corto en al menos uno: la fase encuentra un conjunto máximo de caminos de aumento de la longitud dada, por lo que cualquier camino de aumento restante debe ser más largo. Por lo tanto, una vez que el inicialLas fases del algoritmo se han completado, el camino de aumento restante más corto tiene al menosaristas en él. Sin embargo, la diferencia simétrica del emparejamiento óptimo final y del emparejamiento parcial M encontrado por las fases iniciales forma una colección de caminos de aumento disjuntos en vértices y ciclos alternados. Si cada uno de los caminos en esta colección tiene una longitud al menos, puede haber como máximorutas en la colección, y el tamaño de la coincidencia óptima puede diferir del tamaño depor como máximobordes. Dado que cada fase del algoritmo aumenta el tamaño del emparejamiento en al menos uno, puede haber como máximofases adicionales antes de que finalice el algoritmo.
Dado que el algoritmo realiza un total de como máximofases, toma un tiempo total deen el peor de los casos.
En muchos casos, sin embargo, el tiempo que tarda el algoritmo puede ser incluso más rápido de lo que indica este análisis del peor caso. Por ejemplo, en el caso promedio para grafos aleatorios bipartitos dispersos , Bast et al. (2006) (mejorando un resultado anterior de Motwani 1994 ) demostraron que con alta probabilidad todos los emparejamientos no óptimos tienen caminos de aumento de longitud logarítmica . Como consecuencia, para estos grafos, el algoritmo de Hopcroft-Karp tardafases ytiempo total.
Comparación con otros algoritmos de emparejamiento bipartito
Para grafos dispersos , el algoritmo de Hopcroft-Karp sigue teniendo el mejor rendimiento conocido en el peor de los casos, pero para grafos densos () un algoritmo más reciente de Alt et al. (1991) logra un límite de tiempo ligeramente mejor,Su algoritmo se basa en el uso de un algoritmo de flujo máximo de reetiquetado y, cuando la correspondencia creada por este algoritmo se acerca al óptimo, se cambia al método de Hopcroft-Karp.
Varios autores han realizado comparaciones experimentales de algoritmos de emparejamiento bipartito. Sus resultados, en general, tienden a mostrar que el método de Hopcroft-Karp no es tan bueno en la práctica como en la teoría: es superado tanto por estrategias más simples de búsqueda en amplitud y en profundidad para encontrar caminos de aumento, como por técnicas de reetiquetado. [ 7 ]
Grafos no bipartitos
La misma idea de encontrar un conjunto máximo de caminos de aumento más cortos también funciona para encontrar emparejamientos de cardinalidad máxima en grafos no bipartitos, y por las mismas razones los algoritmos basados en esta idea tomanfases. Sin embargo, para grafos no bipartitos, la tarea de encontrar los caminos de aumento dentro de cada fase es más difícil. Basándose en el trabajo de varios predecesores más lentos, Micali y Vazirani (1980) mostraron cómo implementar una fase en tiempo lineal, lo que resultó en un algoritmo de emparejamiento no bipartito con el mismo límite de tiempo que el algoritmo de Hopcroft-Karp para grafos bipartitos. La técnica de Micali-Vazirani es compleja, y sus autores no proporcionaron pruebas completas de sus resultados; posteriormente, Peterson y Loui (1988) publicaron una "exposición clara" y otros autores describieron métodos alternativos. [ 8 ] En 2012, Vazirani ofreció una nueva prueba simplificada del algoritmo de Micali-Vazirani. [ 9 ]
Pseudocódigo
/* G = U ∪ V ∪ {NIL} donde U y V son los lados izquierdo y derecho del grafo bipartito y NIL es un vértice nulo especial */ La función BFS() es para cada u en U hacer si Pair_U[u] = NIL entonces Dist[u] := 0 Encolar(Q, u) demás Dist[u] := ∞ Dist[NIL] := ∞ mientras Empty(Q) = falso hacer u := Dequeue(Q) Si Dist[u] < Dist[NIL] entonces para cada v en Adj[u] hacer si Dist[Pair_V[v]] = ∞ entonces Dist[Pair_V[v]] := Dist[u] + 1 Encolar(Q, Par_V[v]) devolver Dist[NIL] ≠ ∞ La función DFS(u) es si u ≠ NIL entonces para cada v en Adj[u] hacer si Dist[Pair_V[v]] = Dist[u] + 1 entonces si DFS(Pair_V[v]) = verdadero entonces Par_V[v] := u Par_U[u] := v devolver verdadero Dist[u] := ∞ devolver falso devolver verdadero La función Hopcroft-Karp es para cada u en U hacer Pair_U[u] := NIL para cada v en V hacer Pair_V[v] := NIL coincidencia := 0 mientras BFS() = verdadero hacer para cada u en U hacer si Pair_U[u] = NIL entonces si DFS(u) = verdadero entonces coincidencia := coincidencia + 1 coincidencia de retorno
Explicación
Sea que los vértices de nuestro grafo estén particionados en Uy V, y consideremos un emparejamiento parcial, como lo indican las tablas y que contienen el único vértice con el que se empareja cada vértice de Pair_Uy de , o para los vértices no emparejados. La idea clave es agregar dos vértices ficticios en cada lado del grafo: uDummy conectado a todos los vértices no emparejados en y vDummy conectado a todos los vértices no emparejados en . Ahora, si ejecutamos una búsqueda en anchura (BFS) desde uDummy hasta vDummy, podemos obtener los caminos de longitud mínima que conectan los vértices actualmente no emparejados en con los vértices actualmente no emparejados en . Nótese que, como el grafo es bipartito, estos caminos siempre alternan entre vértices en y vértices en , y requerimos en nuestra BFS que al ir de a , siempre seleccionemos una arista emparejada. Si llegamos a un vértice no emparejado de , entonces terminamos en vDummy y la búsqueda de caminos en la BFS termina. En resumen, el BFS comienza en los vértices no emparejados en , va a todos sus vecinos en , si todos están emparejados, entonces regresa a los vértices en con los que todos estos vértices están emparejados (y que no fueron visitados antes), luego va a todos los vecinos de estos vértices, etc., hasta que uno de los vértices alcanzados en no esté emparejado.Pair_VUVNILUVUVUVVUVUVUV
Obsérvese en particular que BFS marca los nodos no coincidentes de Ucon distancia 0, y luego incrementa la distancia cada vez que regresa a U. Esto garantiza que los caminos considerados en BFS tengan la longitud mínima para conectar vértices no coincidentes de Ucon vértices no coincidentes de Vmientras siempre regresa de Va Uen aristas que actualmente forman parte del emparejamiento. En particular, al NILvértice especial, que corresponde a vDummy, se le asigna una distancia finita, por lo que la función BFS devuelve verdadero si y solo si se ha encontrado algún camino. Si no se ha encontrado ningún camino, entonces no quedan caminos de aumento y el emparejamiento es máximo.
Si BFS devuelve verdadero, podemos proceder a actualizar el emparejamiento de vértices en los caminos de longitud mínima encontrados desde Uhasta V: lo hacemos usando una búsqueda en profundidad (DFS). Nótese que cada vértice en Ven dicho camino, excepto el último, está actualmente emparejado. Por lo tanto, podemos explorar con DFS, asegurándonos de que los caminos que seguimos correspondan a las distancias calculadas en BFS. Actualizamos a lo largo de cada uno de dichos caminos eliminando del emparejamiento todos los bordes del camino que actualmente están en el emparejamiento, y agregando al emparejamiento todos los bordes del camino que actualmente están en el emparejamiento: como este es un camino de aumento (el primer y último borde del camino no formaban parte del emparejamiento, y el camino alternaba entre bordes emparejados y no emparejados), entonces esto aumenta el número de bordes en el emparejamiento. Esto es lo mismo que reemplazar el emparejamiento actual por la diferencia simétrica entre el emparejamiento actual y todo el camino.
Tenga en cuenta que el código garantiza que todos los caminos de aumento que consideramos sean disjuntos en vértices. De hecho, después de hacer la diferencia simétrica para un camino, ninguno de sus vértices podría considerarse nuevamente en el DFS, simplemente porque Dist[Pair_V[v]]no será igual a Dist[u] + 1(sería exactamente Dist[u]).
Observe también que el DFS no visita el mismo vértice varias veces. Esto se debe a las siguientes líneas:
Dist[u] = ∞ devolver falso
Cuando no pudimos encontrar ningún camino de aumento más corto desde un vértice u, entonces el DFS marca el vértice uestableciéndolo Dist[u]en infinito, de modo que estos vértices no se visiten de nuevo.
Una última observación es que en realidad no necesitamos uDummy: su función es simplemente colocar todos los vértices no coincidentes Uen la cola cuando iniciamos la búsqueda en amplitud (BFS). En cuanto a vDummy, se denota como NILen el pseudocódigo anterior.
Véase también
- Emparejamiento de cardinalidad máxima , el problema resuelto por el algoritmo, y su generalización a grafos no bipartitos.
- Problema de asignación , una generalización de este problema en grafos ponderados , resuelto, por ejemplo, por el algoritmo húngaro.
- Algoritmo de Edmonds-Karp para encontrar el flujo máximo, una generalización del algoritmo de Hopcroft-Karp.
Notas
- ↑ Gabow (2017) ; Annamalai (2018)
- ↑ Bast et al. (2006) .
- ↑ Dinitz (2006) .
- ↑ Peterson y Loui (1988) .
- ↑ Tarjan (1983) , pág. 102.
- ↑ Ahuja, Magnanti y Orlin (1993) , sección 12.3, problema de emparejamiento de cardinalidad bipartita, págs. 469–470.
- ^ Chang y McCormick (1990) ; Darby-Dowman (1980) ; Setúbal (1993) ; Setúbal (1996) .
- ↑ Gabow y Tarjan (1991) .
- ↑ Vazirani (2012)
Referencias
- Ahuja, Ravindra K.; Magnanti , Thomas L.; Orlin , James B. (1993), Flujos de red: teoría, algoritmos y aplicaciones , Prentice-Hall.
- Alt, H.; Blum, N.; Mehlhorn, K. ; Paul, M. (1991), "Cálculo de un emparejamiento de cardinalidad máxima en un grafo bipartito en tiempo", Information Processing Letters , 37 (4): 237– 240, doi : 10.1016/0020-0190(91)90195-N.
- Annamalai, Chidambaram (2018), "Finding perfect matchings in bipartite hypergraphs", Combinatorica , 38 (6): 1285– 1307, arXiv : 1509.07007 , doi : 10.1007/s00493-017-3567-2 , MR 3910876 , S2CID 1997334
- Bast, Holger; Mehlhorn, Kurt; Schäfer, Guido; Tamaki, Hisao (2006), "Los algoritmos de emparejamiento son rápidos en grafos aleatorios dispersos", Theory of Computing Systems , 39 (1): 3–14 , CiteSeerX 10.1.1.395.6643 , doi : 10.1007/s00224-005-1254-y , MR 2189556 , S2CID 9321036
- Chang, S. Frank; McCormick, S. Thomas (1990), Una implementación más rápida de un algoritmo de coincidencia de cardinalidad bipartita , Informe técnico 90-MSC-005, Facultad de Comercio y Administración de Empresas, Universidad de Columbia Británica. Según lo citado por Setúbal (1996) .
- Darby-Dowman, Kenneth (1980), La explotación de la escasez en problemas de programación lineal a gran escala: estructuras de datos y algoritmos de reestructuración , tesis doctoral, Universidad de Brunel.. Según lo citado por Setúbal (1996) .
- Dinitz, Yefim (2006), "El algoritmo de Dinitz: la versión original y la versión de Even", en Goldreich, Oded ; Rosenberg, Arnold L .; Selman, Alan L. (eds.), Theoretical Computer Science: Essays in Memory of Shimon Even (PDF) , Lecture Notes in Computer Science, vol. 3895, Berlín y Heidelberg: Springer, pp. 218–240 , doi : 10.1007/11685654_10 , ISBN 978-3-540-32880-3.
- Edmonds, Jack (1965), "Caminos, árboles y flores", Revista canadiense de matemáticas , 17 : 449–467 , doi : 10.4153/CJM-1965-045-4 , MR 0177907 , S2CID 18909734 .
- Gabow, Harold N. (2017), "El enfoque de emparejamiento ponderado para el emparejamiento de cardinalidad máxima", Fundamenta Informaticae , 154 ( 1–4 ): 109–130 , arXiv : 1703.03998 , doi : 10.3233/FI-2017-1555 , MR 3690573 , S2CID 386509
- Gabow, Harold N.; Tarjan , Robert E. (1991), "Algoritmos de escalado más rápidos para problemas generales de emparejamiento de grafos", Journal of the ACM , 38 (4): 815–853 , doi : 10.1145/115234.115366 , S2CID 18350108 .
- Hopcroft, John E .; Karp, Richard M. (1973), "Un algoritmo n 5/2 para emparejamientos máximos en grafos bipartitos", SIAM Journal on Computing , 2 (4): 225– 231, doi : 10.1137/0202019Anunciado previamente en el 12º Simposio Anual sobre Teoría de Conmutación y Autómatas, 1971.
- Karzanov, AV (1973), "Una estimación exacta de un algoritmo para encontrar un flujo máximo, aplicado al problema de los representantes", Problemas en Cibernética , 5 : 66–70Anunciado previamente en el Seminario de Matemáticas Combinatorias (Moscú, 1971).
- Micali, S .; Vazirani, VV (1980), "UnAlgoritmo para encontrar el emparejamiento máximo en grafos generales", Actas del 21.º Simposio IEEE sobre Fundamentos de la Informática , págs. 17-27 , doi : 10.1109/SFCS.1980.12 , S2CID 27467816 .
- Peterson, Paul A.; Loui, Michael C. (noviembre de 1988), "El algoritmo general de coincidencia máxima de Micali y Vazirani", Algorithmica , 3 ( 1– 4): 511– 533, CiteSeerX 10.1.1.228.9625 , doi : 10.1007/BF01762129 , ISSN 1432-0541 , S2CID 16820 .
- Motwani, Rajeev (1994), "Análisis del caso promedio de algoritmos para emparejamientos y problemas relacionados", Journal of the ACM , 41 (6): 1329– 1356, doi : 10.1145/195613.195663 , S2CID 2968208 .
- Setubal, João C. (1993), "Nuevos resultados experimentales para el emparejamiento bipartito", Proc. Netflow93 , Departamento de Informática, Univ. de Pisa, págs. 211-216 . Según lo citado por Setúbal (1996) .
- Setúbal, João C. (1996), Resultados experimentales secuenciales y paralelos con algoritmos de emparejamiento bipartito , Informe técnico IC-96-09, Instituto de Computación, Universidad de Campinas, CiteSeerX 10.1.1.48.3539 .
- Tarjan, Robert Endre (1983). Estructuras de datos y algoritmos de red . Serie de conferencias regionales CBMS-NSF en matemáticas aplicadas. Sociedad de Matemáticas Industriales y Aplicadas. doi : 10.1137/1.9781611970265 . ISBN 978-0-89871-187-5.
- Vazirani, Vijay (2012), Una definición mejorada de Blossoms y una prueba más simple del algoritmo de emparejamiento MV , CoRR abs/1210.4594, arXiv : 1210.4594 , Bibcode : 2012arXiv1210.4594V.
- Algoritmos de grafos
- Emparejamiento (teoría de grafos)