En ciencias de la computación , el algoritmo de Edmonds-Karp es una implementación del método de Ford-Fulkerson para calcular el flujo máximo en una red de flujo entiempo. El algoritmo fue publicado por primera vez por Yefim Dinitz en 1970, [ 1 ] [ 2 ] y publicado independientemente por Jack Edmonds y Richard Karp en 1972. [ 3 ] El algoritmo de Dinitz incluye técnicas adicionales que reducen el tiempo de ejecución a. [ 2 ]
Algoritmo
El algoritmo es idéntico al algoritmo de Ford-Fulkerson , excepto que se define el orden de búsqueda al encontrar el camino de aumento . El camino encontrado debe ser el camino más corto que tenga capacidad disponible. Esto se puede encontrar mediante una búsqueda en anchura , donde aplicamos un peso de 1 a cada arista. El tiempo de ejecución dese encuentra demostrando que cada camino de aumento se puede encontrar entiempo, que cada vez que al menos uno de los bordes E se satura (un borde que tiene el flujo máximo posible), que la distancia desde el borde saturado hasta la fuente a lo largo de la trayectoria de aumento debe ser mayor que la última vez que se saturó, y que la longitud es como máximoOtra propiedad de este algoritmo es que la longitud del camino de aumento más corto aumenta monótonamente. [ 4 ] Un esquema de demostración que utiliza estas propiedades es el siguiente:
La demostración establece primero que la distancia del camino más corto desde el nodo fuente s a cualquier nodo que no sea sumidero v en una red de flujo residual aumenta monótonamente después de cada iteración de aumento (Lema 1, demostrado a continuación). Luego, muestra que cada uno de losLos bordes pueden ser críticos en la mayoría de los casos.veces durante la duración del algoritmo, lo que proporciona un límite superior deaumentando las iteraciones. Dado que cada iteración toma tiempo (limitado por el tiempo para encontrar el camino más corto usando la búsqueda en anchura), el tiempo total de ejecución de Edmonds-Karp essegún sea necesario. [ 4 ]
Para demostrar el Lema 1, se puede utilizar la demostración por contradicción asumiendo que existe una iteración de aumento que provoca que la distancia del camino más corto de s a v disminuya . Sea f el flujo antes de dicho aumento ySea el flujo posterior. Denotemos la distancia mínima en una red de flujo residual .desde nodoscomoSe puede derivar una contradicción demostrando que, lo que significa que la distancia del camino más corto entre el nodo fuente s y el nodo no sumidero v no disminuyó de hecho. [ 4 ]
Pseudocódigo
El algoritmo EdmondsKarp es la entrada : grafo (graph[v] debe ser la lista de aristas que salen del vértice v en el grafo original y sus correspondientes aristas inversas construidas que se utilizan para el flujo de retroceso. Cada arista debe tener una capacidad 'cap', flujo, origen 's' y destino 't' como parámetros, así como un puntero a la arista inversa 'rev'). s (Vértice de origen) t (Vértice de destino) salida : caudal (valor del caudal máximo) flujo := 0 (Inicializa el flujo a cero) repetir (Ejecuta una búsqueda en anchura (bfs) para encontrar el camino st más corto. Usamos 'pred' para almacenar la arista tomada para llegar a cada vértice, de modo que podamos recuperar el camino posteriormente) q := cola () q.push(s) pred := array (graph.length) mientras no esté vacío(q) y pred[t] = null cur := q.pop() para cada arista e en graph[cur] hacer si pred[et] = null y et ≠ s y e.cap > e.flow entonces pred[et] := e q.push(et) Si no (pred[t] = null) entonces (Encontramos una ruta de aumento. Veamos cuánto flujo podemos enviar) df := ∞ para (e := pred[t]; e ≠ null; e := pred[es]) hacer df := min (df, e.cap - e.flow) (Y actualizamos las aristas por esa cantidad) para (e := pred[t]; e ≠ null; e := pred[es]) hacer flujo.e := flujo.e + df flujo de e.rev. := flujo de e.rev. - df flujo := flujo + df hasta que pred[t] = null (es decir, hasta que no se encontró ninguna ruta de aumento) flujo de retorno
Ejemplo
Dada una red de siete nodos, con fuente A, sumidero G y capacidades como se muestra a continuación:
![]()
En parejasescrito en los bordes,es el flujo actual, yes la capacidad. La capacidad residual deaes, la capacidad total, menos el flujo que ya se utiliza. Si el flujo neto deaes negativo, contribuye a la capacidad residual.
Observe cómo la longitud del camino de aumento encontrado por el algoritmo (en rojo) nunca disminuye. Los caminos encontrados son los más cortos posibles. El flujo encontrado es igual a la capacidad a través del corte mínimo en el grafo que separa la fuente y el sumidero. Solo hay un corte mínimo en este grafo, que divide los nodos en los conjuntos.y, con la capacidad
Notas
- ↑ Dinic, EA (1970). "Algoritmo para la solución de un problema de flujo máximo en una red con estimación de potencia". Matemáticas Soviéticas - Doklady . 11 . Doklady: 1277– 1280.
- 1 2 Yefim Dinitz (2006). "El algoritmo de Dinitz: la versión original y la versión de Even" (PDF) . En Oded Goldreich ; Arnold L. Rosenberg; Alan L. Selman (eds.). Informática teórica: ensayos en memoria de Shimon Even . Springer. pp. 218–240 . ISBN 978-3-540-32880-3.
- ↑ Edmonds, Jack ; Karp, Richard M. (1972). "Mejoras teóricas en la eficiencia algorítmica para problemas de flujo de red" (PDF) . Journal of the ACM . 19 (2): 248– 264. doi : 10.1145/321694.321699 . S2CID 6375478 .
- ^ Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest y Clifford Stein (2009). "26,2". Introducción a los algoritmos (tercera ed.). Prensa del MIT. págs. 727–730 . ISBN 978-0-262-03384-8.
{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace )
Referencias
- Algoritmos y complejidad (véanse las páginas 63-69). https://web.archive.org/web/20061005083406/http://www.cis.upenn.edu/~wilf/AlgComp3.html
- Problema de flujo de red
- Algoritmos de grafos