Está en la página 1de 13

ALGORITMOS SOBRE FLUJOS MAXIMOS DE REDES: PREFLOW PUSH Preflow Push es un tipo de algoritmo destinado a solucionar el problema del

flujo mximo en una red de flujos. Las tcnicas de flujo de redes estn orientadas a optimizar situaciones vinculadas a las redes de transporte, redes de comunicacin, sistema de vuelos de los aeropuertos, rutas entre ciudades... y todas aquellas situaciones que puedan representarse mediante una red donde los nodos representan las estaciones o las ciudades, los arcos los caminos, las lneas areas, los cables, las tuberas y el flujo lo representan los camiones, mensajes y fluidos que pasan por la red. Todas estas aplicaciones tienen el objetivo de encontrar la ruta mas corta si es una red de caminos o enviar el mximo fluido si es una red de tuberas. Como el tema escogido para el trabajo es una solucin para el segundo objetivo, no centraremos solamente en esta.
El problema de flujo mximo es uno de los problemas de optimizacin en redes ms extensamente estudiado y tiene numerosas aplicaciones. Este problema fue introducido por Fulkerson y Dantzig en 1955 y resuelto por vez primera por Ford y Fulkerson con su conocido algoritmo de caminos incrementales. Posteriormente Dinic en 1970 introduce el concepto de redes de caminos mnimos, llamadas redes estratificadas. En 1972, Edmonds y Karp [sugieren dos implementaciones polinomiales del algoritmo de Ford y Fulkerson. La primera enva flujo a lo largo de caminos de mayor capacidad residual, la segunda enva flujo a lo largo de caminos mnimos. Hasta este momento, todos los algoritmos de flujo mximo son algoritmos de caminos incrementales. En 1974, Karzanov introduce el concepto de preflujo que utiliza sobre redes estratificadas. A partir de entonces, numerosos autores han diseado algoritmos, como que el que nos interesa tratar.

Antes, que nada, para empezar, notamos que es necesario refrescar la terminologa y los conceptos bsicos sobre redes de flujos, ya que sino, difcilmente llegaremos a entender el comportamiento del algoritmos que estamos tratando. Una red de flujo es un digrafo G=(V,E) con una funcin de capacidad c : E + y dos vrtices distinguidos, llamados fuente y sumidero, que tiene asignada una capacidad no negativa c ij a cada arco (v i , v j ) del digrafo. A continuacin vemos un ejemplo de red de flujos, donde el vrtice nmero 1 correspondera a la fuente y el vrtice etiquetado con un 6 correspondera al sumidero.

Un flujo en una red G=(V,E) con capacidad c es una funcin f :V x V que cumple las siguientes condiciones: Acotacin: f (u , v )c (u ,v ) para todo u , vV , es decir, el flujo a travs de un arco no puede exceder la capacidad del mismo. Antisimetra: f (u , v )= f ( v , u) para todo u , vV , es decir, de un vrtice u a otro v le corresponde un flujo igual pero de signo contrario de v hacia u. Conservacin de flujo: Si u s ,t , entonces vV f ( u , v)=0 , es decir, lo que llega debe ser igual a lo que sale. Llamamos Valor de flujo V(f) a la suma de los flujos que entran en el sumidero.

Si f es un flujo en una red G=(V,E) con capacidad c f : E + entonces el grafo residual es G f =(V , E f ) , donde E f ={(u , v )E : c(u , v)> f (u , v)} y la capacidad c f : E f + ' se define como c f (u ,v )=c (u ,v ) f (u ,v ).

Un corte es una particin del conjunto de vrtices de una red G=(V,E) en dos subconjuntos disjuntos S y T, de tal modo que sS y t T . La capacidad del corte (S,T) es c (S , T )=cS , yT c ( x , y ) .

Lema: si f es un flujo y (S,T) es un corte en una red G=(V,E) con capacidad c entonces f (S ,T )c ( S ,T ) . Propiedades Fundamentales: Si f es un flujo en una red G=(V,E) entonces: 1. f(X,X)= 0 para toda X V 2. f(X,Y)= -f(Y,X) para toda X , Y V 3. Si X ,Y , ZV y X Y = , entonces f ( Z , X Y )= f (Z , X )+ f (Z ,Y ) . 4. Si s , t X V entonces f(X,V)=f(V,X)= 0.

f ( X Y , Z )= f ( X , Z )+ f (Y , Z ) y

Si f es un flujo en una red G=(V,E) y (S,T) es un corte, entonces f(S,T)=V(f). Si f es un flujo en una red G=(V,E) y (S,T) es un corte, entonces V ( f )c (S , T )

Si f es un flujo en una red G=(V,E), s = u0,u1,...,un-1,un=t es un camino de s a t en el grafo residual Gf y h es el flujo asociado a ese camino, entonces f + h es un flujo en G y V(f + h) = V(f) + V(h). Sea f un flujo en una red G=(V,E) con capacidad c. Entonces las siguientes afirmaciones son equivalentes: 1. f es un flujo mximo. 2. En Gf no hay ningn camino de s a t. 3. Existe un corte (S*,T*)=V(f). 4. mn{c(S,T):(S,T)corte}=V(f).

Algoritmos basados en pre-flujos: Como hemos comentado antes, estos algoritmos fueron introducidos por (Karzanov-Goldberg-Tarjan) y se basan en una idea muy intuitiva al razonamiento de todo el mundo. La idea es la siguiente: Por que no saturar al mximo los arcos de la fuente y, sucesivamente, desde los nodos mas adyacentes a la fuente hasta el sumidero, para mas tarde ir regulando estas llaves hasta que el flujo inicial pueda circular sin contencin? Para empezar, definamos una serie de conceptos bsicos: Un preflujo es un conjunto de arcos con flujo positivo tales que: el flujo en cada arco no excede la capacidad del arco el flujo entrante en cada vrtice interno es superior al flujo saliente. Notemos que, con esta definicin de preflujo, no se cumple la ley de la conservacin. Todo nodo distinto al nodo fuente y al nodo sumidero recibe el nombre de nodo o vrtice interno. Un vrtice es activo cuando es un vrtice interno cuyo flujo entrante es superior a su flujo saliente (flujo neto positivo). Ese flujo neto positivo en vrtices internos se llama en este contexto exceso. A continuacin tenemos un ejemplo clarificador sobre el concepto de exceso que queremos dar a entender:

Los algoritmos de preflujo, bsicamente, siguen este procedimiento iterativo, donde acabamos obteniendo un flujo mximo: 1. Se escoge un vrtice activo, es decir, con exceso. 2. Si hay un arco no saturado:

Empujamos el exceso del vrtice por el arco no saturado. Sino: Hacemos regresar el exceso por una arco entrante, siempre que tenga flujo positivo. 3. Volvemos al punto 1 mientras hayan vrtices en activo.

Hace falta destacar que en estos algoritmos hemos de suponer que el nodo fuente y el sumidero no pertenecen a los activos y que cada vez podrn aparecer nuevos vrtices, que estarn manejados por una cola generalizada. Poco a poco queremos llegar a un flujo admisible Veamos un ejemplo sencillo sobre la idea principal que queremos transmitir sobre el funcionamiento de los algoritmos de preflujo y el bombeo de preflujo. En l, podemos observar lo siguiente:

Si partimos de la figura anterior, donde tenamos una red con el vrtice 0 y el 5 en exceso, entonces estos 2 estarn activos. Ntese que el vrtice 6 (el sumidero) tambin est en exceso, pero como hemos comentado antes, en estos algoritmos, solo se consideran activos los nodos internos, por lo tanto, ni la fuente ni el sumidero podrn entrar como activos.

Cogemos el nodo 0 de la lista de nodos activos. Entonces, hemos de proceder a bombear el preflujos por alguno de sus arcos. Como el arco que va de 0-5 no est saturado, podremos enviar 2 unidades ms por l, hasta saturarlo. Ahora bien, una vez que este est saturado, no encontramos que aun tenemos 2 unidades de exceso, que hacemos? Enviarlo de regreso por el arco que va de 5-0 restndole 2 unidades. Esto conlleva que cambie la situacin en la que estabamos y el nodo 5 pase a tener 7 de exceso.

A continuacin, cogemos el nodo 5 de la lista y procedemos de manera anloga, enviando todo el exceso por el arco que va hacia el sumidero. En este caso podemos enviar todo el exceso por este arco debido a que tiene una capacidad suficiente para no saturarse.

Tras este ejemplo podemos ver que se nos plantean una serie de cuestiones. Cuando hemos empujado el mximo flujo por la fuente, tendremos el mximo flujo posible, pero probablemente tendremos nodos activos cuyo equilibrio tendremos que restaurar. Aqu est el problema, Que nodos y que arcos escogemos para empujar el preflujo y as restaurar el equilibrio? La respuesta es mediante un funcin de altura que nos gue en esta eleccin Una funcin de altura h, para un flujo dado en una red de flujo, es un conjunto de valores h(i ) para 1 y |V| asociadas a cada vrtice, tal que:

h(t) = 0 h(u) <= h(v) + 1 si u-v es un arco del grafo residual

Un arco es elegible si y solo si h(u) = h(v) + 1. La funcin de altura nos ha de guiar en la eleccin de los arcos de la siguiente manera: si la altura de un vrtice activo inferior a la altura de su fuente, es posible que podamos empujar flujo de este vrtice al pozo, mientras que si es superior a la altura de la fuente, el exceso de este vrtice lo hemos de mandar de regreso ya que los arcos que van al sumidero estarn saturados. La eleccin de la funcin de altura es una de las partes ms importantes, debido a que ser la que nos indicar cuando hemos de regresar el flujo por los arcos hacia la fuente. Nos interesa que la opcin de regresar el flujo sea la ltima a usar, digamos que el ltimo recurso de todos. Una vez claros los conceptos de preflujo y funcin de altura, empecemos a comentar el algoritmo en si.

De algoritmos preflujo tenemos diversas variantes, pero bsicamente todos se basan en el siguiente algoritmo genrico:

Algoritmo Genrico de preflujo: Este algoritmo recibe como entrada una red G=<V,E> y nos da como salida la misma red con valores de ajustado al mximo valor de flujo. Para su ejecucin, usaremos la red residual G', una estructura donde guardar los nodos activos Ah, cuyo fin es implantar la funcin de altura. A cada nodo u de V le asociaremos su valor de h(u), el valor devuelta por la funcin de altura que tengamos definida. 1. Calcular la red residual G'. 2. Asignar a cada nodo u su valor h(u). 3. Ah = . (inicialmente no tenemos nodos activos) 4. e=( s , u)s (Pre-flujo inicial de arcos del nodo fuente) a) f(e) = cap(e) (empujamos el mximos flujo por los arcos, los saturamos). b) Si ut Ah = A h{u } (en el caso de que no sea el sumidero, lo aadimos a la estructura donde guardamos los nodos activos). 5. Mientras Ah (procedemos a equilibrar los nodos activos) a) Seleccionamos un nodo activo uA h , A h= Ah {u} b) e u , e E ' (aristas del grafo residual)( Procedemos a empujar preflujo de u) i. Si e = (u, v) es un arco elegible; es decir , si h(u) = h(v) + 1 A) fp = min(exceso(u), capacidad(e) f(e)) (Flujo a empujar sobre el arco). B) f(e) = fp . C) exceso(u) = exceso(u) fp. D) Si u s y ut Ah = Ah {v } c) Si exceso(u)> 0 h(u)=h(u)+ 1, A h= Ah {u} (u es an nodo activo con un incremento en la funcin de altura) El comportamiento del algoritmo es el siguiente: Inicialmente, empuja todo el posible preflujo por los arcos que surgen de la fuente. Paulativamente, segn el orden en que van apareciendo los nodos activos, el exceso se va propagando hasta que llegamos al sumidero. Cuando el sumidero ya no da ms de si y que saturada, entonces procedemos ha retornar el exceso a la fuente drenndose, si es posible, en aquellos que tengan capacidad. Aqu estara el smil que hemos hecho con las llaves de paso y ir regulndolas poco a poco. Finalmente, cuando el exceso regresa a la fuente, este se le resta a sus arcos hasta que el flujo se vuelva estable. Al llegar a este estado, el flujo sera el mximo posible y no tendremos ms nodos activos en nuestra estructura. En la instruccin 5bi se determina si empujamos o no preflujo por cada arco saliente del nodo actualmente seleccionado. Si no se logra empujar todo el exceso, entonces el nodo es colocado de nuevo en la estructura de nodos activos, pero con un valor h(u) incrementado en una unidad. Esto es lo que permite que eventualmente otra iteracion sobre el mismo nodo vea como elegible a un arco que una iteracin pasada no lo fue y, en lugar de avanzar el preflujo hacia el sumidero, se retroceda hasta el fuente, pudiendo ocurrir,

