Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Marzo 2008
,
J.B. Hayet
1 / 46
Outline
,
J.B. Hayet
2 / 46
Flujo m
aximo: una alternativa
Outline
,
J.B. Hayet
3 / 46
Flujo m
aximo: una alternativa
Caminos aumentadores
La idea basica del metodo de Ford-Fulkerson es ir mejorando un
flujo positivo (admisible) por iteraciones, buscando cada vez un
nuevo camino aumentador que incluya arcos no saturados que se
pueda aumentar o arcos de flujo no nulo que se pueda bajar
Ahora, que tal si trabajaramos sobre flujos que no sean
necesariamente admisibles, pero que se puedan hacer admisibles
empujando flujo en unos vertices?
Algoritmos basados en preflujos: idea de Goldberg y Tarjan en
los 80s
,
J.B. Hayet
4 / 46
Flujo m
aximo: una alternativa
Preflujos
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 vertice interno es superior al flujo
saliente
,
J.B. Hayet
5 / 46
Flujo m
aximo: una alternativa
Preflujos
p :V V R
satisfaciendo:
1
condicion de capacidad
0 p(v , w ) c(v , w )
w V
6 / 46
Flujo m
aximo: una alternativa
Preflujos
1
9 /10
8 /10
3 /10
2 /15
Exceso en 0: 4
Exceso en 5: 3
Activos: 0 y 5
,
J.B. Hayet
7 / 46
Flujo m
aximo: una alternativa
Preflujos
Remarcar que:
flujo positivo admisible no hay vertices activos
Vamos a intentar partir de una situacion con vertices activos y ir
apagandoles poco a poco
,
J.B. Hayet
8 / 46
Flujo m
aximo: una alternativa
Preflujos
Idea de los algoritmos basados en preflujos, iterativamente:
elegir un vertice con exceso (activo)
se supone que s y t no son de los activos
empujar este exceso, si se puede, a lo largo de un arco no
saturado
si no se puede, hacerlo regresar por arcos entrantes (si tienen
flujo positivo)
cada vez, podran aparecer nuevos vertices; esos vertices estan
manejados por cola generalizada
al final te sale un flujo maximo
Poco a poco queremos llegar a un flujo admisible
,
J.B. Hayet
9 / 46
Flujo m
aximo: una alternativa
Preflujos
1
9 /10
10/10
+2
-2
1 /10
2 /15
Exceso en 0: 0
Exceso en 5: 7
Activos: 5
,
J.B. Hayet
10 / 46
Flujo m
aximo: una alternativa
Preflujos
1
9 /10
10/10
1 /10
9 /15
+7
Exceso en 0: 0
Exceso en 5: 0
Activos: ya no hay
Casi el flujo maximo. . . Que hubieramos hecho para tener el maximo ?
,
J.B. Hayet
11 / 46
Flujo m
aximo: una alternativa
Preflujos
Observaciones a partir del ejemplo:
Se va a necesitar empezar por rellenar los arcos saliendo de la
fuente a plena capacidad
Empujar necesita definir una poltica para determinar cuales son
los arcos en los que empuja
Se usa otra vez la capacidad residual para saber si un arco es
aceptable como arco donde empujar flujo: flujo que aumentar
para saturar un arco o flujo que disminuir para aprovechar de
una desviacion favorable
,
J.B. Hayet
12 / 46
Flujo m
aximo: una alternativa
Preflujos
,
J.B. Hayet
13 / 46
Flujo m
aximo: una alternativa
Funci
on de altura
Una funcion de altura h, para un flujo dado en una red de flujo,
es un conjunto de valores h(i) para 1 i |V | asociadas a
cada vertice, tal que:
h(t) =
0
h(u) h(v ) + 1
,
J.B. Hayet
14 / 46
Flujo m
aximo: una alternativa
Funci
on de altura
Una funcion mas interesante:
h(i) = di donde di es la distancia mnima en arcos hasta t
Verificamos que:
h(t) = 0
si u y v estan en el grafo residual, tenemos o h(u) = h(v ), o
h(u) = h(v ) 1, o h(u) = h(v ) + 1, o sea
h(u) h(v ) + 1
Es otra funcion extrema: la altura de cada vertice es la maxima
que se puede definir
,
J.B. Hayet
15 / 46
Flujo m
aximo: una alternativa
Funci
on de altura
Propiedad: para todo flujo y una funcion de altura asociada, la altura
de cualquier vertice es inferior al tamano del camino mas corto de
este vertice al pozo en la red residual
La prueba es inmediata: para todo vertice u, se puede seguir el
camino mas corto de u a t
h(u) = h(u1 )
...
h(u2 ) + 1
h(u3 ) + 2
h(ud ) + d 1
,
J.B. Hayet
16 / 46
Flujo m
aximo: una alternativa
Funci
on de altura
Funcion extrema:
t es de altura 0
luego, los vertices v conectados por arcos v t en el grafo
residual podran ser de altura 0 o 1 y estan con la altura
maxima, 1
luego, los vertices v conectados a vertices conectados a t
podran ser de altura 1 o 2 y estan con la altura maxima, 2
O sea, los vertices estan ubicados por la funcion de altura lo mas
lejos posible
,
J.B. Hayet
17 / 46
Flujo m
aximo: una alternativa
Funci
on de altura
Propiedad: si la altura de un vertice es superior a |V |, entonces no
existe camino desde este vertice hasta el pozo en la red residual
Si hay un camino (simple) del vertice hasta t, la propiedad previa dice
que este camino es de tamano superior a |V |, lo que no sera posible
Por que funciones de altura? Si la altura de un vertice activo esta
inferior a la altura de la fuente, es posible que podamos empujar
flujo de este vertice al pozo
superior a la altura de la fuente, el exceso de este vertice tiene
que estar empujado de regreso
,
J.B. Hayet
18 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
De aqu el algoritmo preflow-push:
Inicializar con flujo cero, cualquier funcion de altura
Rellenar a plena capacidad los arcos conectados a la fuente
Luego iterar, mientras hay vertices activos:
elegir un vertice activo
empujar flujo adentro de un arco elegible (por la funcion de
altura)
si no hay de esos arcos, aumentar la altura de 1
,
J.B. Hayet
19 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Como en el caso de Ford-Fulkerson, es un algoritmo generico, que
tiene luego variantes que van a diferir de:
la funcion de altura inicial
la manera de elegir cual vertice activo
la manera de elegir el arco elegible
las cantidades de flujo que empujar en los arcos elegibles
O sea puede haber muchas variaciones alrededor de este cuadro!
Idea: empujar lo maximo de flujo a partir de la fuente hacia el pozo;
cuando no se puede, regresarlo a la fuente
,
J.B. Hayet
20 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
,
J.B. Hayet
21 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Propiedad: durante la ejecucion de ese algoritmo, existe en la red
residual un camino dirigido desde cada vertice activo hacia la fuente,
y no existe camino dirigido de la fuente hacia el pozo
Por recurrencia: inicialmente, los unicos vertices activos son los
vertices 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 vertices activos porque esos vertices activos son
creados por anadir flujo positivo en arcos elegibles: se crea un arco en
la red residual de este nuevo vertice 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 vertice alcanzable desde s tiene que verificar
h(u) > h(s), pero h(t) = 0. . .
,
J.B. Hayet
22 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Propiedad: durante la ejecucion de ese algoritmo, las alturas son
siempre abajo de 2|V |
Considerar los vertices activos u. Por la propiedad precedente, hay un
camino dirigido de este vertice hacia la fuente. Entonces:
h(u) h(s) + dus h(s) + |V | 2
La altura h(s) queda constante y h(s) |V | entonces
h(u) 2|V | 2
Los no-activos son en el peor caso 1 unidad mas que cuando estaban
activos
,
J.B. Hayet
23 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Propiedad: el algoritmo de preflow-push s encuentra un flujo maximo.
Por que se acaba? Remarcar que cuando un vertice u esta activo, se
empuja su exceso hacia arcos elegibles, haciendole inactivo. Si se
reactiva, tiene que reenviar de regreso una parte del flujo empujado.
Eso implica que la altura de ese vertice haya aumentado, y eso
llevara a una contradiccion si la secuencia de vertices 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 vertices activos); ademas, como no hay camino dirigido de la
fuente al pozo en la red residual, tenemos el flujo maximo.
,
J.B. Hayet
24 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
,
J.B. Hayet
25 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo de funcion de alturas inicial: usar un BFS sobre el grafo
reverso del inicial:
2
/11
/4
/10
1
/9
0
/6
/8
/3
0
2
1
/15
,
J.B. Hayet
26 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
,
J.B. Hayet
27 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
,
J.B. Hayet
28 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
2
/11
/4
/10
1
/9
0
/6
/8
/3
0
2
1
/15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
2
11 /11
10 /10
1
0 /9
FIFO:
0-4
0 /4
0
0 /6
0 /8
0 /3
0
2
1
0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
2
11 /11
0 /4
10 /10
1
9 0 /9
FIFO:
0-4
4-2-5
0
0 /6
0 /8
1 0 /3
0
2
1
0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32
11 /11
4 0 /4
10 /10
1
9 0 /9
FIFO:
0-4
4-2-5
2-5-4
0
0 6 /6
0 /8
1 0 /3
0
2
1
0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32
11 /11
4 0 /4
10 /10
1
9 0 /9
FIFO:
0-4
4-2-5
2-5-4
5-4
0
0 6 /6
0 /8
1 0 /3
0
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32
11 /11
4 0 /4
10 /10
21
9 0 /9
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
0 6 /6
8 0 /8
1 0 /3
0
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
11 /11
4 0 /4
10 /10
21
9 0 /9
0
0 6 /6
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
8 0 /8
1 0 /3
0
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
11 /11
1
10 /10
4 0 /4
3 21
9 0 /9
2
0
0 6 /6
8 0 /8
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
1 0 /3
0
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
1011 /11
1
10 /10
4 0 /4
3 21
9 0 /9
2
0
0 6 /6
8 0 /8
1 0 /3
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
5
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
1011 /11
1
10 /10
4 0 /4
3 21
9 40 /9
2
0
0 6 /6
8 0 /8
1 0 /3
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
5
0
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
1011 /11
1
10 /10
4 0 /4
3 21
9 40 /9
32
0
0 6 /6
8 0 /8
1 03 /3
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
5
0
2-0
2
1
7 0 /15
6
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
1011 /11
1
10 /10
4 0 /4
3 21
9 40 /9
32
0
0 6 /6
8 0 /8
1 03 /3
0
2
1
7 90 /15
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
5
0
2-0
0
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
1011 /11
1
10 /10
4 0 /4
3 21
9 40 /9
3 24
0
0 6 /6
8 0 /8
1 03 /3
0
2
1
7 90 /15
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
5
0
2-0
0
0
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Ejemplo:
32 4
1011 /11
1
10 7 /10
4 0 /4
3 21
9 40 /9
3 24
0
0 6 /6
8 0 /8
1 03 /3
0
2
1
7 90 /15
FIFO:
0-4
4-2-5
2-5-4
5-4
4-5
5-4
4-5
5
0
2-0
0
0
,
J.B. Hayet
29 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Con cola generalizada (que evita duplicados de vertices)
t e m p l a t e < c l a s s Graph , c l a s s Edge> c l a s s MAXFLOW
{ const Graph &G ;
int s , t ;
v e c t o r <i n t > h , wt ; // H e i g h t s , e x c e s s e s
void i n i t h e i g h t s ( ) ;
public :
MAXFLOW( const Graph &G , i n t s , i n t t ) : G(G ) ,
s ( s ) , t ( t ) , h (G . V ( ) ) , wt (G . V ( ) , 0 ) {
initheights ();
GQ gQ(G . V ( ) ) ;
gQ . p u t ( s ) ; wt [ t ] = (wt [ s ] = MG . V ( ) ) ;
w h i l e ( ! gQ . empty ( ) ) {
i n t v = gQ . g e t ( ) ;
typename Graph : : a d j I t e r a t o r A(G , v ) ;
,
J.B. Hayet
30 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
31 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Complejidad:
En el peor caso, O(|V |2 |A|) para la version mas generica
En el caso de cola FIFO, ese resultado es mas facilmente
establecido
Suponemos que requerimos checar si un arco esta o no en el
grafo residual, con una representacion explcita del grafo residual
podramos ir hasta O(|V |3 )
,
J.B. Hayet
32 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Complejidad, caso FIFO:
remarcar la subdivision en fase del procesamiento de la FIFO
considerar = 0 si no hay vertices activos, o igual a la altura
maxima sino. Sea tambien h0 (s) la altura de la fuente:
= h0 (s) inicialmente, se cancela al final.
Fases en que un vertice aumenta de altura: 2|V |2 h0 (s)
En las otras fases, baja de al menos uno (empujamos flujo
hacia vertices de altura inferior)
Entonces en el peor caso, tendremos 2|V |2 h0 (s) incrementos,
a partir de h0 (s), y 2|V |2 decrementos, o sea 4|V |2 fases
,
J.B. Hayet
33 / 46
Flujo m
aximo: una alternativa
Algoritmo de preflow-push
Unos mejoramientos:
como evitar de reiterar varias veces como en el ejemplo pasajes
de incrementacion?
otros esquemas que FIFO, en particular estrategia tomando el
vertice activo maspalto (necesita cola de prioridad): probado en
peor caso O(|V |2 |A|)
,
J.B. Hayet
34 / 46
Outline
,
J.B. Hayet
35 / 46
Flujo m
aximo, un problema de referencia
,
J.B. Hayet
36 / 46
Redes generalizadas
Una red generalizada contiene multiples fuentes y multiples pozos. La
equivalencia es trivial:
/0.5
4
/0.3
/0.2
5
/0.6
/0.8
3
/0.3
/0.3
/0.7
/0.4
/0.2
/0.2
6
2
/0.3
/0.2
9
,
J.B. Hayet
37 / 46
Redes generalizadas
Una red generalizada contiene multiples fuentes y multiples pozos. La
equivalencia es trivial:
/1.9
/0.5
/0.5
4
/0.3
/0.2
5
/0.6
/0.8
/0.3
/0.3
/0.7
/0.4
/0.2
/0.2
6
2
/0.3
/0.2
/0.8
t
,
/0.5
J.B. Hayet
37 / 46
V
ertices con capacidades
Otro problema clasico, es el de maximizacion de un flujo en una red
de flujo donde los vertices tambien tienen capacidades. La
equivalencia es trivial:
/.8
/0.5
/0.6
/.7
5
/.4
/0.3
/0.7
/0.4
/0.2
/.8
/.6
6
,
J.B. Hayet
38 / 46
V
ertices con capacidades
Otro problema clasico, es el de maximizacion de un flujo en una red
de flujo donde los vertices tambien tienen capacidades. La
equivalencia es trivial:
1bis
/.8
/0.5
/0.6
5bis
3bis
/.7
5
/.4
/0.3
/0.7
/0.4
6bis
2
2bis /0.2
/.8
/.6
6
,
J.B. Hayet
38 / 46
Redes aciclicas
Un problema interesante es encontrar un flujo maximo en una red
aciclica. La ausencia de ciclo hara el problema mas facil?
Es menos evidente, pero otra vez los problemas son equivalentes! No
solo el caso aciclico se reduce al caso general, la reciproca es verdad!
1
/8
/3
3
0
/3
/6
/4
,
J.B. Hayet
39 / 46
Redes aciclicas
/14
/0
/4
/6
/3
/24
/24
/8
/24
/6
/24
/4
/3
7
6
/14
/4
/0
,
J.B. Hayet
40 / 46
Redes aciclicas
,
J.B. Hayet
41 / 46
Redes aciclicas
,
J.B. Hayet
42 / 46
Redes no-dirigidas
Tenemos en este caso una reduccion relativamente simple, que
permite expresar un problema de busqueda de circulacion maxima en
un grafo no dirigido en terminos de circulacion maxima dirigida.
Problemas tal vez mas naturales
1
/6
/8
/3
0
/3
/6
/4
2
,
J.B. Hayet
43 / 46
Redes no-dirigidas
Tenemos en este caso una reduccion relativamente simple, que
permite expresar un problema de busqueda de circulacion maxima en
un grafo no dirigido en terminos de circulacion maxima dirigida.
Problemas tal vez mas naturales
1
/6
/8
/3
0
/3
/6
/4
2
,
J.B. Hayet
43 / 46
Flujos realizables
Problema en que se asigna una ponderacion a cada vertice: positiva
(vertice proveedor) o negativa (vertice consumidor). Un flujo es
realizable ssi la diferencia entre su flujo saliente y su flujo entrante es
igual a esta ponderacion. Se supone que la suma de las
ponderaciones es nula (globalmente la demanda y la oferta se
equilibran) Existe o no tal flujo en un grafo dirigido (y siempre con
las restricciones de capacidad)? Este problema se puede reducir al
problema de flujo maximo. Es un problema clasico de logstica: pesos
positivos son almacenes, pesos negativos los puntos de venta;
queremos que todos los vertices sean satisfechos.
,
J.B. Hayet
44 / 46
Flujos realizables
(7)
1
/8
(-1)
/3
0
(2)
/6
/3
/4
2
(-8)
,
J.B. Hayet
45 / 46
Flujos realizables
s
(7)
1
/8
(-1)
/3
0
(2)
1
/6
/3
/4
t
2
(-8)
,
J.B. Hayet
45 / 46
Emparejamiento bipartito
Como ya vimos, el problema de emparejamiento bipartito se reduce al
problema de flujo maximo:
1
,
J.B. Hayet
46 / 46
Emparejamiento bipartito
Como ya vimos, el problema de emparejamiento bipartito se reduce al
problema de flujo maximo:
1
/1
/1
2
/1
/1
/1
3
/1
/1
/1
/1
0
/1
/1
6
,
J.B. Hayet
46 / 46