Algoritmo de Karger

Summary

En ciencias de la computación y teoría de grafos, el algoritmo de Karger es un procedimiento probabilista para calcular un corte mínimo de un grafo conexo. Fue ideado por David Karger y publicado por primera vez en 1993.[1]

Un grafo y dos de sus cortes. La línea punteada en rojo representa un corte con tres aristas que se cruzan. La línea discontinua en verde representa un corte mínimo de este grafo, que cruza solo dos aristas

La idea del algoritmo se basa en el concepto de contracción de una arista en un grafo no dirigido . Informalmente, la contracción de una arista fusiona los nodos y en uno, reduciendo el número total de nodos del grafo en uno. Todas las demás aristas que conectan o se reunirán al nodo fusionado, produciendo efectivamente un multigrafo. El algoritmo básico de Karger contrae iterativamente aristas elegidas aleatoriamente hasta que solo quedan dos nodos. Estos nodos representan un corte en el grafo original. Al iterar este algoritmo básico un número suficiente de veces, se puede encontrar un corte mínimo con alta probabilidad.

El problema del corte mínimo global

editar

Un corte   en un grafo no dirigido   es una partición de los vértices   en dos conjuntos no vacíos y disjuntos  . El conjunto de cortes de un corte consiste en las aristas   entre las dos partes. El tamaño (o peso) de un corte en un grafo no ponderado es la cardinalidad del conjunto de cortes, es decir, el número de aristas entre las dos partes.

 

Existen   maneras para determinar si cada vértice pertenece a   o a  , pero dos de estas opciones hacen que   o   sean intersecciones vacías y no generan cortes. Entre las opciones restantes, intercambiar los roles de   y   no altera el corte, por lo que cada corte se cuenta dos veces; por lo tanto, hay   cortes distintos. El problema del corte mínimo consiste en encontrar el corte de menor tamaño entre estos cortes.

Para grafos ponderados con pesos de arista positivos  , el peso del corte es la suma de los pesos de las aristas entre los vértices de cada parte

 

lo que concuerda con la definición no ponderada de  .

Un corte a veces se denomina corte global para distinguirlo de un corte  -  para un par de vértices dado, que tiene el requisito adicional de que   y  . Todo corte global es un corte  -  para algún  . Por lo tanto, el problema del corte mínimo se puede resolver en tiempo polinómico iterando sobre todas las opciones de   y resolviendo el problema de corte mínimo resultante  -  utilizando el teorema de flujo máximo y corte mínimo y un algoritmo de tiempo polinómico para el flujo máximo, como el algoritmo de inserción y reetiquetado, aunque este enfoque no es óptimo. Entre los mejores algoritmos deterministas para el problema de corte mínimo global se encuentra el algoritmo de Stoer-Wagner, cuyo tiempo de ejecución es  .[2]

Algoritmo de contracción

editar

La operación fundamental del algoritmo de Karger es una variante de la contracción de aristas. El resultado de contraer la arista   es un nuevo nodo  . Cada arista   o   para   hasta los extremos de la arista contraída se reemplaza por una arista   hasta el nuevo nodo. Finalmente, se eliminan los nodos contraídos   y   con todas sus aristas incidentes. En particular, el grafo resultante no contiene bucles propios. El resultado de contraer la arista   se denota como  .

 

El algoritmo de contracción contrae repetidamente aristas aleatorias en el grafo hasta que solo quedan dos nodos, momento en el cual solo hay un corte.

La idea clave del algoritmo es que es mucho más probable que las aristas que no son de corte mínimo se seleccionen aleatoriamente y se pierdan por contracción, ya que las aristas con corte mínimo suelen ser ampliamente superadas en número por las aristas que no son de corte mínimo. Posteriormente, es plausible que las aristas con corte mínimo sobrevivan a toda la contracción de aristas, y el algoritmo identificará correctamente la arista con corte mínimo.

 
Ejecución exitosa del algoritmo de Karger en un grafo de 10 vértices. El corte mínimo tiene un tamaño de 3
   procedimiento contraer( ):
   mientras  
        elegir   uniformemente al azar
         
   devolver el único corte en  

Cuando el grafo se representa utilizando una lista de adyacencia o una matriz de adyacencia, se puede utilizar una sola operación de contracción de aristas con un número lineal de actualizaciones a la estructura de datos, para un tiempo de ejecución total de  . Alternativamente, el procedimiento puede considerarse como una ejecución del algoritmo de Kruskal para construir el árbol recubridor mínimo en un grafo donde las aristas tienen pesos   según una permutación aleatoria  . Eliminar la arista más pesada de este árbol da como resultado dos componentes que describen un corte. De esta manera, el procedimiento de contracción se puede disponer como el algoritmo de Kruskal en el tiempo  .

 
Las elecciones aleatorias de aristas en el algoritmo de Karger corresponden a una ejecución del algoritmo de Kruskal en un gráfico con rangos de aristas aleatorios hasta que solo quedan dos componentes