incluso, que se disminuyan los flujos emitidos por la fuente.

De las funciones de altura, podemos extraer las siguientes propiedades: Para todo flujo y una funcin de altura asociada, la altura de cualquier vrtice es inferior al tamao del camino mas corto de este vrtice al pozo en la red residual Demostracin: para todo vrtice u, se puede seguir el camino ms corto de u a t h(u) = h(u1) h(u2) + 1 h(u3) + 2 ... h(ud ) + d 1 Como h(ud ) = h(t) = 0, podemos decir que la propiedad es cierta. Si la altura de un vrtice es superior a |V|, entonces no existe camino desde este vrtice hasta el pozo en la red residual.

Del algoritmo de preflow push, la siguientes: Sea G=<V,E> una red de flujos, con red residual G'=<V,E'>, entonces el algoritmo genrico de preflujo conserva la validez de la funcin de altura. Demostracin: La funcin se modifica solo si no hay arco u elegible. O sea, en el vrtice elegido, para todos los arcos u v presentes en la red residual, tenemos h(u) < h(v) + 1. Ya que aumentamos h(u) de slo 1, tenemos al final para todos esos arcos u v, h(u) <= h(v) + 1. Para los arcos entrantes, es obvio que se mantiene. Ninguna otra desigualdad esta involucrada.

