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 vN 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 uN 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 = VS 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 sS y tT. 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'.