Los desarrollos más conocidos utilizan   tiempo y espacio de memoria, o   tiempo y   espacio, respectivamente.[1]

Probabilidad de éxito del algoritmo de contracción

editar

En un grafo   con   vértices, el algoritmo de contracción devuelve un corte mínimo con una probabilidad polinómicomente pequeña,  . Debe recordarse que todo grafo tiene   cortes (según lo explicado en la sección anterior), entre los cuales   pueden ser, como máximo, cortes mínimos. Por lo tanto, la probabilidad de éxito de este algoritmo es mucho mejor que la probabilidad de elegir un corte al azar, que es, como máximo,  .

Por ejemplo, un grafo ciclo con   vértices tiene exactamente   cortes mínimos, dados por cada elección de 2 aristas. El procedimiento de contracción encuentra cada uno de estos con la misma probabilidad.

Para establecer con mayor precisión el límite inferior de la probabilidad de éxito, sea   el conjunto de las aristas con un corte mínimo específico de tamaño  . El algoritmo de contracción devuelve   si ninguna de las aristas aleatorias eliminadas por el algoritmo pertenece al conjunto de cortes  . En particular, la primera contracción de arista evita  , lo que ocurre con una probabilidad de  . El grado mínimo de   es al menos   (de lo contrario, un vértice de grado mínimo induciría un corte más pequeño donde una de las dos particiones contiene solo el vértice de grado mínimo), por lo que  . Por lo tanto, la probabilidad de que el algoritmo de contracción elija una arista de   es:

 

La probabilidad   de que el algoritmo de contracción en un grafo de  -vértices evite   satisface la recurrencia  , con  , que puede expandirse como:

 

Repetición del algoritmo de contracción

editar
 
10 repeticiones del procedimiento de contracción. La quinta repetición determina el corte mínimo de valor 3

Al repetir el algoritmo de contracción   veces con elecciones aleatorias independientes y obtener el corte más pequeño, la probabilidad de no encontrar un corte mínimo es:

 

El tiempo total de ejecución para   repeticiones para un grafo con   vértices y   aristas es  .

Algoritmo de Karger-Stein

editar

Una extensión del algoritmo de Karger, debida a David Karger y a Clifford Stein, logra una mejora de un orden de magnitud.[3]

La idea básica es realizar el procedimiento de contracción hasta que el grafo alcance   vértices.

   procedimiento contrato( ,  ):
   mientras  
       elegir   uniformemente al azar
        
   devolver  

La probabilidad   de que este procedimiento de contracción evite un corte específico   en un grafo de  -vértices es:

 

Esta expresión es aproximadamente   y se vuelve menor que   alrededor de  . En particular, la probabilidad de que una arista de   se contraiga aumenta hacia el final. Esto motiva la idea de cambiar a un algoritmo más lento después de un cierto número de pasos de contracción.

   procedimiento fastmincut( ):
   si  :
       devolver contrato( ,  )
   de lo contrario:
        
         contrato( ,  )
         contrato( ,  )
       devolver minfastmincut( ), fastmincut( )

Análisis

editar

El parámetro de contracción   se elige de modo que cada llamada a la contracción tenga una probabilidad de al menos la mitad de éxito (es decir, de evitar la contracción de una arista de un conjunto de corte específico  ). Esto permite modelar la parte exitosa del árbol de recursión como un árbol binario aleatorio generado por un proceso de Galton-Watson crítico, y analizarlo en consecuencia.[3]

La probabilidad   de que este árbol aleatorio de llamadas exitosas contenga una ruta lo suficientemente larga como para llegar a la base de la recursión y encontrar   viene dada por la relación de recurrencia

 

con solución  . El tiempo de ejecución del corte rápido mínimo satisface que

 

con solución  . Para alcanzar la probabilidad de error  , el algoritmo puede repetirse   veces, para un tiempo de ejecución total de  . Esto supone una mejora de un orden de magnitud con respecto al algoritmo original de Karger.[3]

Límite de mejora

editar

Para determinar un corte mínimo, se debe tocar cada arista del grafo al menos una vez, lo que equivale a un tiempo   en un grafo denso. El algoritmo de corte mínimo de Karger-Stein requiere un tiempo de ejecución de  , que es muy cercano a este.

Referencias

editar
  1. a b Karger, David (1993). «Global Min-cuts in RNC and Other Ramifications of a Simple Mincut Algorithm». Proc. 4th Annual ACM-SIAM Symposium on Discrete Algorithms. 
  2. Stoer, M.; Wagner, F. (1997). «A simple min-cut algorithm». Journal of the ACM 44 (4): 585. S2CID 15220291. doi:10.1145/263867.263872. 
  3. a b c Karger, David R.; Stein, Clifford (1996). «A new approach to the minimum cut problem». Journal of the ACM 43 (4): 601. S2CID 5385337. doi:10.1145/234533.234534. 
  •   Datos: Q4924414