¿Cuáles son algunos algoritmos de flujo de red interesantes?

Supongo aquí un par de cosas, por algoritmos de flujo de red se entiende algoritmos de flujo máximo st

Otros algoritmos basados ​​en el flujo muy similares son el flujo máximo de todos los pares y el corte mínimo global. El corte máximo de flujo / min de todos los pares encuentra el flujo máximo entre todos los pares st y el corte min global encuentra que el corte mínimo global, que resulta, puede resolverse mucho más fácilmente que el flujo máximo st (corte st min).

Aunque son los algoritmos más representativos, existen muchos otros problemas que se incluyen en la categoría de algoritmos de flujo de red. Una pequeña lista de los problemas más importantes relacionados con los problemas de flujo máximo son

a. Asignaciones y Emparejamientos
si. Cortes mínimos
do. Costo mínimo de circulaciones.
re. Flujos avanzados:
1. Flujos de productos múltiples.
2. Flujos dinámicos.
3. Flujos no divisibles.

Como se mencionó en otra respuesta, los problemas de flujo máximo pueden formularse como un programa lineal y pueden resolverse utilizando solucionadores de LP. Al aplicar LP en lugar de usar la estructura combinatoria del problema para resolverlo de manera más eficiente, estamos siguiendo la ley del instrumento (si tiene un martillo, todo parece clavos :)). Uno de los primeros enfoques para resolver el flujo de red fue usar una variante de la formulación LP llamada algoritmo de red simplex y fue diseñada específicamente para hacer uso de esta estructura. Estos métodos son muy rápidos en la práctica, aunque no necesariamente para grandes casos de problemas difíciles [Goldberg].

Algoritmos para flujo máximo.
Los algoritmos para el flujo máximo se pueden clasificar en dos. El primero basado en la idea de aumentar los caminos. Esta clase de algoritmos intenta encontrar sub soluciones viables en cada paso, y finalmente alcanza el valor óptimo. Entonces, si desea enviar un flujo máximo de s a t, primero encuentra un flujo de s a t y luego intenta aumentar ese flujo hasta lograr una solución óptima.

La segunda clase se esfuerza por la optimización y luego se ajusta para que el flujo sea factible. Los algoritmos de esta clase se denominan algoritmos Push-Relabel o algoritmos Preflow-Push. Entonces, si desea enviar un flujo máximo de s a t, primero encuentra el flujo máximo que puede enviar desde s a todos sus vecinos, a costa de romper algunas de las restricciones. Pero luego regresa y arregla las restricciones de modo que le deja una solución óptima.

Algoritmos de ruta de aumento
La primera idea principal para el problema del flujo máximo fue presentada por Ford y Fulkerson en su trabajo seminal en 1960 [FF’60]. La idea principal es buscar rutas de aumento (una ruta que permita un flujo de sa t) en el gráfico residual y agregarlas al flujo actual, hasta que no haya más rutas de aumento. Este algoritmo se ejecuta en [matemática] O (mnU) [/ matemática], donde U es el flujo de borde máximo en el gráfico. Sin embargo, este algoritmo no dice nada sobre en qué orden deben examinarse las rutas de aumento. Los siguientes dos algoritmos basados ​​en el trabajo de Edmond y Karp [EK’72], ajustan el orden en que se agregan las rutas. La capacidad máxima o los algoritmos de ruta de aumento más gruesos encuentran la ruta de aumento más gruesa (o la ruta de aumento con el borde de cuello de botella más grande). Este algoritmo se ejecuta en [math] O ((m + nlogn) mlogF) [/ math]. El algoritmo de ruta de aumento más corto agrega los flujos a través de las rutas más cortas sucesivas. Es decir, encuentra las rutas de aumento con longitudes de ruta más cortas. La ruta más corta se puede encontrar ejecutando BFS una vez y etiquetando todos los nodos con una etiqueta de distancia desde s. Ahora, cada vez, se realiza una nueva búsqueda BFS en el gráfico residual para encontrar las rutas más cortas. Ahora, esto presta un algoritmo [matemático] O (m ^ 2n) [/ matemático]. Posiblemente se pueda mejorar este algoritmo, reduciendo el número de cálculos BFS necesarios. Los algoritmos de Dinic, reutilizan la información de la ruta más corta de una búsqueda BFS dada, y encuentran todas las rutas más cortas incidentes en ese flujo de bloqueo. La versión del árbol dinámico hace lo mismo, pero mantiene un árbol dinámico para almacenar las distancias calculadas.

Algoritmo de empuje previo al flujo
Los algoritmos basados ​​en la etiqueta Push fueron introducidos por primera vez por Karzanov [K’74]. La idea es empujar desde la fuente para hundirse, tanto flujo como sea posible. Tomar una instantánea mientras se procesa el algoritmo revelará la cantidad excesiva de flujo agrupado en una capa de nodos. Ahora, la elección de qué nodos deben examinarse a continuación, es algo arbitrario. Cualquier nodo que no esté saturado, se examina y se empuja el flujo hasta que todos sus bordes estén saturados o el exceso en el nodo esté saturado. Debido a la naturaleza general de qué nodos deben procesarse a continuación, la implementación del algoritmo requiere mucha heurística para acelerarlo. Este algoritmo se ejecuta en tiempo [matemático] O (n ^ 2m) [/ matemático] (Tenga en cuenta que este algoritmo no es el algoritmo original de Karzanov). El siguiente algoritmo usa un orden de los nodos a examinar, empujando todos los nodos cercanos al nodo actualmente examinado a un FIFO. Este algoritmo se ejecuta en tiempo [matemático] O (n ^ 3) [/ matemático] y es muy eficiente en la práctica [GT’86]. Otra variante del algoritmo de empuje previo al flujo es el algoritmo de etiqueta más alta. En esta versión, el algoritmo examina los nodos en el orden de la etiqueta más alta. Este algoritmo tiene un tiempo de ejecución teórico de [matemática] O (n ^ 2 sqrt (m)) [/ matemática] [GT86] y probablemente sea uno de los algoritmos más eficientes en la práctica. La versión final de los algoritmos de preflujo es la escala excesiva algoritmo, que se ejecuta en [matemáticas] O (mn + n ^ 2logU) [/ matemáticas]. Este algoritmo realiza push / reetiquetado en nodos con valores suficientemente grandes de exceso de flujo. Entre estos nodos, selecciona nodos con la etiqueta más pequeña.

