viernes, 28 de junio de 2019

LISTAS RELACIONADAS CON LAS MATEMÁTICAS - ALGORITMOS


método de Ford-Fulkerson o algoritmo de Ford-Fulkerson ( FFA ) es un algoritmo codicioso que calcula el flujo máximo en una red de flujo . A veces se le llama "método" en lugar de "algoritmo", ya que el enfoque para encontrar rutas de aumento en un gráfico residual no se especifica completamente [1] o se especifica 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 de Edmonds-Karp, que es una implementación completamente definida del método Ford-Fulkerson.
La idea detrás del algoritmo es la siguiente: siempre que haya una ruta desde la fuente (nodo de inicio) al sumidero (nodo final), con capacidad disponible en todos los bordes de la ruta, enviamos flujo a lo largo de una de las rutas. Luego encontramos otro camino, y así sucesivamente. Una ruta con capacidad disponible se llama ruta de aumento .

Algoritmo editar ]

Dejar ser un gráfico, y para cada borde de u a v , vamos ser la capacidad y ser el flujo Queremos encontrar el flujo máximo de la fuente s al sumidero t . Después de cada paso en el algoritmo se mantiene lo siguiente:
Limitaciones de capacidadEl flujo a lo largo de un borde no puede exceder su capacidad.
Simetría sesgadaEl flujo neto de u a v debe ser opuesto al flujo neto de v a u (ver ejemplo).
Conservación de flujoEl flujo neto a un nodo es cero, excepto por la fuente, que "produce" flujo, y el sumidero, que "consume" flujo.
Valor (f)El flujo que sale de s debe ser igual al flujo que llega a t .
Esto significa que el flujo a través de la red es un flujo legal después de cada ronda en el algoritmo. Definimos la red residual.  Ser la red con capacidad. y no hay flujo. Observe que puede suceder que se permita un flujo de v a u en la red residual, aunque no está permitido en la red original: si y  entonces .
Algoritmo Ford – Fulkerson
Entradas dadas 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
  1.  para todos los bordes 
  2. Mientras que hay un camino p de s a t en, tal que  para todos los bordes :
    1. Encontrar 
    2. Para cada borde 
      1. Enviar flujo a lo largo del camino )
      2. El flujo puede ser "devuelto" más tarde )
  • "←" denota la asignación . Por ejemplo, " artículo ← más grande " significa que el valor de los cambios más grandes en el valor del artículo .
  • return " termina el algoritmo y genera el siguiente valor.
La ruta en el paso 2 se puede encontrar, por ejemplo, con una búsqueda en primer lugar (BFS) o una búsquedaen profundidad enSi usa el primero, el algoritmo se llama Edmonds – Karp .
Cuando no se puedan encontrar más rutas 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 bordes desde S hasta el resto de V es, por una parte, igual al flujo total que encontramos desde s hasta t , y por otro lado, sirve como un límite superior para todos estos flujos. Esto prueba que el flujo que encontramos es máximo. Véase también el teorema de corte mínimo de flujo máximo .
Si la grafica  tiene múltiples fuentes y sumideros, actuamos de la siguiente manera: Supongamos que  y Añadir una nueva fuente con un borde  desde  a cada nodo con capacidad Y añada un nuevo fregadero. con un borde  de cada nodo  a con capacidad Luego aplique el algoritmo Ford-Fulkerson.
Además, si un nodo u tiene restricción de capacidad, reemplazamos este nodo con dos nodos , y una ventaja con capacidad Luego aplique el algoritmo Ford-Fulkerson.

Complejidad editar ]

Al agregar la ruta de aumento de flujo al flujo ya establecido en el gráfico, se alcanzará el flujo máximo cuando ya no se puedan encontrar más rutas de aumento de flujo en el gráfico. Sin embargo, no hay certeza de que esta situación sea alcanzada, 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 se ejecute para siempre, el flujo podría incluso no converger hacia el flujo máximo. Sin embargo, esta situación solo ocurre con valores de flujo irracional. Cuando las capacidades son enteros, el tiempo de ejecución de Ford – Fulkerson está limitado por(ver gran notación O ), donde es el número de aristas en el gráfico y Es el flujo máximo en el gráfico. Esto se debe a que cada ruta de aumento se puede encontrar en tiempo y aumenta el flujo en una cantidad entera de al menos , con el límite superior .
Una variación del algoritmo Ford-Fulkerson con terminación garantizada y un tiempo de ejecución independiente del valor de flujo máximo es el algoritmo Edmonds-Karp , que se ejecuta en hora.

Ejemplo integral editar ]