Durante la ejecucin del algoritmo genrico, uV h(u)< 2V Demostracin: Considerar los vrtices activos u. Por la propiedad precedente, hay un camino dirigido de este vrtice hacia la fuente. Entonces: h (u)h( s)+ d ush ( s)+ V2 La altura h(s) queda constante y h( s)V entonces h(u)2V2 Los no-activos son en el peor caso 1 unidad mas que cuando estaban activos El algoritmo de preflow-push s encuentra un flujo mximo. Demostracin: Remarcar que cuando un vrtice u esta activo, se empuja su exceso hacia arcos elegibles, hacindole inactivo. Si se reactiva, tiene que reenviar de regreso una parte del flujo empujado. Eso implica que la altura de ese vrtice haya aumentado, y eso llevara a una contradiccin si la secuencia de vrtices activos seleccionados no es cotada. Entonces, se acaba en un numero finito de iteraciones; cuando se acaba, tenemos un flujo positivo (ya que no hay vrtices activos); ademas, como no hay camino dirigido de la fuente al pozo en la red residual, tenemos el flujo mximo. Durante la ejecucin de ese algoritmo, existe en la red residual un camino dirigido desde cada vrtice activo hacia la fuente, y no existe camino

dirigido de la fuente hacia el pozo. Demostracin: Utilicemos la recurrencia: inicialmente, los nicos vrtices activos son los vrtices u destinaciones de los arcos salientes de s. Para cada uno de esos, hay un arco en la red residual hacia s (por tener flujo s u positivo). Ademas no hay arcos s v. Luego, la fuente se puede alcanzar desde los vrtices activos porque esos vrtices activos son creados por aadir flujo positivo en arcos elegibles: se crea un arco en la red residual de este nuevo vrtice hacia el inicial. Para estar alcanzado desde s, se necesita empujar flujo positivo por un arco de regreso a s, u s. Eso implica h(u) > h(s). De la misma manera, se puede mostrar que todo vrtice alcanzable desde s tiene que verificar h(u) > h(s), pero h(t) = 0. . . Ejemplos de funciones de altura: Como hemos comentada, escoger una buena funcin de altura es esencial para evitar clculos innecesarios, a continuacin, mostramos algunas funciones de altura posibles: h(u)=V si u= s h(u )=0 si us Aunque esta inicializacin es vlida, tiende a hacer al algoritmos extracciones innecesarias, extracciones de nodos sin arcos elegibles. Esto es debido a que tras V + 1 iteraciones, uno de los nodos adyacentes a la fuente alcanza el valor V + 1 y se vuelve elegible. Una inicializacion ms interesante consiste en asignarle la longitud del camino mnimo desde el nodo que estamos tratando hasta el sumidero. Este, puede ser encontrado fcilmente mediante un recorrido en amplitud, que como ya sabemos, tiene coste O(E), siendo E el conjunto de los arcos. As pues: h(u )=0 si u=t (sumidero) h(u)= BFS (u) enotro caso Posible implementaciones del algoritmo generico: Como hemos comentado, la mayora de los algoritmos preflujo se basan en el algoritmo genrico que hemos comentado anteriormente, aunque, como es lgico, varan en la manera de usarlo, as como en las estructuras de datos que usan. A continuacin citaremos algunas posibles implementaciones. Como se ha comentado, el orden en que se empuja el preflujo a traves de los vertices incide en gran parte en el rendimiento que acaba teniendo en el algoritmo. As pues, si nuestra intencin es hacer que el preflujo alcance cuanto antes posible al sumidero, tendremos que optar por implementar el algoritmo usando una cola de prioridades con poltica FIFO, es decir, que el elemento que nos retorna es el que lleva ms tiempo en la cola, para almacenar los nodos activos. De aqu el algoritmo preflujo con empuje de preflujo FIFO. Esta resulta ser la implementacion ms popular. En cuanto al coste de esta implementacion, nos encontramos que es O(|V|3).

