Algoritmo de Edmonds-Karp

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Algoritmo para calcular el flujo máximo en una red de flujo

En la informática, la Algoritmo de Edmonds–Karp es una implementación del método Ford-Fulkerson para calcular el flujo máximo en una red de flujo en O()SilencioVSilencioSilencioESilencio2){displaystyle O(vivir a la vida eterna)} tiempo. El algoritmo fue publicado por primera vez por Yefim Dinitz (cuyo nombre también es transliterado "E. A. Dinic", en particular como autor de sus primeros trabajos) en 1970 y publicado independientemente por Jack Edmonds y Richard Karp en 1972. El algoritmo de Dinic incluye técnicas adicionales que reducen el tiempo de funcionamiento a O()SilencioVSilencio2SilencioESilencio){displaystyle O(las personas que viven en la vida eterna)}.

Algoritmo

El algoritmo es idéntico al algoritmo Ford-Fulkerson, excepto que el orden de búsqueda al encontrar el camino de aumento se define. El camino encontrado debe ser un camino más corto que tiene capacidad disponible. Esto se puede encontrar por una búsqueda de amplitud, donde aplicamos un peso de 1 a cada borde. El tiempo de funcionamiento O()SilencioVSilencioSilencioESilencio2){displaystyle O(vivir a la vida eterna)} se encuentra mostrando que cada camino de aumento se puede encontrar en O()SilencioESilencio){displaystyle O(viviendas)} que cada vez al menos uno de los E{displaystyle E} los bordes se saturan (un borde que tiene el máximo flujo posible), que la distancia del borde saturado a la fuente a lo largo del camino de aumento debe ser más largo que la última vez que se saturado, y que la longitud es en la mayoría SilencioVSilencio{displaystyle Silencioso. Otra propiedad de este algoritmo es que la longitud de la ruta de aumento más corta aumenta monotonicamente. Hay una prueba accesible en Introducción a los algoritmos.

Pseudocódigo

algoritmo Edmonds Karp es entrada:
Gráfico (gráfico[v] debe ser la lista de bordes saliendo de v v v v v v en el  Gráfico original y sus correspondientes bordes reversos construidos  que se utilizan para el flujo de retroceso.  Cada borde debe tener una capacidad, flujo, fuente y lavabo como parámetros,  así como un puntero al borde inverso.)s (Fuente vértice)t (Sink vertex) Producto:
flujo (Valor del flujo máximo)flujo:= 0 (Initializar el flujo a cero) repetición (Pon una búsqueda de la primera (bfs) para encontrar el camino más corto s-t.  Usamos 'pred' para almacenar el borde tomado para llegar a cada vértice,  para que podamos recuperar el camino después)q:= queue()
q.push(s)
pred:= array(graph.length)
 mientras no vacío(q)
cur:= q.pop()
 para Edge e dentro gráfico[cur] do si pred[e.t] = nulo y e.t ل s y e.cap entoncespred[e.t]:= e
q.push(e.t)

 si no (pred[t] = null) entonces (Encontramos un camino creciente.  Vea cuánto flujo podemos enviar) df:= JUEGO para (e:= pred[t]; e ل null; e:= pred[e.s]) dodf:= min(df, e.cap - e.flow)
 (Y actualizar los bordes por esa cantidad) para (e:= pred[t]; e ل null; e:= pred[e.s]) doe.flow:= e.flow + df
e.rev.flow:= e.rev.flow - df
flujo:= flujo + df

 hasta pred[t] = null (es decir, hasta que no se encontró ningún camino de aumento) retorno flujo

Ejemplo

Dada una red de siete nodos, fuente A, sumidero G y capacidades como se muestra a continuación:

Edmonds-Karp flow example 0.svg

En los pares f/c{displaystyle f/c} escrito en los bordes, f{displaystyle f} es el flujo actual, y c{displaystyle c} es la capacidad. Capacidad residual de u{displaystyle u} a v{displaystyle v} es cf()u,v)=c()u,v)− − f()u,v){displaystyle c_{f}(u,v)=c(u,v)-f(u,v)}, la capacidad total, menos el flujo que ya se utiliza. Si la red fluye de u{displaystyle u} a v{displaystyle v} es negativo, contribuyentes a la capacidad residual.

Capacidad Camino Red de resultados
min()cf()A,D),cf()D,E),cf()E,G))=min()3− − 0,2− − 0,1− − 0)==min()3,2,1)=1{displaystyle {begin{aligned} limitmin(c_{f}(A,D),c_{f}(D,E),c_{f}(E,G)= limitmin(3-0,2-0,1-0)=== limitmin(3,2,1)=1end{aligned}}}A,D,E,G{displaystyle A,D,E,G}Edmonds-Karp flow example 1.svg
min()cf()A,D),cf()D,F),cf()F,G))=min()3− − 1,6− − 0,9− − 0)=min()2,6,9)=2{displaystyle {begin{aligned} limitmin(c_{f}(A,D),c_{f}(D,F),c_{f}(F,G)= limitmin(3-1,6-0,9-0)\= limitmin(2,6,9)=2end{aligned}}}}}}}}A,D,F,G{displaystyle A,D,F,G}Edmonds-Karp flow example 2.svg
min()cf()A,B),cf()B,C),cf()C,D),cf()D,F),cf()F,G))=min()3− − 0,4− − 0,1− − 0,6− − 2,9− − 2)=min()3,4,1,4,7)=1{f}(A,B),c_{f}(B,C),c_{f}(C,D),c_{f}(D,F),c_{f}(F),c_{f}(F),c_{f}(F,G)\= lidermin(3-0,4-0,1-0,6-2,9-2)3,4444444444444444444]A,B,C,D,F,G{displaystyle A,B,C,D,F,G}Edmonds-Karp flow example 3.svg
min()cf()A,B),cf()B,C),cf()C,E),cf()E,D),cf()D,F),cf()F,G))=min()3− − 1,4− − 1,2− − 0,0− − ()− − 1),6− − 3,9− − 3)=min()2,3,2,1,3,6)=1{displaystyle {begin{aligned} {min(c_{f}(A,B),c_{f}(B,C),c_{f}(C,E),c_{f}(E,D),c_{f}(D,F),c_{f}(F,G)=A,B,C,E,D,F,G{displaystyle A,B,C,E,D,F,G}Edmonds-Karp flow example 4.svg

Observe cómo la longitud de la ruta de aumento encontrada por el algoritmo (en rojo) nunca disminuye. Los caminos encontrados son los más cortos posibles. El flujo encontrado es igual a la capacidad a través del corte mínimo en el gráfico que separa la fuente y el lavabo. Sólo hay un corte mínimo en este gráfico, partiendo los nodos en los conjuntos {}A,B,C,E}{displaystyle {A,B,C,E} y {}D,F,G}{displaystyle {D,F,G}, con la capacidad

c()A,D)+c()C,D)+c()E,G)=3+1+1=5.{displaystyle c(A,D)+c(C,D)+c(E,G)=3+1=5. }

Contenido relacionado

Biblioteca

Una biblioteca es una colección de materiales, libros o medios que son accesibles para su uso y no solo para fines de exhibición. Una biblioteca proporciona...

Kamov Ka-25

El Kamov Ka-25 es un helicóptero naval, desarrollado para la Armada soviética en la URSS desde...

Teclado

Teclado puede referirse...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save