El método Ford-Fulkerson o algoritmo Ford-Fulkerson ( FFA ) es un algoritmo voraz que calcula el flujo máximo en una red de flujo . A veces se le llama "método" en lugar de "algoritmo" porque el enfoque para encontrar rutas de aumento en un grafo residual no está completamente especificado [ 1 ] o está especificado en varias implementaciones con diferentes tiempos de ejecución. [ 2 ] Fue publicado en 1956 por LR Ford Jr. y DR Fulkerson . [ 3 ] El nombre "Ford - Fulkerson" también se usa a menudo para el algoritmo Edmonds-Karp , que es una implementación completamente definida del método Ford - Fulkerson.
La idea detrás del algoritmo es la siguiente: mientras exista un camino desde el origen (nodo inicial) hasta el destino (nodo final), con capacidad disponible en todos los enlaces del camino, enviamos el flujo a lo largo de uno de esos caminos. Luego encontramos otro camino, y así sucesivamente. Un camino con capacidad disponible se denomina camino de aumento .
Algoritmo
DejarSea u un grafo, y para cada arista de u a v , seaser la capacidad ySea el flujo. Queremos encontrar el flujo máximo desde la fuente s hasta el sumidero t . Después de cada paso del algoritmo se mantiene lo siguiente:
Esto significa que el flujo a través de la red es un flujo válido después de cada ronda del algoritmo. Definimos la red residual.ser la red con capacidady ningún flujo. Nótese que puede ocurrir que se permita un flujo de v a u en la red residual, aunque no esté permitido en la red original: siyentonces.
Algoritmo Ford – Fulkerson- Entradas dada una redcon capacidad de flujo c , un nodo fuente s y un nodo sumidero t
- Salida Calcular un flujo f de s a t de valor máximo
- para todos los bordes
- Mientras que existe un camino p de s a t en, de tal manera quepara todos los bordes:
- Encontrar
- Para cada borde
- ( Enviar flujo a lo largo de la ruta )
- ( El flujo podría "retornarse" más tarde )
- " ← " denota asignación . Por ejemplo, " largest ← item " significa que el valor de largest cambia al valor de item .
- " return " finaliza el algoritmo y devuelve el siguiente valor.
La ruta en el paso 2 se puede encontrar con, por ejemplo, búsqueda en amplitud (BFS) o búsqueda en profundidad enEl primero se conoce como el algoritmo de Edmonds-Karp .
Cuando no se puedan encontrar más caminos en el paso 2, s no podrá alcanzar t en la red residual. Si S es el conjunto de nodos alcanzables por s en la red residual, entonces la capacidad total en la red original de aristas desde S al resto de V es, por un lado, igual al flujo total que encontramos de s a t , y por otro lado sirve como límite superior para todos esos flujos. Esto demuestra que el flujo que encontramos es máximo. Véase también el teorema del corte mínimo de flujo máximo .
Si el gráficotiene múltiples fuentes y sumideros, actuamos de la siguiente manera: Supongamos queyAgregar una nueva fuentecon un toque de distincióndea cada nodo, con capacidadY añadir un nuevo fregaderocon un toque de distincióndesde cada nodoa, con capacidad. Luego, aplique el algoritmo de Ford - Fulkerson.
Además, si un nodo u tiene una restricción de capacidad, reemplazamos este nodo con dos nodosy una ventaja, con capacidad. A continuación, podemos aplicar el algoritmo de Ford - Fulkerson.
Complejidad
Al agregar la ruta de aumento de flujo al flujo ya establecido en el grafo, se alcanzará el flujo máximo cuando no se puedan encontrar más rutas de aumento de flujo en el grafo. Sin embargo, no hay certeza de que esta situación se alcance alguna vez, por lo que lo mejor que se puede garantizar es que la respuesta será correcta si el algoritmo termina. En el caso de que el algoritmo no termine, el flujo podría no converger hacia el flujo máximo. Sin embargo, esta situación solo ocurre con valores de flujo irracionales. [ 4 ] Cuando las capacidades son números enteros, el tiempo de ejecución de Ford-Fulkerson está acotado por(véase la notación de la gran O ), dondees el número de aristas en el grafo yes el flujo máximo en el grafo. Esto se debe a que cada ruta de aumento se puede encontrar entiempo y aumenta el flujo en una cantidad entera de al menos, con el límite superior.
Una variación del algoritmo de Ford - Fulkerson con terminación garantizada y un tiempo de ejecución independiente del valor máximo del flujo es el algoritmo de Edmonds-Karp , que se ejecuta entiempo.
Ejemplo de flujo de enteros
El siguiente ejemplo muestra los primeros pasos del método de Ford-Fulkerson en una red de flujo con 4 nodos, origeny fregaderoEste ejemplo muestra el comportamiento del algoritmo en el peor de los casos. En cada paso, solo un flujo dese envía a través de la red. Si en su lugar se utilizara la búsqueda en amplitud, solo serían necesarios dos pasos.
Ejemplo no terminante
![]()
Considere la red de flujo que se muestra a la derecha, con origen, hundircapacidades de los bordes,yy la capacidad de todas las demás aristas algún número entero. La constantefue elegido de tal manera que. Utilizamos rutas de aumento según la siguiente tabla, donde,y.
Tenga en cuenta que después del paso 1, así como después del paso 5, las capacidades residuales de los bordes,yestán en la forma,y, respectivamente, para algunosEsto significa que podemos usar rutas de aumento.,,yinfinitas veces y las capacidades residuales de estos bordes siempre tendrán la misma forma. El flujo total en la red después del paso 5 es. Si continuamos utilizando rutas de aumento como se indicó anteriormente, el flujo total converge aSin embargo, tenga en cuenta que existe un flujo de valor., enviandounidades de flujo a lo largo, 1 unidad de flujo a lo largo, yunidades de flujo a lo largoPor lo tanto, el algoritmo nunca termina y el flujo no converge al flujo máximo. [ 5 ]
Otro ejemplo no terminante basado en el algoritmo euclidiano lo proporcionan Backman y Huynh (2018) , donde también muestran que el tiempo de ejecución en el peor caso del algoritmo de Ford-Fulkerson en una reden números ordinales es.
Implementación en Python del algoritmo de Edmonds-Karp
colecciones de importaciónclase Grafo :""" Esta clase representa un grafo dirigido utilizando representación de matriz de adyacencia. """def __init__ ( self , graph ):auto.grafo = grafo # grafo residualself.row = len ( graph )def bfs ( self , s , t , parent ):""" Devuelve verdadero si hay un camino desde Fuente 's' al sumidero 't' en el gráfico residual. También rellena parent[] para almacenar la ruta. """# Marcar todos los vértices como no visitadosvisitado = [ Falso ] * self . fila# Crear una cola para BFScola = colecciones . deque ()# Marca el nodo de origen como visitado y ponlo en cola.cola.append ( s )visitado [ s ] = Verdadero# Bucle BFS estándarmientras cola :u = cola.popleft ( )# Obtener todos los vértices adyacentes del vértice extraído de la cola u# Si un adyacente no ha sido visitado, márquelo como tal.# visitado y encoladopara ind , val en enumerate ( self.graph [ u ] ) :si ( visitado [ ind ] == Falso ) y ( val > 0 ):cola.append ( ind )visitado [ ind ] = Verdaderopadre [ ind ] = u# Si llegamos al sumidero en BFS comenzando desde el origen, entonces regresa# verdadero, de lo contrario falsoregreso visitado [ t ]# Devuelve el flujo máximo de s a t en el gráfico dado.def edmonds_karp ( self , source , sink ):# Este array se llena mediante BFS y para almacenar la rutapadre = [ - 1 ] * self . filaflujo_máximo = 0 # Inicialmente no hay flujo# Aumentar el flujo mientras exista un camino desde el origen hasta el destinomientras self.bfs ( source , sink , parent ) :# Hallar la capacidad residual mínima de los bordes a lo largo del# ruta llenada por BFS. O podemos decir encontrar el flujo máximo.# a través del camino encontrado.flujo_ruta = flotante ( "Inf" )s = sumideromientras s != fuente :flujo_ruta = min ( flujo_ruta , self.graph [ parent [ s ] ][ s ] )s = padre [ s ]# Agregar flujo de ruta al flujo generalflujo_máximo += flujo_de_ruta# Actualizar las capacidades residuales de los bordes y los bordes inversos# a lo largo del caminov = sumideromientras v != fuente :u = padre [ v ]self.graph [ u ] [ v ] - = path_flowself.graph [ v ] [ u ] + = path_flowv = padre [ v ]devolver flujo_máximoVéase también
Notas
- ↑ Laung-Terng Wang, Yao-Wen Chang, Kwang-Ting (Tim) Cheng (2009). Automatización del diseño electrónico: síntesis, verificación y prueba . Morgan Kaufmann. 204 págs . ISBN 978-0080922003.
{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace ) - ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein (2009). Introducción a los algoritmos . Prensa del MIT. págs.714 . ISBN 978-0262258104.
- ↑ Ford, LR ; Fulkerson, DR (1956). "Flujo máximo a través de una red" (PDF) . Revista Canadiense de Matemáticas . 8 : 399–404 . doi : 10.4153/CJM-1956-045-5 . S2CID 16109790 .
- ↑ "Algoritmo de etiquetado de flujo máximo de Ford-Fulkerson". 1998. CiteSeerX 10.1.1.295.9049 .
- ↑ Zwick, Uri (21 de agosto de 1995). "Las redes más pequeñas en las que el procedimiento de flujo máximo de Ford-Fulkerson puede fallar al terminar" . Theoretical Computer Science . 148 (1): 165– 170. doi : 10.1016/0304-3975(95)00022-O .
Referencias
- Cormen, Thomas H.; Leiserson , Charles E.; Rivest , Ronald L .; Stein, Clifford (2001). «Sección 26.2: El método Ford - Fulkerson». Introducción a los algoritmos (Segunda edición). MIT Press y McGraw - Hill. págs. 651-664 . ISBN 0-262-03293-7.
- George T. Heineman; Gary Pollice; Stanley Selkow (2008). «Capítulo 8: Algoritmos de flujo de red». Algoritmos en pocas palabras . Oreilly Media . págs. 226–250 . ISBN 978-0-596-51624-6.
- Jon Kleinberg ; Éva Tardos (2006). «Capítulo 7: Extensiones al problema del flujo máximo» . Diseño de algoritmos . Pearson Education. págs. 378–384 . ISBN 0-321-29535-8.
- Samuel Gutekunst (2019). ENGRI 1101 . Universidad de Cornell.
- Backman, Spencer; Huynh, Tony (2018). "Ford–Fulkerson transfinito en una red finita". Computability . 7 (4): 341– 347. arXiv : 1504.04363 . doi : 10.3233/COM-180082 . S2CID 15497138 .
Enlaces externos
- Un tutorial que explica el método de Ford-Fulkerson para resolver el problema del flujo máximo.
- Otra animación Java
- Aplicación Java Web Start
Contenido multimedia relacionado con el algoritmo de Ford-Fulkerson en Wikimedia Commons.
- Algoritmos de grafos
- Problema de flujo de red