Articulo de referencia

Algoritmo de Ford-Fulkerson

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 "alg...

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

DejarGRAMO(V,mi){\displaystyle G(V,E)}Sea u un grafo, y para cada arista de u a v , seado(,v){\displaystyle c(u,v)}ser la capacidad yF(,v){\displaystyle f(u,v)}Sea 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.GRAMOF(V,miF){\displaystyle G_{f}(V,E_{f})}ser la red con capacidaddoF(,v)=do(,v)F(,v){\displaystyle c_{f}(u,v)=c(u,v)-f(u,v)}y 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: siF(,v)>0{\displaystyle f(u,v)>0}ydo(v,)=0{\displaystyle c(v,u)=0}entoncesdoF(v,)=do(v,)F(v,)=F(,v)>0{\displaystyle c_{f}(v,u)=c(v,u)-f(v,u)=f(u,v)>0}.

Algoritmo Ford  Fulkerson
Entradas dada una redGRAMO=(V,mi){\displaystyle G=(V,E)}con 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
  1. F(,v)0{\displaystyle f(u,v)\leftarrow 0}para todos los bordes(,v){\displaystyle (u,v)}
  2. Mientras que existe un camino p de s a t enGRAMOF{\displaystyle G_{f}}, de tal manera quedoF(,v)>0{\displaystyle c_{f}(u,v)>0}para todos los bordes(,v)pag{\displaystyle (u,v)\in p}:
    1. EncontrardoF(pag)=min{doF(,v):(,v)pag}{\displaystyle c_{f}(p)=\min\{c_{f}(u,v):(u,v)\in p\}}
    2. Para cada borde(,v)pag{\displaystyle (u,v)\in p}
      1. F(,v)F(,v)+doF(pag){\displaystyle f(u,v)\leftarrow f(u,v)+c_{f}(p)}( Enviar flujo a lo largo de la ruta )
      2. F(v,)F(v,)doF(pag){\displaystyle f(v,u)\leftarrow f(v,u)-c_{f}(p)}( 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 enGRAMOF(V,miF){\displaystyle G_{f}(V,E_{f})}El 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áficoGRAMO(V,mi){\displaystyle G(V,E)}tiene múltiples fuentes y sumideros, actuamos de la siguiente manera: Supongamos queT={tt es un fregadero}{\displaystyle T=\{t\mid t{\text{ is a sink}}\}}yS={ss es una fuente}{\displaystyle S=\{s\mid s{\text{ is a source}}\}}Agregar una nueva fuentes{\displaystyle s^{*}}con un toque de distinción(s,s){\displaystyle (s^{*},s)}des{\displaystyle s^{*}}a cada nodosS{\displaystyle s\in S}, con capacidaddo(s,s)=ds=(s,)mido(s,){\displaystyle c(s^{*},s)=d_{s}=\sum _{(s,u)\in E}c(s,u)}Y añadir un nuevo fregaderot{\displaystyle t^{*}}con un toque de distinción(t,t){\displaystyle (t,t^{*})}desde cada nodotT{\displaystyle t\in T}at{\displaystyle t^{*}}, con capacidaddo(t,t)=dt=(v,t)mido(v,t){\displaystyle c(t,t^{*})=d_{t}=\sum _{(v,t)\in E}c(v,t)}. Luego, aplique el algoritmo de Ford - Fulkerson.

Además, si un nodo u tiene una restricción de capacidadd{\displaystyle d_{u}}, reemplazamos este nodo con dos nodosinorte,ot{\displaystyle u_{\mathrm {in} },u_{\mathrm {out} }}y una ventaja(inorte,ot){\displaystyle (u_{\mathrm {in} },u_{\mathrm {out} })}, con capacidaddo(inorte,ot)=d{\displaystyle c(u_{\mathrm {in} },u_{\mathrm {out} })=d_{u}}. 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 porO(miF){\displaystyle O(Ef)}(véase la notación de la gran O ), dondemi{\displaystyle E}es el número de aristas en el grafo yF{\displaystyle f}es el flujo máximo en el grafo. Esto se debe a que cada ruta de aumento se puede encontrar enO(mi){\displaystyle O(E)}tiempo y aumenta el flujo en una cantidad entera de al menos1{\displaystyle 1}, con el límite superiorF{\displaystyle f}.

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 enO(Vmi2){\displaystyle O(VE^{2})}tiempo.

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, origenA{\displaystyle A}y fregaderoD{\displaystyle D}Este ejemplo muestra el comportamiento del algoritmo en el peor de los casos. En cada paso, solo un flujo de1{\displaystyle 1}se 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 origens{\displaystyle s}, hundirt{\displaystyle t}capacidades de los bordesmi1=1{\displaystyle e_{1}=1},mi2=r=(51)/2{\displaystyle e_{2}=r=({\sqrt {5}}-1)/2}ymi3=1{\displaystyle e_{3}=1}y la capacidad de todas las demás aristas algún número enteroMETRO2{\displaystyle M\geq 2}. La constanter{\displaystyle r}fue elegido de tal manera quer2=1r{\displaystyle r^{2}=1-r}. Utilizamos rutas de aumento según la siguiente tabla, dondepag1={s,v4,v3,v2,v1,t}{\displaystyle p_{1}=\{s,v_{4},v_{3},v_{2},v_{1},t\}},pag2={s,v2,v3,v4,t}{\displaystyle p_{2}=\{s,v_{2},v_{3},v_{4},t\}}ypag3={s,v1,v2,v3,t}{\displaystyle p_{3}=\{s,v_{1},v_{2},v_{3},t\}}.

Tenga en cuenta que después del paso 1, así como después del paso 5, las capacidades residuales de los bordesmi1{\displaystyle e_{1}},mi2{\displaystyle e_{2}}ymi3{\displaystyle e_{3}}están en la formarnorte{\displaystyle r^{n}},rnorte+1{\displaystyle r^{n+1}}y0{\displaystyle 0}, respectivamente, para algunosnortenorte{\displaystyle n\in \mathbb {N} }Esto significa que podemos usar rutas de aumento.pag1{\displaystyle p_{1}},pag2{\displaystyle p_{2}},pag1{\displaystyle p_{1}}ypag3{\displaystyle p_{3}}infinitas 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 es1+2(r1+r2){\displaystyle 1+2(r^{1}+r^{2})}. Si continuamos utilizando rutas de aumento como se indicó anteriormente, el flujo total converge a1+2i=1ri=3+2r{\displaystyle \textstyle 1+2\sum _{i=1}^{\infty }r^{i}=3+2r}Sin embargo, tenga en cuenta que existe un flujo de valor.2METRO+1{\displaystyle 2M+1}, enviandoMETRO{\displaystyle M}unidades de flujo a lo largosv1t{\displaystyle sv_{1}t}, 1 unidad de flujo a lo largosv2v3t{\displaystyle sv_{2}v_{3}t}, yMETRO{\displaystyle M}unidades de flujo a lo largosv4t{\displaystyle sv_{4}t}Por 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 redGRAMO(V,mi){\displaystyle G(V,E)}en números ordinales esωΘ(|mi|){\displaystyle \omega ^{\Theta (|E|)}}.

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áximo

Véase también

Notas

  1. 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 )
  2. ^ 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.
  3. 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 . 
  4. "Algoritmo de etiquetado de flujo máximo de Ford-Fulkerson". 1998. CiteSeerX 10.1.1.295.9049 . 
  5. 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 . 
  • 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

Logotipo de Wikimedia CommonsContenido multimedia relacionado con el algoritmo de Ford-Fulkerson en Wikimedia Commons.