En cuanto al rendimiento empírico, los algoritmos push-relabel son en general más rápidos que los algoritmos de ruta de aumento. En particular, el algoritmo push-re-etiquetado más alto es una de las implementaciones más rápidas de flujo máximo. En el caso del algoritmo de ruta de aumento, los algoritmos de ruta de aumento más cortos son generalmente rápidos. Un buen artículo para la comparación empírica es este. El flujo máximo (y sus cortes duales mínimos) se usa ampliamente en Computer Vision y puede ver la comparación de los algoritmos de flujo máximo en Computer Vision aquí y aquí.

Aquí no se ha explorado una nueva clase de algoritmos, basada en el seudoflujo e intentará abordarla en una actualización.

Referencias
FF’60: Ford, LR, Jr., y Fulkerson, DR (1956), “Flujo máximo a través de una red”, Canadian Journal of Mathematics 8, 399-404.
EK’72: Edmonds, J. y Karp, RM (1972), Mejoras teóricas en la eficiencia algorítmica para problemas de flujo de red, Journal of ACM 19, 248-264.
D’70: Dinic, EA (1970). “Algoritmo para la solución de un problema de flujo máximo en redes con estimación de potencia”, Soviet Mathematics Doklady 1 1, 1277-1280.
GT’86: Goldberg, AV y Tarjan, RE (1986), “Un nuevo enfoque para el problema del flujo máximo”, Actas del 18º Simposio de ACM sobre la teoría de la producción de maíz, 136-146. Artículo completo en Journal of ACM 35 (1988), 921-940.
K’74: Karzanov, AV (1974), “Determinación del flujo máximo en una red por el método de preflujos”, Matemáticas soviéticas Dokladly 15, 434-437.
G’85:

Descargo de responsabilidad: este no es un material revisado por pares y podría tener errores involuntarios como resultado. Utilice este conocimiento con precaución y verifique, y asegúrese de comprender todo lo que está leyendo. Recomiendo leer los algoritmos de flujo de red de Ahuja et al. Si está buscando una referencia buena y accesible.

El problema clásico de flujo máximo toma como entrada un gráfico dirigido con pesos de borde que representan la capacidad de las conexiones, así como un nodo etiquetado como fuente y un nodo etiquetado como sumidero. El objetivo es descubrir una asignación de flujo a los bordes que maximice la cantidad total que fluye hacia el sumidero, con la restricción de que la cantidad que fluye hacia cada nodo debe ser igual a la cantidad que fluye fuera de él.

Tenga en cuenta que es fácil generalizar esto en un problema de fuente múltiple / sumidero múltiple al agregar una fuente consolidada con capacidad infinita a las fuentes originales, o un sumidero consolidado con capacidad infinita a todos los sumideros originales.

La gente ha ideado varios algoritmos para resolver este problema. http://en.wikipedia.org/wiki/Max … proporciona explicaciones más detalladas, pero daré una visión general de la pareja que las populares que he usado.

Primero, es posible conectar las restricciones en un solucionador de programación lineal. Aunque técnicamente ni siquiera es tiempo polinómico, en la práctica obtiene resultados decentes.

El algoritmo que aprendimos en mi clase de algoritmos fue el algoritmo Edmonds-Karp, que toma O (V * E ^ 2). La idea es encontrar una ruta desde la fuente hasta el sumidero, y luego enviar la mayor cantidad de flujo posible (es decir, el valor de la capacidad de borde más pequeña a lo largo de la ruta). Luego, disminuya la capacidad de todos los bordes en la ruta por la cantidad de flujo enviado, y agregue bordes inversos que permitan que el flujo se envíe hacia atrás, permitiendo deshacer partes de rutas anteriores. Luego repita hasta que no sea posible agregar una ruta que aumente el flujo. El paso de respaldo / inversión mitiga la codicia del algoritmo, pero aún terminará, porque el flujo total aumenta monotónicamente en cada paso. Por último, las rutas se eligen mediante una búsqueda de amplitud, que garantiza que la ruta elegida en cada paso tenga el número mínimo de bordes.

Aún más eficiente es el algoritmo de Dinitz (O (V * E * log (V))), que encuentra flujos de bloqueo en gráficos de nivel, acelerando las cosas con la estructura de datos de árboles dinámicos (wuuuuuuut?). Tuve que implementarlo una vez, pero no recuerdo nada al respecto, pero Wikipedia tiene una buena explicación: http://en.wikipedia.org/wiki/Din

¡El flujo máximo ahora se puede resolver en tiempo [matemático] O (mn) [/ matemático]!

Max fluye en tiempo O (nm) – James B. Orlin, MIT Sloan | Video MIT