El siguiente ejemplo muestra los primeros pasos de Ford – Fulkerson en una red de flujo con 4 nodos, fuente  y hundirse Este ejemplo muestra el peor comportamiento del algoritmo. En cada paso, solo un flujo deSe envía a través de la red. Si en su lugar se utilizara la primera búsqueda de amplitud, solo se necesitarían dos pasos.
CaminoCapacidadRed de flujo resultante
Red de flujo inicialEjemplo de Ford-Fulkerson 0.svg
Ford-Fulkerson ejemplo 1.svg
Ford-Fulkerson ejemplo 2.svg
Después de 1998 más pasos ...
Red de flujo finalFord-Fulkerson ejemplo final.svg
Observe cómo el flujo es "rechazado" desde  a  al encontrar el camino .

Ejemplo sin terminación editar ]

Ford-Fulkerson forever.svg
Considere la red de flujo que se muestra a la derecha, con la fuente , lavabo , capacidades de bordes  y  respectivamente  y  y la capacidad de todos los demás bordes algún número entero El constante fue elegido para que Usamos rutas de aumento de acuerdo con la siguiente tabla, donde y .
PasoCamino de aumentoFlujo enviadoCapacidades residuales
0
1
2
3
4
5
Tenga en cuenta que después del paso 1, así como después del paso 5, las capacidades residuales de los bordes  y  están en la forma  y , respectivamente, para algunos Esto significa que podemos utilizar rutas de aumento. y Infinidad de veces y las capacidades residuales de estos bordes siempre estarán en la misma forma. El flujo total en la red después del paso 5 esSi continuamos utilizando rutas de aumento como las anteriores, el flujo total converge a, mientras que el flujo máximo es En este caso, el algoritmo nunca termina y el flujo ni siquiera converge al flujo máximo. [4]

Implementación de Python del algoritmo de Edmonds-Karp editar ]

 colecciones de importación
 
# Esta clase representa un gráfico dirigido utilizando la 
clase de  representación de matriz de adyacencia Gráfico :
  
    def  __init__ ( self , graph ): 
        self . graph  =  graph   # residual graph 
        self . ROW  =  len ( gráfico )
  
    def  BFS ( self ,  s ,  t ,  parent ): 
        '' 'Devuelve true si hay una ruta desde la fuente' s 'hasta el hundimiento' t 'en el 
        gráfico residual. También llena el padre [] para almacenar la ruta '' '

        # Marcar todos los vértices como no visitados 
        visitados  =  [ Falso ]  *  ( self . ROW )
         
        # Crear una cola para la 
        cola  BFS =  colecciones . deque ()
         
        # Marque el nodo de origen como visitado y póngalo en 
        cola . apéndice ( s ) 
        visitado [ s ]  =  Verdadero
         
        # Bucle BFS estándar 
        mientras que la  cola : 
            u  =  cola . gente ()
         
            # Obtener todos los vértices adyacentes del vértice eliminado de la cola u 
            # Si no se ha visitado un adyacente, 
            márquelo # visitado y póngalo en la cola 
            para  ind ,  val  en  enumerate ( self . Graph [ u ]): 
                if  ( visitó [ ind ]  ==  Falso )  y  ( val  >  0 ): 
                    cola . añadir ( ind ) 
                    visitó [ ind ]  =  verdadero 
                    padre [ ind ] =  u
 
        # Si llegamos a hundirnos en BFS a partir de la fuente, devolvemos 
        # verdadero, de lo contrario, se 
        devuelve una  visita falsa [ t ]
             
    # Devuelve el flujo máximo de s a t en la 
    definición del  gráfico dado EdmondsKarp ( self ,  source ,  sink ):
 
        # Esta matriz se llena con BFS y para almacenar la ruta 
        principal  =  [ - 1 ]  *  ( self . ROW )
 
        max_flow  =  0  # No hay flujo inicialmente
 
        # Aumentar el flujo mientras que hay camino desde la fuente al sumidero 
        , mientras que  uno mismo . BFS ( fuente ,  sumidero ,  padre ):
 
            # Encuentre la capacidad residual mínima de los bordes a lo largo de la 
            ruta # rellenada por BFS. O podemos decir encontrar el flujo máximo 
            # a través de la ruta encontrada. 
            path_flow  =  float ( "Inf" ) 
            s  =  sink 
            mientras  s  ! =  source : 
                path_flow  =  min ( path_flow ,  self . graph [ parent [ s ]] [ s ]) 
                s  =  parent [ s ]
 
            # Agregar flujo de ruta al flujo general 
            max_flow  + =  ruta_flujo
 
            # actualizar las capacidades residuales de los bordes y revertir los bordes 
            # a lo largo de la ruta 
            v  =  hundir 
            mientras que  v  ! =   fuente : 
                u  =  padre [ v ] 
                self . gráfico [ u ] [ v ]  - =  path_flow 
                self . gráfico [ v ] [ u ]  + =  ruta_flujo 
                v  =  padre [ v ]
 
        devolver  max_flow

No hay comentarios:

Publicar un comentario