Algoritmo de Karger

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

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]

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

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

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 .

La arista marcada se contrae en un solo nodo

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

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

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

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

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

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

  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.