Universidad de Los Andes Facultad de Ingeniera Postgrado

  • Slides: 46
Download presentation
Universidad de Los Andes Facultad de Ingeniería Postgrado en Computación Analisis y Diseño de

Universidad de Los Andes Facultad de Ingeniería Postgrado en Computación Analisis y Diseño de Algoritmos Tema: Grafos 3 ra Parte Andrés Arcia

Caminos Cortos en Todos los Pares de Arcos • Dado un grafo dirigido G=(V,

Caminos Cortos en Todos los Pares de Arcos • Dado un grafo dirigido G=(V, E) con una función de peso w: E R. Se desea encontrar todos los caminos más cortos (de menor peso) entre todos los pares (u, v) V.

¿Cómo resolver el problema? En una primera instancia utilizando algún algoritmo de caminos cortos

¿Cómo resolver el problema? En una primera instancia utilizando algún algoritmo de caminos cortos desde un solo vértice, |V| veces, una vez para cada vértice. Si todos los arcos son positivos Dijkstra. Luego: • Utilizando arreglos para las colas de prioridad O(V 3+VE) = O(V 3) • Utilizando heaps binarios O(VElg. V) • Utilizando heaps fibonacci O(V 2 lg. V+VE) Si hay arcos negativos Bellman-Ford, una vez por vértice. O(V 2 E) y para grafos densos O(V 4)

Representación Se dispone de una matriz de entrada W de tamaño nxn, que representa

Representación Se dispone de una matriz de entrada W de tamaño nxn, que representa los pesos de un grafo dirigido G=(V, E) de n arcos. Luego, para W=(wij) wij 0 si i=j peso de (i, j) si i≠j y (i, j) E

Salida • Una matriz D=(dij) con las distancias mínimas entre el par (i, j).

Salida • Una matriz D=(dij) con las distancias mínimas entre el par (i, j). • Una matriz =( ij), donde ij=NULL si i=j ó no hay camino de i a j, de otra forma contiene al predecesor de j en el camino mínimo. El grafo resultante se define como: G , i= (V , i, E , i) donde V , i={ j V : ij ≠ NULL } U { i } E , i={( ij, j) : j V , i y ij≠NULL

Impresión del Camino PRINT-ALL-PAIRS-SP( , i, j) 1 if i=j 2 then print i

Impresión del Camino PRINT-ALL-PAIRS-SP( , i, j) 1 if i=j 2 then print i 3 else if ( ij=NULL) 4 then print “no path from” i “to” j 5 else 6 PRINT-ALL-PAIRS-SP( , i, ij) 7 print j

Multiplicación de Matrices y Caminos Cortos • • • Se presenta un algoritmo basado

Multiplicación de Matrices y Caminos Cortos • • • Se presenta un algoritmo basado en programación dinámica para resolver todos los caminos más cortos en todos los pares de nodos del grafo G=(V, E). El método es similar a la multiplicación de matrices. Recapitulando la programación dinámica: 1. Caracterizar la estructura de la solución óptima. 2. Definir recursivamente el valor de la solución óptima. 3. Computar el valor de la solución óptima de abajo hacia arriba.

Estructura del Camino más Corto Sabemos que todos los subcaminos de los caminos más

Estructura del Camino más Corto Sabemos que todos los subcaminos de los caminos más cortos son también caminos más cortos. Supongamos W=(wij), asumamos que no hay ciclos negativos y que el camino p tiene m arcos que van de i a j y, p es un camino corto. si i=j si i≠j p 0 p i ~p’> k j tiene m-1 nodos (i, j) = (i, k) + w(k, j)

Solución Recursiva • Sea dij(m) el peso mínimo para algún camino de i a

Solución Recursiva • Sea dij(m) el peso mínimo para algún camino de i a j con m arcos: si m=0 no hay arcos dij(0) = 0 si i=j si i≠j Si m 1 dij(m) = min (1 k n, dik(m-1) + wkj) • ¿Cuál es el límite de m? (i, j) = dij(n-1)=dij(n+1)=…

Cálculo de la Solución de Abajo hacia Arriba • Entrada: W=(wij), luego se calcula

Cálculo de la Solución de Abajo hacia Arriba • Entrada: W=(wij), luego se calcula una serie de matrices D(1), D(2), …, D(n-1) | D(m)=(dij(m)). D(n-1) contiene los caminos más cortos.

Cálculo de la Solución de Abajo hacia Arriba • En esencia el siguiente algoritmo

Cálculo de la Solución de Abajo hacia Arriba • En esencia el siguiente algoritmo extiende la solución del camino más corto, un arco a la vez. EXTEND-SHORTEST-PATHS (D, W) 1 n rows[D] 2 let D’=(d’ij) be a nxn matrix. 3 for i 1 to n 4 do for j 1 to n 5 do d’ij 6 for k 1 to n 7 do d’ij = min(d’ij, dik + wkj) 8 return D’ Este algoritmo es O(n 3). Observe los tres for anidados.

Relación con la Multiplicación de Matrices. • Suponga C=A. B; donde A, B y

Relación con la Multiplicación de Matrices. • Suponga C=A. B; donde A, B y C son matrices nxn. La multiplicación de matrices se define: cij = (k=1, n, aik. bkj) dij(m)=min(1 k n, dik(m-1) + wkj) d(m-1) a w b d(m) c min + +.

Algoritmo Sea AB un producto matricial retornado por EXTEND-SHORTESTPATHS(A, B) D(1) = D(0). W

Algoritmo Sea AB un producto matricial retornado por EXTEND-SHORTESTPATHS(A, B) D(1) = D(0). W = W D(2) = D(1). W = W 2 D(3) = D(2). W = W 3 … D(n-1) = D(n-2). W = Wn-1 SLOW-ALL-PAIRS-SHORTEST-PATHS(W) 1 n rows[w] 2 D(1) W 3 for m 2 to n-1 4 do D(m) EXTEND-SHORTEST-PATHS(D(m-1), w) 5 return D(n-1) O(n 4)

Mejora del Tiempo de Ejecución ¿Cuál es el objetivo? R: D(n-1) Recordemos que si

Mejora del Tiempo de Ejecución ¿Cuál es el objetivo? R: D(n-1) Recordemos que si no hay ciclos negativos, D(m)=D(n-1) m n-1 Así, podemos computar D(n-1) en solo lg(n-1) , haciendo D(1) = W D(2) = W 2 = W. W D(4) = W 4 = W 2 D(8) = W 8 = W 4 … D(2^ ln(n-1) ) = W(2^( ln(n-1) -1)) La técnica se denomina “repetición cuadrática”.

Algoritmo FASTER-ALL-PAIRS-SHORTEST-PATHS(W) 1 n rows[w] 2 D(1) W 3 m 1 4 while n-1

Algoritmo FASTER-ALL-PAIRS-SHORTEST-PATHS(W) 1 n rows[w] 2 D(1) W 3 m 1 4 while n-1 > m 5 do D(2 m) EXTEND-SHORTEST-PATH(D(m), D(m)) 6 m 2 m 7 return D(m) • • n-1 2 m 2 n-2 O(n 3 lgn)

Algoritmo Floyd-Warshall • Estructura del camino más corto – Se consideran los vértices intermedios

Algoritmo Floyd-Warshall • Estructura del camino más corto – Se consideran los vértices intermedios (v. i. ) de un camino simple p=<v 1, v 2, …, vl>, es decir, cualquier vertice que no sea v 1 y vl. – El algoritmo se basa en la siguiente observación: Sean los nodos de G, V={1, 2, …n} y considere el subconjunto {1, 2, …, k} para algún k. Para cualquier par de vertices i, j V considere todos los caminos de i a j cuyos vertices son todos obtenidos de {1, 2, …, k} y sea p el camino de minimo peso entre ellos. – El algoritmo explota la relación entre el camino p y los caminos cortos de i a j con vértices intermedios en el conjunto {1, 2, …, k 1}. – Si tenemos que p se divide en i~p 1~>k~p 2~>j. p 1 y p 2 son caminos cortos con vértices intermedios en {1, 2, . . . , k}.

Solución Recursiva Sea dij(k) el peso del camino más corto de i a j

Solución Recursiva Sea dij(k) el peso del camino más corto de i a j con v. i. en {1, 2, …, k}. Cuando k=0 el camino de i a j no tiene un v. i. numerado más alto que 0 y de hecho no tiene v. i. dij (k) = Wij si k=0 min(dij(k-1) , dik(k-1) + dkj(k-1) ) si k 1

Computo de Abajo hacia Arriba FLOYD-WARSHALL(W) 1 n rows[n] 2 D(0) w 3 for

Computo de Abajo hacia Arriba FLOYD-WARSHALL(W) 1 n rows[n] 2 D(0) w 3 for k 1 to n 4 do for i 1 to n 5 do for j 1 to n 6 dij(k) min(dij(k-1), dik(k-1)+ dkj(k-1)) 7 return D(n) (n 3)

Ejemplo Valores iniciales D(0) = D(1) = D(2) = 0 3 8 -4 NIL

Ejemplo Valores iniciales D(0) = D(1) = D(2) = 0 3 8 -4 NIL 1 1 NIL 1 0 1 7 NIL NIL 2 2 4 0 NIL 3 NIL NIL 2 -5 0 4 NIL NIL 6 0 NIL NIL 5 NIL 0 3 8 -4 NIL 1 1 NIL 1 0 1 7 NIL NIL 2 2 4 0 NIL 3 NIL NIL 2 5 -5 0 -2 4 1 4 NIL 1 6 0 NIL NIL 5 NIL 0 3 8 4 -4 NIL 1 1 2 1 0 1 7 NIL NIL 2 2 4 0 5 11 NIL 3 NIL 2 2 2 5 -5 0 -2 4 1 4 NIL 1 6 0 NIL NIL 5 NIL (0) = (1) = (2) =

Construcción del camino más corto Se selecciona el mismo predecesor que en camino más

Construcción del camino más corto Se selecciona el mismo predecesor que en camino más corto, pero queda atado por apuntadores a los padres en una cadena. ij(k) ij(k-1) si dij(k-1) dik(k-1)+ dkj(k-1) si dij(k-1) > dik(k-1)+ dkj(k-1)

Clausura transitiva de un grafo dirigido Dado un grafo dirigido G=(V, E) con un

Clausura transitiva de un grafo dirigido Dado un grafo dirigido G=(V, E) con un conjunto de nodos V = {1, 2, …, n} se quiere averiguar si hay un camino de i a j i, j V. La clausura transitiva se define: G*=(V, E*) donde E*={(i, j): hay camino de i a j en G}.

¿Cómo se calcula? • Asignar peso 1 a todos los arcos en E y

¿Cómo se calcula? • Asignar peso 1 a todos los arcos en E y ejecutar Floyd-Warshall O(n 3). – Si hay camino dij<n – Si no hay camino dij= • Otra manera es utilizando los operadores lógicos y en vez de los operadores min y + en FLOYD-WARSHALL. – tij(0) = 0 si i≠j y (i, j) E. =1 si i=j o (i, j) E. – Para k 1: tij(k) = tij(k-1) (tik(k-1) tkj(k-1)). (n 3).

Algoritmo de Jhonson para grafos esparcidos • Encuentra los caminos más cortos en O(V

Algoritmo de Jhonson para grafos esparcidos • Encuentra los caminos más cortos en O(V 2 lg. V + VE), que es asintóticamente mejor que los otros dos métodos. • Usa Dijkstra y Bellman-Ford. • Usa la técnica de reasignación de pesos. – Si todos los pesos son positivos, entonces se utiliza Dijkstra en c/u de los nodos y con heap fibonacci se tiene O(V 2 lg. V + VE), de lo contrario se recalculan los pesos para queden todos positivos y se aplica la misma técnica.

Reasignación de Pesos Sea el nuevo peso asignado. debe cumplir con: 1. (u, v)

Reasignación de Pesos Sea el nuevo peso asignado. debe cumplir con: 1. (u, v) E, (u, v) con w: E R es también (u, v) con : E R. 2. (u, v) E, (u, v) 0. se determina en O(VE).

Reasignación de Pesos Lema: La reasignación de pesos no cambia los caminos más cortos.

Reasignación de Pesos Lema: La reasignación de pesos no cambia los caminos más cortos. Sea G=(V, F) con w: E R y h: V R cualquier función que mapea V R. Luego (u, v) E: (u, v) = w(u, v) + h(u) – h(v). Sea p = <v 0, v 1, … vk> un camino de v 0 a vk. w(p)= (v 0, vk) G tiene ciclo negativo G´ tiene ciclo negativo

Reasignación de Pesos Prueba: (p) = w(p) + h(v 0) – h(vk) Se tiene

Reasignación de Pesos Prueba: (p) = w(p) + h(v 0) – h(vk) Se tiene (p) = (i=1, k, (vi-1, vi)) = (i=1, k, w(vi-1, vi) + h(vi-1) - h(vi)) = (i=1, k, w(vi-1, vi)) + h(v 0) – h(vk) = w(p) + h(v 0) – h(vk) Suponga que hay un camino más corto p’ desde v 0 a vk usando . Entonces (p’)< (p). w(p’) + h(v 0) – h(vk) = (p’) < w(p) = w(p)+h(v 0)+h(vk) Que implica que w(p’) < w(p) que contradice que p es el camino más corto. Suponga que hay un ciclo negativo c = <v 0, v 1, …, vk> Luego, (c)=w(c) + h(v 0) – h(vk) =w(c) si hay ciclo negativo en (c) tambien lo hay en w(c).

Algoritmo JHONSON 1 compute G’, V[G’]=V[G] U {s}, E[G’]=E[G]U{(s, v) : v V[G]} 2

Algoritmo JHONSON 1 compute G’, V[G’]=V[G] U {s}, E[G’]=E[G]U{(s, v) : v V[G]} 2 if BELLMAN-FORD(G’, w, s) = false 3 then print “there is a negative weight cycle” 4 else for each vertex v V[G] 5 do set h(v) to the value computed by the BELLMANFORD algorithm. 6 for each edge (u, v) E[G’] 7 do (u, v) w(u, v) + h(u) – h(v) 8 for each vertex u V[G] 9 do run Dijkstra(G, , u) to compute ’(u, v) u V[G] 10 for each vertex v V[G] 11 do duv ’(u, v) + h(v) – h(u) 12 return D

Ejemplo 0 -1 0 3 4 7 0 0 0 1 -5 8 -4

Ejemplo 0 -1 0 3 4 7 0 0 0 1 -5 8 -4 5 2 -5 0 -4 6 -1 0 0 4 0 10 0 0 -5 13 0 2 0 4 -4 0 2 0

Ejemplo 2/1 0/0 4 0 10 0/0 0 2/-3 2 0/-4 2 0 10

Ejemplo 2/1 0/0 4 0 10 0/0 0 2/-3 2 0/-4 2 0 10 13 0 4 0 2/2 2/3 0 0/-4 13 0 2 2/-1 2 0 0/1

Flujo Máximo • Imaginemos algún flujo que va desde un sitio s, donde es

Flujo Máximo • Imaginemos algún flujo que va desde un sitio s, donde es producido, hasta un sitio t donde es consumido a la misma tasa de producción. • Intuitivamente, el flujo en cualquier punto de la red es la tasa a la que se mueve el material. • Usos: modelado de flujo en tuberías, líneas de ensamblado, corrientes eléctricas, información en redes de comunicación, etc.

Flujo Máximo • Cada arco dirigido puede ser visto como un conducto por donde

Flujo Máximo • Cada arco dirigido puede ser visto como un conducto por donde pasa el material, según las siguientes restricciones: – Cada conducto tiene una capacidad máxima finita. – Se cumple la conservación de flujo. fi = fo (por nodo). Problema del Flujo Máximo: ¿Cuál es la mayor tasa a la que se puede llevar material sin violar ninguna restricción?

Redes de Flujo • Una red de flujo G=(V, E) es un grafo dirigido

Redes de Flujo • Una red de flujo G=(V, E) es un grafo dirigido tal que cada arco (u, v) E posee una capacidad c(u, v) 0. Si (u, v) E, c(u, v)=0. – Se distinguen 2 vertices, el fuente “s” y el destino “t”. Cada vertice v V esta en algun s~>v~>t. – El grafo es conexo |E| |V|-1

Flujo • El flujo está dado por una función con imagen en los reales.

Flujo • El flujo está dado por una función con imagen en los reales. f: Vx. V R que satisface: – Restricción de capacidad: u, v V, f(u, v) c(u, v). – Simetría distorsionada: u, v V, f(u, v)=-f(v, u). – Conservación de flujo: u, v V-{s, t} se requiere que v V f(u, v) = 0 Sea f(u, v) el flujo desde u hasta v, el valor de ese flujo se define como |f|= f(s, v) v V

Relación entre 2 nodos v 2 v 2 5/10 4 7 más de v

Relación entre 2 nodos v 2 v 2 5/10 4 7 más de v 2 a v 1 3/4 4 cancelación v 1 8/10 10 v 1 8/10 v 1 3 de v 2 a v 1 4 v 2 10 2/4 8 de v 1 a v 2

Redes de múltiples entradas y múltiples salidas s 1 s 2 S’ t 1

Redes de múltiples entradas y múltiples salidas s 1 s 2 S’ t 1 T’ s 3 s 4 s 5 t 2

Metodo Ford-Fulkerson • El método iterativo depende de tres ideas importantes: – Red residual

Metodo Ford-Fulkerson • El método iterativo depende de tres ideas importantes: – Red residual – Aumento de camino – Cortes Para ello usaremos el teorema max-flow min -cut que caracteriza el flujo máximo en terminos de cortes de la red de flujo.

Iteración • En cada iteración se va consiguiendo un valor de flujo que aumenta

Iteración • 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. FORD-FULKERSON-METHOD(G, s, t) 1 initialize flow f to 0 2 while there exists an augmenting path p. 3 do augment flow f along p 4 return f.

Red Residual La red residual consiste en arcos que admiten más flujo. Dada una

Red Residual La red residual consiste en arcos que admiten más flujo. Dada una red de flujo G=(V, E) con fuente s y destino t. Sea f el flujo en G, y considere un par de vertices u, v V. 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) Ejemplo: c(u, v)=16, f(u, v)=-4 cf(u, v)=20 c(u, v)=16, f(u, v)=10 cf(u, v)=6 La red residual se define como: Ef – {(u, v) Vx. V: cf(u, v) > 0}

Aumento de Caminos Dada una red de flujo G=(V, E), un camino aumentado p

Aumento de Caminos Dada una red de flujo G=(V, E), un camino aumentado p es un camino simple de s a t en la red residual Gf. Este camino solo admite flujo positivo. La cantidad máxima de flujo que puede llevarse por los arcos en un aumento de p se denomina capacidad residual de p, y está dado por: cf(p) = min {cf(u, v): (u, v) p}

Corte de la red de flujo • El método aumenta repetidamente el flujo a

Corte de la red de flujo • El método aumenta repetidamente el flujo a través de los caminos de aumento hasta alcanzar el máximo. • Un corte (S, T) de la red de flujo G=(V, E) esuna partición de V en S y T=V-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).

Teorema max-flow min-cut Teorema: El máximo valor de entre todos los flujos en una

Teorema max-flow min-cut 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. Prueba: Es suficiente con mostrar un flujo y un corte tal que sean iguales en valor. Luego, el flujo ha de ser máximo pues no puede rebasar la capacidad del corte y el corte ha de ser mínimo porque ninguna otra capacidad puede ser menor que el valor actual del flujo.

Algoritmo de Ford-Fulkerson FORD-FULKERSON(G, s, t) 1 for each edge (u, v) E[G] 2

Algoritmo de Ford-Fulkerson FORD-FULKERSON(G, s, t) 1 for each edge (u, v) E[G] 2 do f[u, v] 0 3 f[v, u] 0 4 while there exists a path p from s to t in the residual network Gf 5 do cf(p)=min {cf(u, v) : (u, v) p} 6 for each edge (u, v) in p 7 do f[u, v] + cf(p) 8 f[v, u] -f[u, v]

Ejemplo s 0 2 1 2 3 2 1 1 3 4 5 t

Ejemplo s 0 2 1 2 3 2 1 1 3 4 5 t Cmin = 2 3 1 1 3 4 5 t Cmin = 1 3 1 2 1 1 2 2 s 0 2 2 1 1 3 2 s 0 1 2 2 1 3 1 2 5 t Cmin = 1 4 2

Ejemplo Flujo Máximo 2 2 1 1 1 3 2 2 5 t 4

Ejemplo Flujo Máximo 2 2 1 1 1 3 2 2 5 t 4 Dirección del Flujo S s 0 1 T 1 2

Análisis • El algoritmo está acotado por O(|f*|) donde f* es el flujo máximo.

Análisis • El algoritmo está acotado por O(|f*|) donde f* es el flujo máximo. . 000 0 0 1. 0 00 u s 9 9. 99 . 00 99 0 1. 0 00 0 v 1. 0 . 000 0 1. 00 9 9. 99 99 1 s 99 9. 9 99 99 1 v . 00 99 9. 9 u 1 s t 1 1. 0 t . 999 0 1 v 00 1 999 0 t. 999

Mejora • Si hallamos el camino mínimo de s a t en la red

Mejora • Si hallamos el camino mínimo de s a t en la red residual donde cada arco tiene peso 1, se puede mejorar Ford-Fulkerson. Este método es llamado Edmonds-Karp y esta acotado por O(VE).