Algoritmo de Hopcroft-Karp

Algoritmo de Hopcroft-Karp
Lleva el nombre de John Hopcroft y Richard Manning Karp
Autor John Hopcroft , Richard Manning Karp y Alexander V. Karzanov [d]
objetivo Encontrar la coincidencia máxima
Estructura de datos Grafico
peor momento
costo de memoria

El algoritmo de Hopcroft-Karp  es un algoritmo que toma como entrada un gráfico bipartito y devuelve la coincidencia máxima de cardinalidad , es decir, el mayor conjunto de aristas tal que no hay dos que tengan un vértice común. La asintótica del tiempo de ejecución del algoritmo es en el peor de los casos (aquí  está el conjunto de aristas del gráfico, y  es el conjunto de sus vértices). En el caso de gráficos densos , el tiempo de ejecución se limita a , y para un gráfico aleatorio , el algoritmo se ejecuta en un tiempo casi lineal.

El algoritmo fue creado por John Hopcroft y Richard Karp en 1973 [1] . Al igual que los algoritmos creados previamente (como el algoritmo húngaro y el algoritmo del trabajo de Edmonds [2] , el algoritmo de Hopcroft-Karp en un ciclo aumenta la coincidencia encontrando caminos crecientes ( cadenas , cuyos bordes pertenecen alternativamente a la coincidencia y no pertenecen a él, y el primer y último vértice no pertenecen al emparejamiento; al alternar el emparejamiento a lo largo de la cadena, es decir, quitando del emparejamiento los bordes que estaban en la cadena y agregando los que no estaban en ella, puede obtener una coincidencia más grande). En lugar de encontrar una ruta de aumento, el algoritmo encuentra el conjunto máximo de aumentos más cortos. La misma idea se usa en algoritmos más complejos para encontrar coincidencias en gráficos no bipartitos con el mismo tiempo de ejecución asintótica que Hopcroft -Karp. algoritmo.

Descripción de la tarea

El problema de encontrar la coincidencia más grande en un gráfico bipartito se puede describir informalmente de la siguiente manera. Hay un grupo de niños y niñas. Algunos chicos conocen a algunas chicas. Se requiere formar tantas parejas para el baile como sea posible, compuestas por un chico y una chica que se conozcan [3] .

Rutas de aumento

Un vértice que no es el final de ningún borde de una coincidencia se denomina vértice libre (para esa coincidencia). El algoritmo se basa en el concepto de una ruta de aumento  : una ruta que comienza y termina en un vértice libre, y dentro de la ruta, los bordes que pertenecen y no pertenecen a una alternativa coincidente. De la definición se sigue que todos los vértices de tal camino, excepto el primero y el último, deben ser no libres. Un camino de aumento puede constar de dos vértices libres y una arista entre ellos (que no está en el emparejamiento).

Si  es una coincidencia y  es un camino de aumento en , entonces la diferencia simétrica de dos conjuntos de aristas es una coincidencia de tamaño . Por lo tanto, al encontrar rutas de aumento, podemos aumentar el tamaño de la coincidencia.

Por el contrario, que no sea óptimo y que sea una diferencia simétrica , donde  hay un emparejamiento óptimo. Como y  son coincidencias, cada vértice en tiene grado a lo sumo dos. Esto significa que debe formar un conjunto de caminos y ciclos de aumento que no se cortan o caminos en los que hay tantas aristas del emparejamiento como no las hay. La diferencia de tamaño y es el número de rutas de aumento en . Entonces, si hay una coincidencia mayor que la coincidencia actual , también debe haber una ruta de aumento. Si no existe una ruta de aumento, el algoritmo se puede abortar con éxito, ya que debería ser óptimo [4] .

Las rutas de aumento en los problemas de coincidencia están estrechamente relacionadas con las rutas de aumento en los problemas de flujo máximo , rutas a lo largo de las cuales se puede aumentar el flujo entre la fuente y el sumidero. Puede reducir el problema de encontrar la coincidencia más grande al problema de encontrar el flujo máximo [5] . La técnica utilizada en el algoritmo de Hopcroft-Karp se puede generalizar a una red de transporte arbitraria , lo que lleva al algoritmo de Dinitz [6] .

Algoritmo

A continuación se muestra la estructura del algoritmo:

Entrada : gráfico bipartito Salida : Coincidencia ciclo conjunto máximo de rutas de aumento más cortas disjuntas de vértice adiós

Con más detalle, sean y  los conjuntos de vértices del grafo bipartito , y  el conjunto de sus aristas que conectan los vértices de y . El algoritmo, a partir de una coincidencia vacía , la incrementa secuencialmente. En cada fase, el algoritmo hace lo siguiente:

El algoritmo se interrumpe cuando BFS no encuentra ninguna ruta de aumento en ninguna fase (es decir, está vacío).

Análisis

Cada fase consta de un BFS y un DFS, por lo que una fase se ejecuta en . Por tanto, las primeras fases en un grafo con vértices y aristas tienen un coste . Se puede demostrar que cada fase aumenta la longitud del camino de alargamiento más corto en al menos 1: la fase encuentra el conjunto máximo de caminos complementarios de una longitud dada, por lo que cualquier camino restante debe ser más largo. Por lo tanto, después de que se hayan completado las primeras fases del algoritmo, la ruta de aumento restante más corta tiene una longitud de al menos . Sin embargo, la diferencia simétrica entre la coincidencia óptima y la coincidencia actual encontrada en fases anteriores forma un conjunto de caminos de aumento disjuntos de vértice y ciclos alternos. Si cada ruta tiene una longitud de al menos , puede haber como máximo rutas, y el tamaño de una coincidencia óptima puede diferir del tamaño en como máximo . Dado que cada fase del algoritmo aumenta el tamaño de la coincidencia en al menos 1, no pueden ocurrir más fases.

Dado que el algoritmo tiene fases en el peor de los casos, el tiempo de ejecución total es en el peor de los casos [1] .

Sin embargo, en muchos casos, el algoritmo puede ser mucho más rápido de lo que dice la estimación del peor de los casos. Por ejemplo, en el caso de un grafo aleatorio bipartito disperso , se demostró en 2006 [7] (mejorando el resultado anterior [8] ) que, con una alta probabilidad, todos los emparejamientos no óptimos tienen caminos crecientes de longitud logarítmica . Como consecuencia, para dichos gráficos, el número de iteraciones y el tiempo de ejecución del algoritmo es .

Comparación con otros algoritmos para encontrar la coincidencia máxima

Para gráficos dispersos, el algoritmo Hopcroft-Karp tiene el mejor comportamiento asintótico en el peor de los casos de todos los algoritmos conocidos, pero para gráficos densos, el algoritmo más nuevo [9] tiene un límite ligeramente mejor . Este algoritmo se basa en el algoritmo de empuje de preflujo y, cuando la coincidencia se vuelve casi óptima, cambia al método Hopcroft-Karp.

Varios autores han llevado a cabo una comparación experimental de algoritmos para encontrar la coincidencia máxima. Sus resultados mostraron que, en general, el algoritmo de Hopcroft-Karp no es tan bueno en la práctica como en la teoría: es superado por estrategias BFS y DFS simples para encontrar una ruta de aumento y algoritmos basados ​​en el método de empuje de preflujo [10] .

Grafos no bipartitos

La misma idea de encontrar el conjunto máximo de rutas de aumento más cortas también funciona para encontrar coincidencias de cardinalidad máxima en gráficos no bipartitos, y por las mismas razones que el algoritmo tendrá en la mayoría de las fases. Sin embargo, para gráficos no bipartitos, es más difícil encontrar caminos de alargamiento en cada fase. Sobre la base de trabajos anteriores, Micali y Vazirani (1980 ) mostraron cómo ejecutar la fase en tiempo lineal, lo que resultó en un algoritmo con el mismo límite superior que el algoritmo Hopcroft-Karp para gráficos bipartitos. El método de Micali-Vazirani es complejo y los autores no proporcionaron pruebas completas de sus resultados; más tarde , Peterson y Loui (1988 ) publicaron una justificación completa del algoritmo de Micali-Vazirani, y también se han publicado otros algoritmos: Gabow y Tarjan (1991 ) y Blum (2001 ). En 2012, Vazirani propuso una prueba nueva y simplificada del algoritmo de Micali: Vazirani [11] .

Pseudocódigo

A continuación se muestra el pseudocódigo del algoritmo, cercano a la implementación en Java [12] .

/* GRAMO = U ∪ V ∪ {NIL} donde U y V son la partición del gráfico y NIL es un vértice nulo especial */ función BFS() para ti en ti si Par_U[u] == NIL Dist[u] = 0 En cola (Q, u) más Dist[u] = ∞ Dist[NIL] = ∞ while Vacío(Q) == falso u = Desencolar(Q) si Dist[u] < Dist[NIL] para cada v en Adj[u] si Dist[ Par_V[v] ] == ∞ Dist[ Par_V[v] ] = Dist[u] + 1 Poner en cola(Q,Pair_V[v]) devuelve Dist[NIL] != ∞ función DFS(u) si tu != NIL para cada v en Adj[u] si Dist[ Pair_V[v] ] == Dist[u] + 1 si DFS (Par_V [v]) == verdadero Par_V[v] = u Par_U[u] = v volver verdadero Dist[u] = ∞ falso retorno volver verdadero función Hopcroft-Karp por cada tu en ti Par_U[u] = NIL para cada v en V Par_V[v] = NIL coincidencia = 0 mientras que BFS() == verdadero por cada tu en ti si Par_U[u] == NIL si DFS(u) == verdadero coincidencia = coincidencia + 1 volver a coincidir

Explicaciones

Deje que el gráfico consista en partes de U y V. La idea clave es agregar dos vértices ficticios en cada lado del gráfico: uDummy conectado a todos los vértices descubiertos de U, y vDummy conectado a todos los vértices descubiertos de V. Ahora, si ejecutamos BFS de uDummy en vDummy, obtenemos la ruta más corta entre un vértice descubierto de U y un vértice descubierto de V. Debido al gráfico bipartito, la ruta alternará entre U y V. Sin embargo, debemos asegurarnos de que al pasar de V a U, siempre elegimos un borde de la coincidencia. Si no quedan vértices coincidentes, terminamos en vDummy. Según este criterio en el proceso BFS, al final obtenemos la ruta de aumento más corta.

Una vez que se ha encontrado la ruta de aumento más corta, se deben ignorar todas las rutas que sean más largas. BFS marca los vértices cuya distancia a la fuente es 0. Después de ejecutar BFS, podemos, partiendo de cada vértice de U que no está en el emparejamiento, ir por el camino en el que la distancia al siguiente vértice es mayor que la distancia al siguiente vértice. anterior por 1. Si terminamos llegamos a vDummy, cuya distancia es 1 más que la distancia a uno de los vértices de V, al que se puede llegar por uno de los caminos más cortos. En este caso, podemos continuar y actualizar la coincidencia de los vértices en el camino. Tenga en cuenta que cada vértice V en la ruta, excepto el último, ya está en una coincidencia. Por lo tanto, actualizar una coincidencia es equivalente a una diferencia simétrica (es decir, eliminar los bordes de la ruta que estaban en la coincidencia y agregar los que no lo estaban).

¿Cómo asegurarse de que las rutas de aumento no se crucen en los vértices? Esto ya está proporcionado. Después de realizar la diferencia simétrica, ninguno de los vértices del camino será considerado nuevamente, ya que Dist[ Pair_V[v] ] no será igual a Dist[u] + 1 (será exactamente Dist[u]).

¿Por qué son necesarias las siguientes líneas?

Dist[u] = ∞ falso retorno

Cuando no podemos encontrar ninguna ruta de aumento más corta desde u, DFS devuelve False. En este caso, será bueno marcar estos vértices para no volver a visitarlos. Para marcarlos, simplemente establecemos Dist[u] en infinito.

No necesitamos uDummy porque solo está ahí para agregar todos los vértices que no coinciden a la cola BFS. Esto se puede hacer con una simple inicialización. vDummy se puede agregar a U por conveniencia en muchas implementaciones, y la coincidencia de todos los vértices en V se puede inicializar con un puntero a vDummy. Entonces, si, después de todo, el último vértice de U no coincide con ningún vértice de V, entonces el último vértice de nuestro camino de extensión será vDummy. En el pseudocódigo anterior, vDummy se denota como Nil.

Véase también

Notas

  1. 1 2 Hopcroft y Karp (1973 )
  2. Edmonds (1965 )
  3. Algoritmos para encontrar la coincidencia máxima en un gráfico bipartito . Archivado desde el original el 19 de enero de 2017.
  4. Edmonds, 1965 , pág. 453.
  5. Ahuja, Magnanti & Orlin (1993 ), sección 12.3, problema de coincidencia de cardinalidad bipartita, págs. 469-470.
  6. Yefim Dinitz. Algoritmo de Dinitz: la versión original y la versión de Even // Informática teórica: Ensayos en memoria de Shimon Even (inglés) / ed. Oded Goldreich, Arnold L. Rosenberg y Alan L. Selman. - Springer, 2006. - Pág. 218-240. ISBN 978-3540328803 .  
  7. Bast et al. (2006 )
  8. Motwani (1994 )
  9. Alt et al. (1991 )
  10. Chang y McCormick (1990 ); Darby-Dowman (1980 ); Setúbal (1993 ); Setúbal (1996 ).
  11. Vazirani (2012 )
  12. Programa Java para implementar el algoritmo Hopcroft - Sanfoundry  , Sanfoundry (  20 de noviembre de 2013). Archivado desde el original el 7 de abril de 2017. Consultado el 6 de abril de 2017.

Literatura