Flujo máximo

Anuncio
Flujo máximo: Redes de flujo y
método de Ford-Fulkerson
Jose Aguilar
b
2
s
d
1
a
3
t
c
2
2
45
3
4
1
3
2
10
5
25
40
55
30
25
50
4
15
Flujo en Redes. Flujo máximo
20
3
Algoritmos de Flujos
Los algoritmos de flujos resuelven el problema de
encontrar el flujo máximo de una fuente a un sumidero
respetando una serie de restricciones.
•
Los flujos se miden como el flujo que sale de un nodo,
si así ocurriera el flujo se considera positivo, en caso
contrario tenemos un flujo negativo.
• La fuente tiene un flujo neto positivo, el sumidero tiene
un flujo neto negativo, y los nodos intermedios en los
caminos que van de la fuente al sumidero tienen un
flujo neto igual a cero.
propiedad de conservación del flujo
fi = fo (por nodo).
Equivalente a las leyes de conservación de la materia
en física y leyes de Kirchoff en electricidad.
Algoritmos de Flujos
Usos: modelado de flujo en tuberías, piezas a través de
líneas de ensamblado, corrientes en redes eléctricas,
información en redes de comunicación, etc.
Una red de flujo G=(N,A) es un grafo dirigido tal que cada arco
(u,v)A posee una capacidad c(u,v)0. Si (u,v)A, c(u,v)=0.
• Se distinguen 2 vértices, el fuente “s” y el destino “t”. Cada vértice
vN esta en algún s~>v~>t.
• El grafo es conexo |A||N|-1
peso de las aristas representa la capacidad máxima de
transportar un flujo.
Algoritmos de Flujos
• Problema: Maximizar la cantidad de flujo desde
un vértice fuente a otro sumidero, sin superar las
restricciones de capacidad.
– Método de Ford-Fulkerson para resolver el problema
de máximo flujo.
Problema del flujo máximo: encontrar la rata máxima a la
cual el material puede ser transportado de una fuente (s) a
un destino (t), sin violar las restricciones de capacidad de la red.
Flujo Máximo
• Restricciones:
– La suma de las entradas de cada nodo interior debe ser igual a
la suma de sus salidas.
– Los valores de flujo en cada arista no pueden superar los
valores máximos.
b
5
G
s
2
d
3
4
1
3
a
t
2
J. Aguilar
c
4
6
Flujo Máximo
• Solución. G: grafo del problema. F: grafo resultante.
G
5
s
b
1
3
a
2
d
F
3
4
t
2
c
4
2
s
b
0
3
a
2
d
3
1
t
2
c
2
• El problema se puede resolver de forma eficiente.
• Posible algoritmo:
– Encontrar un camino cualquiera desde s hasta t.
– El máximo flujo que puede ir por ese camino es el mínimo coste de las
aristas que lo forman, m.
– Sumar m en el camino en F, y restarlo de G.
• Ojo: este algoritmo no garantiza solución óptima.
Redes de flujo
• Digrafo G=(V, E)
• Los pesos de las aristas representan capacidad (c(u,
v)> 0). Si no hay aristas la capacidad es cero.
• Vértices especiales:
fuente s, vértice sin aristas de entrada.
sumidero t, vértice sin aristas de salida.
• El grafo es conectado: Hay un camino entre s y t por
algún vértice intermedio del grafo.
J. Aguilar
8
Redes de flujo
• Un flujo en G es una función real f : VxV   que satisface
las siguientes propiedades:
– Restricción de capacidad: Para todo u, v  V, f (u, v) < c (u, v)
– Antisimetría: Para todo u, v  V, f (u, v) = f (v, u)
– Conservación de flujo: Para todo u  V  {s, t },
• Valor del flujo: | f | =
12 / 12
v2
v3
7/7
10
1/4
v1
s
=
11 / 16
v4
t
=0
El problema del flujo máximo
Se define como: dado G, s (fuente) y t (destino)
encontrar el flujo neto total máximo desde s hasta t
Flujo neto positivo entrando a un nodo v es
uN F(u,v)
y el que sale se define simétricamente.
J. Aguilar
10
Algoritmo de Ford-Fulkerson
Es un método iterativo que depende de tres ideas
importantes:
• Red residual
• Aumento de camino
• Cortes
Usa el teorema max-flow min-cut que caracteriza el flujo
máximo en términos de cortes de la red de flujo.
En cada iteración se va consiguiendo un valor de flujo que
aumenta el camino, es decir, podemos aumentar el flujo en un
camino de s a t. Este proceso se repite hasta que no haya más
posibilidad de aumentar.
J. Aguilar
11
Flujo residual
Es el flujo disponible en una determinada arista una
vez que se ha enviado flujo por ella (en ningún caso el
flujo neto residual debe ser mayor a la capacidad de
dicha arista ni menor que cero).
flujo residual = capacidad – flujo_actual,
Dada una red de flujo G=(N,A) con fuente s y destino t
Sea f el flujo en G, y considere un par de vertices u,v
N.
La cantidad de flujo adicional que se puede verter
sobre u,v es la capacidad residual.
cf(u,v) = c(u,v) – f(u,v)
Red residual
Un camino de flujo residual es aquel camino de la
fuente al sumidero donde todas las aristas en el
camino tienen un flujo residual mayor a cero
red residual consiste en arcos que admiten más flujo
(en ella aparecen los caminos de flujo residual)
Un arco (u, v) aparece en Gf solo si (u,
v)∈A y si hay una flujo neto positivo o
flujo residual de u a v o (v, u)∈A y esta
pasando un flujo actual entre (v, u)
s
G con flujo f
0
11/16
10
1
12/12
1/4
4/4
5
1
5 t
4
15/20
5
10 8
2
3
11/14
7/7
3
2
0
11
12
4/9
| Af | ≤ 2|A|
8/13
Gf
s
4
5
3
7
3
4
15
5
5
t
11
4
Redes residuales
• Para una red de flujo y un flujo, la red residual es el conjunto de
aristas que pueden admitir más flujo.
• Sea una red de flujo G=(V, E) con fuente s y sumidero t. Sea f un
flujo en G y un par de vértices u, v  V. El flujo neto adicional desde
u a v sin exceder la capacidad c(u, v) es la capacidad residual de (u,
v), definida por:
cf(u,v) = c(u,v)  f(u,v)
• La red residual de G inducida por f es Gf = (V, Ef) donde
Ef = {(u,v)  VxV: cf(u, v) > 0}
v2
11 / 14
v4
v2
v3
7
s
3
t
12
v1
Gf
v3
11
1/4
10
s
12 / 12
v1
7/7
G
3
11
v4
t
Aumento de camino
Dada una red de flujo G=(N,A), un camino aumentado p
es un camino simple de s a t en la red residual Gf.
La cantidad máxima de flujo que puede llevarse por los
arcos en un camino aumentado p se denomina capacidad
residual de p, y está dado por:
cf(p) = min {cf(u,v): (u,v)  p}
s
0
11/16
El método busca
repetidamente aumentar
el flujo a través de los
caminos de aumento
hasta alcanzar el
máximo
10
1
12/12
1/4
4/9
3
4/4
G con flujo f
11
8/13
5
2
1
5
t
4
15/20
cf(p)=c(2, 3)=4
5
11 8
2
3
12
11/14
7/7
s
0
4
5
7
3
15
5
5
t
3
11
4
4
Gf con camino
aumentado p
Caminos aumentantes
• Un camino aumentante p en una red de flujo G=(V, E) y flujo f, es
un camino simple de s a t en la red residual Gf.
• Cada arista (u, v) del camino aumentante admite un flujo neto
positivo adicional de u a v sin violar la restricción de capacidad de
la arista.
• Capacidad residual: es la máxima cantidad de flujo neto que se
puede enviar por las aristas de un camino aumentante. Se calcula
por:
cf(p) = min{cf(u,v)  (u,v)  p}
Cf= min{5, 4, 5} = 4
v2
11 / 14
v4
v2
v3
7
s
3
t
12
v1
Gf
v3
11
1/4
10
s
12 / 12
v1
7/7
G
3
11
v4
t
Cortes en redes de flujo
• Un corte (S, T) de una red de flujo G=(V, E) es una partición
del conjunto de vértices V en dos subconjuntos S y T = VS tal
que s  S y t  T.
• Si f es un flujo:
– f(S, T) es el flujo neto a través del corte (S,T).
– c(S, T) es la capacidad del corte (S,T).
• Flujo en una red = flujo neto a través de cualquier corte de la
red.
S
v2
v3
7/7
1/4
10
s
12 / 12
v1
G
T
Corte = ( {s, v1, v2}, {s, v1, v2} )
t
f(s, t) = f(v1, v3) + f(v2, v3) + f(v2, v4) =
12 + (-4) + 11 = 19
11 / 14
v4
c(s, t) = c(v1, v3) + c(v2, v4) = 12 + 14 = 26
Teorema flujo-máximo
mínimo-corte
• Si f es un flujo en una red de flujo G = (V, E) con
fuente s y sumidero t, entonces las siguientes
condiciones son equivalentes:
– f es un flujo máximo en G.
– La red residual Gf no contiene caminos
aumentantes.
– | f | = c(S, T) para algún corte (S, T) de G.
J. Aguilar
18
Teorema max-flow min-cut
s
0
11/16
Corte (S, T)
S={s, 1, 2}
T={3, 4, t}
f(S, T) = 19
c(S, T) = 27
10
1
12/12
1/4
8/13
2
11/14
4/9
7/7
3
4/4
G con flujo f
5
4
15/20
Teorema: El máximo valor de entre todos los flujos en
una red es igual a la capacidad mínima de entre todos
los cortes.
Algoritmo de Ford-Fulkerson
FORD-FULKERSON( f, s)
Para cada arista (u, v) en el grafo
f[u][v] = 0
f[v][u] = 0
Mientras exista un camino de flujo residual entre f y s
incremento = min(cap(u,v) tal que (u,v) está en el
camino p)
para cada arista (u,v) en el camino
f[u][v] = f[u][v] + incremento
f[v][u] = -f[u][v]
J. Aguilar
20
Ejemplo
v2
14
v4
v2
v3
v1
4 / 14
v2
10
4
v4
t
s
4 / 12
4
7
4
10
s
4
7 / 10
8
v1
7
s
10
t
v2
v3
11 / 14
t
v4
v3
7/7
4
10
s
4 / 12
v1
v3
7
12
v1
Flujo
4
Grafo Residual
v4
t
Ejemplo
Flujo
8
3
v2
s
v4
v2
v3
v1
11 / 14
11
v2
11
v4
s
12 / 12
1/4
7
3
t
10
12
3
s
11
v1
v2
v3
7/ 7
t
1/ 4
7
11
3
s
4
12 / 12
v1
v3
10
v1
11 / 14
t
v4
v3
7/7
Grafo Residual
v4
t
Ejemplo y complejidad
Flujo
Grafo Residual
v2
3
11
v4
t
s
v2
v3
7/7
12 / 12
v1
1/4
7
3
11
s
v3
10
12
v1
11 / 14
t
v4
• Para hallar el camino aumentante se puede usar cualquier tipo
de recorrido (BPA o BPP).
• La capacidad de cada arista se puede multiplicar por un factor
de escala para conseguir que sea entera.
• Bajo estas condiciones el algoritmo tiene una complejidad de
O(E| f * |), donde f *es el máximo flujo obtenido por el
algoritmo.
Algoritmo de Ford-Fulkerson
s
0
2
1
2
3
2
1
1
3
1
1
3
4
2
5
t
3
Cmin = 2
s
0
3
2
3
2
1
1
1
1
3
3
4
2
5
t
3
Cmin = 1
s
0
1
1
2
3
1
3
4
2
3
5
t
Cmin = 3
¿Qué pasa si las aristas (4,1) o (3,2) cambian de signo?
Algoritmo de Ford-Fulkerson
•
s
0
2
1
2
1
1
3
1
1
3
4
2
5
t
3
Cmin = 2
s
0
2
3
1
•
3
2
4
2
5
t
3
Cmin = 1
J. Aguilar
1
2
1
1
3
s
0
2
2
1
1
Dos casos
Sin contraflujo: se detiene el algoritmo
en esta iteración=> Fllujo Max.=3
Con contraflujo: aparece ese camino
aumentado
1
1
1
2
2
3
1
1
2
4
2
5
t
Cmin = 1
25
Algoritmo de Ford-Fulkerson
Flujo Máximo
Sin contraflujo
Con contraflujo
2
Dirección del Flujo
2
S
S
s
0
1
1
2
1
2
1
1
1
3
2
2
5
t
4
1
T
T
1
2
Algoritmo de Ford-Fulkerson
fordFulkerson(Nodo: s, t)
{pre: n > 0 }
{pos: n > 0 }
1 [ f(u, v), f(v, u) = 0, 0 ] (u, v) ∈ A
// Inicia f
( ∃ un p de s a t en Gf ) [ cf(p) = min(cf(u, v) : (u, v) está en p
2
[ f(u, v) = f(u, v) + cf(p)
f(v, u) = - f(u, v) ] (u, v) en p
] // Aumenta el flujo a lo largo de p
// por cf (p) hasta que no hayan mas p
J. Aguilar
-u, v: Nodo. Nodos del
grafo.
-Gf: Grafo. Grafo
residual.
-cf: Entero.Capacidad
residual
-p: Camino aumentado
de Gf.
-f: Arreglo(n x n)De
[Entero]. Flujo del arco.
27
Otra idea basada en Corte de la red
de flujo
Un corte (S,T) de la red de flujo G=(N,A) es una partición
de N en S y T=N-S tal que sS y tT.
Si f es el flujo, entonces
• El flujo de red a través del corte (S,T) se define f(S,T)
• La capacidad del corte (S,T) es c(S,T)
• El flujo neto a través del corte (S, T) es f(S, T) = | f |
• El valor de cualquier flujo f en una red de flujos G está
limitado superiormente por la capacidad de cualquier
corte de G.
Extensiones
Redes con varios nodos fuente y varios nodos destino:
Se reduce al anterior colocando dos nodos ficticios
denominados:
•
nodo superfuente s y
•
nodo superdestino t,
Anexar
• un arco (s, si) por cada nodo fuente de G para i = 1, 2,
..., m y
• un arco (tj, t) por cada nodo destino de G para j = 1, 2,
..., n.
Ambos nodos se conectan a los otros nodos con arcos de
capacidad ∞.
Extensiones
s1
s2

S’


t1
T’
s3




s4
s5
t2
Grafo bipartido
Problema interesante que se puede reducir a un problema de flujo
máximo es el del aparejamiento ("matching“) bipartito máximo.
•
Bipartido significa que se pueden identificar en el grafo dos
subconjuntos de vértices L y R de tal manera que uno de los
extremos de las aristas está en R y el otro L.
Las aristas (u,v) donde u y v pertenecen al mismo conjunto no están
permitidas.
N puede ser dividido en N = L U R, L  R = ∅ y todos las aristas
en A van de los nodos de L a los de R.
•
Este tipo de grafos sirve para resolver problemas como el de
asignación de tareas.
• Si suponemos que el conjunto R representa a un grupo de
trabajadores y que L corresponde a un conjunto de tareas,
• Las aristas representan la relación de que un trabajador
puede realizar determinada tarea.
• El problema consiste en asignar la mayor cantidad de tareas
para que sean realizadas por los trabajadores.
Grafo bipartido
Dado un grafo no dirigido G = (N, A), un "matching" es un subconjunto de
aristas M ⊆ A, tal que para todos los nodos v ∈ N, a lo sumo una
arista de M incide en v.
s1
Asignación de
cardinalidad 2
s1
t1
t1
Un "matching" M es
máximo si tiene una
cardinalidad máxima
tal que para cualquier
M' se tiene | M' | ≥ | M |.
s2
s2
s3
t2
s3
t2
s4
s4
t3
t3
s5
s5
L
Asignación de
cardinalidad 3
R
Grafo bipartido
Se puede usar el algoritmo de Ford-Fulkerson para resolver
dicho problema.
Si tenemos el grafo bipartido G = (N, A) se construye el grafo de flujos
G’ = (N’, A’) de la siguiente manera
•
•
•
.
Agregar dos nodos ficticios s y t, N' = N U {s, t}
Los arcos de G' son las aristas de A dirigidas de L a R, más las
aristas de/a los nodos ficticios.
A'= {(s,u) : u ∈ L}U
{(u,v) : u ∈ L,v∈ R,(u,v)∈ A}U
{(v,t) : v∈ R}
Asignar capacidad de 1 a los arcos de A'.
Grafo bipartido
s1
t1
s2
S’
s3
t2
s4
t3
s5
T’
Grafo bipartido
Si M es una asignación ("matching") en G, entonces hay
un flujo de valor entero en G' cuyo valor | f | = | M | y
viceversa.
La cardinalidad de la asignación máxima en un grafo
bipartito G es el valor del flujo máximo en su
correspondiente red de flujo G'.
Descargar