Otra implementacion que da mejores resultados consiste en mirar los nodos activos en amplitud. Se basa en la siguiente idea: hemos de empujar todo el preflujo posible antes de avanzar un nivel, por lo tanto, visitaremos los nodos de los mas cercanos a la fuente a los mas cercanos al sumidero. Para esta implementacin necesitaramos el uso de otra cola de prioridades, pero que tuviese un comportamiento que nos retornase el nodo mas cercano a la fuente, es decir, el que tenga mayor altura. Su coste, en el peor de los casos, sera O(V2 A) . Una ultima implementacion posible que da buenos resultados es usar el algoritmo genrico usando una cola de prioridades que nos retorne un elemento de manera aleatoria. Esto es debido a que es muy probable extraer nodos activos sin arcos elegibles. Estas extracciones no fructferas dependen en gran parte por la suerte en el orden de visita de los arcos, la suerte en la que se presenten los valores de estos... Por lo tanto, no resulta tan descabellado introducir esta factor en el algoritmo. Conclusiones: Una vez estudiado a fondo este tipo de algoritmos, podemos ver que siguen una idea ms intuitiva y ms fcil de comprender que el algoritmo de FordFulkersson, pero que su bondad depende de diversos factores. Muchos de estos factores, a excepcin de la suerte, son controlables por nosotros a la hora de seleccionar las estructuras de datos adecuadas y definir las funciones correctamente. As pues, est en nuestras manos el hacer una buena funcin de altura que cumpla las restricciones y no nos haga visitar nodos no fructferos y tambin el escoger una buena estructura de datos donde guardar los nodos activos. De esto depender en gran parte el orden de visita de los vrtices y el coste que finalmente adquiera el algoritmo.

También podría gustarte