En la teoría de la optimización y la teoría de grafos , el problema del flujo máximo es encontrar un flujo tal a través de la red de transporte que la suma de los flujos desde la fuente o, de manera equivalente, la suma de los flujos hacia el sumidero, sea máxima.
El problema de flujo máximo es un caso especial de problemas más difíciles, como el problema de circulación .
Después de la entrada de los Estados Unidos en la Segunda Guerra Mundial en 1941, el matemático George Bernard Dantzig se unió a la oficina de estadísticas de la Fuerza Aérea de los Estados Unidos en Washington DC . De 1941 a 1946 dirigió la Rama de Análisis de Combate, donde trabajó en varios problemas matemáticos. [1] [2] Posteriormente, utilizando el trabajo de Danzig, el problema del flujo máximo se resolvió por primera vez durante la preparación del puente aéreo durante el bloqueo de Berlín Occidental , que tuvo lugar en 1948-1949. [3] [4] [5]
En 1951, George Dantzig formuló por primera vez el problema en términos generales. [6]
En 1955, Lester Ford y Delbert Ray Fulkerson construyeron por primera vez un algoritmo diseñado específicamente para resolver este problema . Su algoritmo se llamó algoritmo Ford-Fulkerson . [7] [8]
En el futuro, la solución del problema se mejoró muchas veces.
En 2010, los investigadores Jonathan Kelner y Aleksander Mądry del MIT , junto con sus colegas Daniel Spielman de la Universidad de Yale y Shen- Hua Teng de la Universidad del Sur de California demostraron otra mejora del algoritmo por primera vez en 10 años. [3] [9] [10]
Dada una red de transporte con fuente , sumidero y capacidad .
El valor de flujo es la suma de los flujos de la fuente . En el artículo “ Red de transporte ” se demuestra que es igual a la suma de los caudales al desagüe .El problema del flujo máximo es encontrar tal flujo, donde el valor del flujo es máximo.
La siguiente tabla enumera algunos algoritmos para resolver el problema.
Método | Complejidad | Descripción |
---|---|---|
Programación lineal | Depende del algoritmo específico. Para el método simplex, es exponencial. | Presente el problema de flujo máximo como un problema de programación lineal. Las variables son los flujos a lo largo de los bordes y las restricciones son la preservación del flujo y la limitación del rendimiento. |
Algoritmo de Ford-Fulkerson | Depende del algoritmo de búsqueda de ruta de aumento. Requiere tales búsquedas. | Encuentre cualquier ruta de aumento. Aumentar el caudal en todos sus bordes al mínimo de sus capacidades residuales. Repita siempre que haya una ruta de aumento. El algoritmo solo funciona para anchos de banda enteros. De lo contrario, puede ejecutarse indefinidamente sin converger a la respuesta correcta. |
Algoritmo de Edmonds-Karp | Ejecutamos el algoritmo de Ford-Fulkerson, eligiendo cada vez la ruta de aumento más corta (encontrada por búsqueda en amplitud ). | |
algoritmo de Dinit | o para capacidades unitarias utilizando árboles dinámicos de Slethor y Tarjan [11] | Mejora del algoritmo de Edmonds-Karp (pero encontrado cronológicamente antes). En cada iteración, utilizando la búsqueda primero en amplitud, determinamos las distancias desde la fuente hasta todos los vértices en la red residual. Construimos un gráfico que contiene solo los bordes de la red residual en los que esta distancia aumenta en 1. Excluimos del gráfico todos los vértices sin salida con bordes incidentes en ellos, hasta que todos los vértices se conviertan en no sin salida. (Un callejón sin salida es un vértice, a excepción de la fuente y el sumidero, que no incluye un solo borde o del que no emanan bordes). En el gráfico resultante, encontramos el camino de aumento más corto (será cualquier camino desde s a t). Excluimos el borde con la capacidad mínima de la red residual, nuevamente excluimos los vértices sin salida, y así sucesivamente hasta que haya una ruta de aumento. |
Algoritmo de empuje de preflujo | Opera en un preflujo en lugar de una corriente. La diferencia es que para cualquier vértice u, a excepción de la fuente y el sumidero, la suma de los flujos que ingresan para el flujo debe ser estrictamente cero (la condición de conservación del flujo) y para el preflujo debe ser no negativa. Esta suma se llama exceso de flujo al vértice, y un vértice con un exceso de flujo positivo se dice que se desborda . Además, para cada vértice, el algoritmo guarda una característica adicional, la altura , que es un número entero no negativo. El algoritmo utiliza dos operaciones: push , cuando el flujo a lo largo de un borde que va de un vértice superior a un vértice inferior aumenta en la cantidad máxima posible, y lift , cuando se eleva un vértice desbordado, desde el cual es imposible empujar debido a una altura insuficiente. . El empuje es posible cuando un borde pertenece a la red residual, conduce de un vértice superior a uno inferior y el vértice original se desborda. El levantamiento es posible cuando el vértice que se levanta está lleno, pero ninguno de los vértices a los que conducen los bordes de la red residual es más bajo que él. Se realiza hasta una altura superior en 1 al mínimo de las alturas de estos vértices. Inicialmente, la altura de la fuente es V, a lo largo de todos los bordes que emanan de la fuente, fluye el flujo máximo posible y las alturas y flujos restantes son cero. Las operaciones de empuje y elevación se realizan el mayor tiempo posible. | |
Algoritmo "subir al principio" | o usando árboles dinámicos | Una variante del algoritmo anterior que define el orden de las operaciones de empujar y levantar de manera especial. |
Algoritmo de flujo de bloqueo binario [1] |
Para obtener una lista más detallada, consulte [2] y Lista de algoritmos para encontrar el flujo máximo .
Si los rendimientos son enteros, el flujo máximo también es entero.
El teorema se sigue, por ejemplo, del teorema de Ford-Fulkerson .
Algunas generalizaciones del problema de flujo máximo se reducen fácilmente al problema original.
Si hay más de una fuente, agregue un nuevo vértice S, que hacemos la única fuente. Añadimos aristas con capacidad infinita desde S a cada una de las fuentes antiguas.
De manera similar, si hay más de un sumidero, agregamos un nuevo vértice T, que hacemos el único sumidero. Agregamos bordes con capacidad infinita de cada uno de los fregaderos antiguos a T.
Cada arista no dirigida (u, v) se reemplaza por un par de aristas dirigidas (u, v) y (v, u).
Dividimos cada vértice v con capacidad limitada en dos vértices v in y v out . Todos los bordes incluidos en v antes de dividir ahora se incluyen en v en . Todos los bordes que se originaron en v antes de dividirse ahora se originan en v out . Agregue un borde (v in , v out ) con capacidad .
En esta versión del enunciado del problema, el valor del flujo de cada borde está adicionalmente limitado desde abajo por la función . Por lo tanto, el valor de flujo para cualquier borde no puede exceder su capacidad, pero no puede ser inferior al mínimo especificado, es decir . Para resolver el problema, es necesario transformar la red de transporte original en una red de transporte de la siguiente manera:
Se define un flujo en B que cumple la condición de limitar el caudal de bordes desde abajo si y sólo si se define un flujo máximo en el que todos los bordes de la forma y están "saturados". Gracias a esta construcción, el algoritmo para encontrar un flujo acotado por abajo será el siguiente:
Esta variante del problema es idéntica a la anterior, con la diferencia de que el valor de caudal para cada arista también puede ser igual a , es decir o . A pesar de un ligero cambio en la condición, no hay solución polinomial para este problema si las clases P y NP no son iguales . Como prueba de la afirmación, se puede dar una reducción polinomial al problema Exact-3-SAT .