Algoritme de Edmonds-Karp
En ciències de la computació i teoria de grafos, el Algoritme de Edmonds-Karp és una implementació del método de Ford-Fulkerson per a calcular el fluix maximal en una ret de fluix(i.i. computer network) en complexitat O(V I2). És asintóticamente més llent que l'algoritme de Push-relabel, que té complexitat O(V3), pero és habitualment més ràpit en la pràctica per a grafos ralos. L'algoritme va ser publicat per primera volta per un científic soviètic, Yefim (Chaim) Dinic, en 1970,[1] i independentment per Jack Edmonds i Richard Karp en 1972.[2] l'Algoritme de Dinic inclou tècniques adicionals per a reduir la complexitat a O(V2I).
Algoritme
L'algoritme és idèntic al algoritme de Ford-Fulkerson, llevat perque l'orde per a anar buscant els camins aumentantes està definit. El camí trobat deu ser el camí més curt que té capacitat disponible. Açò es pot trobar per mig d'una busca en esgambi, ya que deixem que les vores tinguen unitat de llongitut. La complexitat O(V I2)[3] es fonamenta mostrant que cada camí aumentante pot ser trobat en O(I), cada volta que a lo manco un dels costats I se satura, la distància des del costat saturat fins a l'orige a través del camí aumentante deurà ser més llarc que l'última volta que est va estar saturat, i eixe llarc és com a molt V. Una atra propietat d'este algoritme és que el llarc del camí aumentante més curt s'incrementa monotonamente. Hi ha una prova accessible en:.
Pseudocódigo
- Per a una descripció de més alt nivell vore Algoritme de Ford-Fulkerson.
algoritme EdmondsKarp
entrada:
C[1..n, 1..n] (matrius de capacitat)
I[1..n, 1..?] (llista de veïns)
s (orige)
t (afonament)
eixida:
f (valor del fluix maximal)
F (Una matrix que dona un fluix valgut en el màxim valor)
f := 0 (el fluix inicialment és zero)
F := array(1..n, 1..n) (Capacitat del residu d'o a v és C[o,v] - F[o,v])
forever
m, P := BFS(C, I, s, t, F)
if m = 0
break
f := f + m
(Busca usant backtracking i estrictura del fluix)
v := t
while v ≠ s
o := P[v]
F[o,v] := F[o,v] + m
F[v,o] := F[v,o] - m
v := o
return (f, F)
algoritme BFS
entrada:
C, I, s, t, F
eixida:
M[t] (Capacitat del camí trobat)
P (Taula de pares)
P := array(1..n)
for o in 1..n
P[o] := -1
P[s] := -2 (assegurar-se de que el 'orige' no siga reemplaçat)
M := array(1..n) (Capacitat del camí trobat fins al nodo)
M[s] := ∞
Q := queue()
Q.push(s)
while Q.size() > 0
o := Q.pop()
for v in I[o]
(Si hi ha capacitat disponible, i v no va ser usat abans en la busca)
if C[o,v] - F[o,v] > 0 and P[v] = -1
P[v] := o
M[v] := min(M[o], C[o,v] - F[o,v])
if v ≠ t
Q.push(v)
else
return M[t],
P return 0,
P == Eixemple == Donat un grafo dirigit (network) de 7 nodos, orige A, afonament G, i les capacitats que es mostren davall:
En els parells escrits en els costats , és el fluix actual, i és la capacitat. La capacitat de la resta entre i és , la capacitat total, menys el fluix que està en us. Si el fluix des de a és negatiu, açò contribuïx a la capacitat del residu.
| Capacitat | Camí |
|---|---|
| Network resultant | |
|
|
|
|
|
|
|
|
Notar com la llongitut del Camí Aumentante trobat per l'algoritme mai es decrementa. Els camins trobats són lo més curts possibles. El fluix trobat és igual a la capacitat a travès de tall mínim en el grafo separant l'orige de l'afonament. Hi ha un sol tall minimal en este grafo, particionando els nodos en els conjunts i , en la capacitat:
Referències
- ↑ E. A. Dinic(1970).«Algorithm for solution of a problem of maximum flow in a network with power estimation».Soviet Math. Doklady.Doklady.11: 1277–1280.
- ↑ Jack Edmonds and Richard M. Karp(1972).«Theoretical improvements in algorithmic efficiency for network flow problems».Journal of the ACM.19(2): 248–264.doi:10.1145/321694.321699.
- ↑ Penazzi, Daniel. «Complexitat de Edmonds-Karp». Consultat el 27 d'abril de 2012.
Referències
- Este artícul conté una traducció derivada de «Algoritmo de Edmonds-Karp» de Wikipedia en castellà publicada baix la Llicència de documentació lliure de GNU i la Llicència Creative Commons Reconeiximent-CompartirIgual 4.0 Internacional.