CAPÍTULO VII. F LUJO EN R EDES
VII.2 F LUJO M ÁXIMO
VII.2.2 F LUJO M ÁXIMO EN R EDES C ANALIZADAS
Llamamos Red Canalizada a una red R = (V,E∪{er},b,c) con fuente s y pozo p, er = (s,p), en la cual además de la
función “capacidad” que acota superiormente el flujo, tenemos otra función b: E —> ℜque corresponde a una cota inferior para el flujo por los arcos (por esto decimos que el flujo está canalizado). El problema consiste en hallar un vector f tal que:
(i) f sea un flujo en el grafo (V,E∪{er})
(ii) ∀e∈E: b(e) ≤ f(e) ≤ c(e). (iii) f(er) sea máximo.
Note que si b(e)=0, ∀e∈E, entonces el problema anterior no es mas que el problema de flujo máximo visto en la sección anterior. Note también que c(er) puede ahora no ser infinito.
La solución inicial trivial f(e) = 0, ∀e∈E, puede no ser factible en este nuevo problema por lo que habrá que disponer de un mecanismo para encontrar al menos una solución inicial factible al problema. Esto se verá en la próxima sección. Sin embargo, para el problema de flujo máximo de la sección anterior se tiene que la solución trivial es factible.
A continuación presentamos un algoritmo para determinar un flujo máximo en una red canalizada. Este algoritmo requiere que el flujo f inicial sea un flujo factible en R = (X,V,b,c). Cuando b(e)=0, ∀e∈E, podemos tomar como flujo inicial a f(e)=0, ∀e∈E. MODIF es una variable booleana que toma el valor VERDADERO si el flujo f es modificado por el algoritmo. ExisteFM, también booleana, indica si existe un Corte de capacidad finita, en cuyo caso ExisteFM = VERDADERO.
FLUJOMAX(V, E, I, T, er, s, p, b, c, fi; VAR f, Y, MODIF, ExisteFM): { Ford & Fulkerson } {Entradas: V, E, I, T, er, s, p, b, c, fi
Salidas: f, Y, MODIF, ExisteFM}
Comienzo
MODIF ← FALSO; f← fi;
ExisteFM ← VERDADERO;
Repetir
MARCAR (V,E,I,T,er,s,p,b,c,f; Y,A,epsilon);
Si (p∈Y y epsilon ≠∞) entonces Comienzo x ← p; C+← {er}; C- ← ∅; M ODIF ← VERDADERO; Mientras (x≠s) hacer: Comienzo e ← A(x); Si (x = T(e)) entonces Comienzo C+ ← C+ ∪ {e}; x ← I(e); Fin sino Comienzo C- ←C- ∪ {e}; x ←T(e); Fin; Fin;
Para todo e∈C+ hacer : f(e) ←f(e) + epsilon ; Para todo e∈C- hacer: f(e) ←f(e) - epsilon ; Fin
hasta que (p∉Y ó epsilon =∞);
Si (epsilon = ∞) entonces ExisteFM ←FALSO ; Donde
MARCAR(V,E,I,T,er,s,p,b,c,f; VAR Y,A,epsilon):
{ Entradas: V,E,I,T,er,s,p,b,c,f. Salidas: Y,A,epsilon
Y es un conjunto de vértices y A es un vector que asocia a cada vértice un arco del cual él es extremo. Si al final del algoritmo p∈Y entonces se puede aumentar el flujo a través del camino de aumento <p, x1, x2, ... , s> que se reconstruye a partir de A de la siguiente forma: x1 es el otro vértice extremo del arco A(p), x2 es el otro vértice extremo de A(x1), etc. Si
∂(s) es la cantidad máxima en que se desea incrementar el flujo del arco er}
Variable ExisteC : booleana; Comienzo
Y ← {s};
ExisteC ← VERDADERO;
epsilon ← 0;
Mientras (p∉Y y ExisteC ) hacer
Si (∃e=(x,y) / x∈Y, y∉Y, f(e) < c(e)) entonces {Marcado Directo } Comienzo
Y ← Y ∪ {y}; A(y) ← e;
∂(y) ←Min [ ∂(x), c(e) - f(e)] Fin
sino {Marcado Inverso }
Si (∃e=(x,y) / y∈Y, x∉Y, f(e) > b(e)) entonces Comienzo
Y ← Y ∪ {x}; A(x) ← e;
∂(x) ←Min [ ∂(y), f(e) - b(e)] Fin
sino ExisteC ← FALSO; Si (ExisteC) entonces epsilon ←∂(p); Fin; { MARCAR }
Fin. { Flujo Max }
Justificación del Algoritmo:
i) Sea Ê = { e∈E/ ∃y∈ Y con A[y] = e } (A e Y son salidas de Marcar).
El grafo G(V,Ê) es claramente un árbol. La cadena que une s a p en G = (V,Ê) unido con er es un ciclo C donde C+
son los arcos orientados como er y C- son los arcos orientados en sentido contrario a er.
ii) Por la forma como se calcula ε, al modificar los valores de f(e) se mantiene la factibilidad.
i) + ii) ⇒ el flujo que se obtiene al final de cada iteración es siempre factible y estrictamente mejor que el anterior, pues al f(er) le asigna f(er) + ε, (ε > 0).
ε puede ser infinito cuando exista un camino de aumento de costo no acotado en cuyo caso el flujo es no acotado. Una vez que termina el algoritmo con p∉Y, se puede ver que hemos encontrado un corte K de s a p con c(K) = f(er), lo cual según la Proposición VII.2.1.1 implica que f no puede aumentar más (y además no podremos conseguir otro corte de capacidad menor).
Veamos a continuación que efectivamente se ha detectado tal corte: Sea Y el último conjunto de vértices marcados. Por construcción p∉Y.
Sea e = (x,y) ∈Ω+(Y) ⇒ f(e) = c(e) (sino y = T(e) sería marcado en la marcación directa). Sea e = (y,x) ∈Ω- (Y) ⇒ f(e) = 0 (sino y = I(e) sería marcado en la marcación inversa). Tomando K = Ω+(Y) tenemos f(er) = ∑e∈Kc(e) = c(K).
¤
Proposición VII.2.1.2 (Flujo Max - Corte Min)El valor máximo de f(er) para un flujo factible f en R = (V,E,c) es igual a la capacidad de un corte de s a p de capacidad mínima. En particular f(er) será no acotado si y sólo si no existe en R = (V,E,c) un corte de capacidad finita que separe s de p.
Demostración:
Podemos remitirnos al hecho de que el problema de flujo máximo es un P.P.L. que tiene al menos una solución: f(e) = 0, ∀e∈E . Además si existe algún corte de capacidad finita, el problema es acotado y por lo tanto tiene solución óptima finita.
¤
En cuanto a la terminación del algoritmo de Ford & Fulkerson (F&F), podemos ver que siempre que las capacidades de los arcos sean números racionales, podemos considerar que todas son múltiplos enteros de algún número ∂ en R. Así, si existe corte finito, al comenzar con f(e) = 0, ∀e∈E, e será siempre múltiplo de ∂, luego los valores del vector f para cada solución serán también múltiplos de ∂, y f(er) aumenta en cada iteración en un múltiplo de ∂ estrictamente mayor que cero. Este crecimiento al ser el problema acotado se detiene en un número finito de pasos.
Por otro lado, con una implementación como la propuesta por Edmonds & Karp (1972), en la cual las cadenas de aumento se buscan tratando el conjunto de vértices marcados como una COLA y examinando primero todos los arcos incidentes al vértice en el Principio de la Cola antes de pasar a examinar los vecinos del siguiente vértice en la Cola, el procedimiento MARCAR resulta similar al algoritmo de Dijkstra, y aún más eficiente pues para marcar un nuevo vértice basta con que este cumpla las condiciones para una marcación bien sea directa o inversa, sin necesidad de hacer más comparaciones. Esto nos da un orden O (n2) para MARCAR. En cuanto al número de veces que este procedimiento es llamado por FlujoMax, Edmonds & Karp (1972) encuentran una cota O (n3) basandose en la implementación ya mencionada. Con estos resultados, obtenemos una cota O (n5) para el algoritmo de Flujo Máximo.
Si las capacidades de los arcos son números irracionales, es posible que el algoritmo no pare, o peor aún, que converja a soluciones lejanas al óptimo (Ford & Fulkerson, 1962). Esto sin embargo, en los casos reales no ocurre puesto que siempre se pueden tomar aproximaciones racionales lo suficientemente buenas ya que los irracionales no tienen una representación exacta en la computadora.
En el caso que no exista corte finito, esto implica que existe al menos un camino Csp de s a p en el cual todos los arcos tienen capacidad infinita. Siendo finito el número de caminos elementales y estando siempre este camino Csp no
saturado, es seguro que en la primera etapa de la marcación (marcación directa) este camino será encontrado y se detectará al ser ε= infinito para tal camino.