Sei sulla pagina 1di 46

Universidad de Los Andes

Facultad de Ingeniería
Postgrado en Computación

Analisis y Diseño de Algoritmos


Tema: Grafos
3ra Parte

Andrés Arcia
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 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(V3+VE) =
O(V3)
• Utilizando heaps binarios ⇒ O(VElgV)
• Utilizando heaps fibonacci ⇒ O(V2lgV+VE)

Si hay arcos negativos


⇒ Bellman-Ford, una vez por vértice.
⇒ O(V2E) y para grafos densos O(V4)
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)

0 si i=j
wij peso de (i,j) si i≠j y (i,j) ∈ E
∞ si i≠j y (i,j) ∉ E
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
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 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 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 p⇒0
si i≠j 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 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) =dij (n+1) =…
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 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(n3). Observe los tres for anidados.
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-SHORTEST-
PATHS(A,B)

D(1) = D(0) .W = W
D(2) = D(1) .W = W2
D(3) = D(2) .W = W3

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(n4)
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) = W2 = W.W
D(4) = W4 = W2. W2
D(8) = W8 = W4. W4

D(2^ln(n-1)) = W(2^ ln(n-1) ) = W(2^( ln(n-1) -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 > m
5 do D(2m)←EXTEND-SHORTEST-PATH(D(m), D(m))
6 m ←2m
7 return D(m)

• n-1≤ 2m≤ 2n-2


• O(n3lgn)
Algoritmo Floyd-Warshall
• Estructura del camino más corto
– Se consideran los vértices intermedios (v.i.) de un camino
simple p=<v1, v2,…, vl>, es decir, cualquier vertice que no sea v1 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~p1~>k~p2~>j. p1 y p2 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 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.

Wij si k=0
dij(k) = 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 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)
⇒Θ (n3)
Valores iniciales
Ejemplo
0 3 8 ∞ -4 NIL 1 1 NIL 1
∞ 0 ∞ 1 7 NIL NIL NIL 2 2
D(0) = ∞ 4 0 ∞ ∞ ∏ (0) = NIL 3 NIL NIL NIL
2 ∞ -5 0 ∞ 4 NIL 4 NIL NIL
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

∞ NIL 1 1 NIL 1
0 3 8 -4
∞ 0 ∞ 1 7 NIL NIL NIL 2 2

D(1) = ∞ 4 0 ∞ ∞ ∏ (1) = NIL 3 NIL NIL NIL


2 5 -5 0 -2 4 1 4 NIL 1
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

0 3 8 4 -4 NIL 1 1 2 1
∞ 0 ∞ 1 7 NIL NIL NIL 2 2

D(2) = ∞ 4 0 5 11 ∏ (2) = NIL 3 NIL 2 2


2 5 -5 0 -2 4 1 4 NIL 1
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL
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.

π (k-1)
si dij (k-1) ≤ dik (k-1) + dkj (k-1)
π ij
(k) ij
π kj
(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
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 ejecutar
Floyd-Warshall ⇒ O(n3).
– 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) ).
⇒Θ (n3).
Algoritmo de Jhonson
para grafos esparcidos
• Encuentra los caminos más cortos en O(V2lgV +
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(V2lgV + VE), de lo contrario se recalculan los
pesos para que 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) ∈ 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.
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 = <v0, v1, … vk> un camino de v0 a vk.
w(p)=δ (v0,vk) ⇔ ϖ (p)=δ (v0,vk)
G tiene ciclo negativo ⇔ G´ tiene ciclo negativo
Reasignación de Pesos
Prueba:
ϖ(p) = w(p) + h(v0) – 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(v0) – h(vk)
= w(p) + h(v0) – h(vk)
Suponga que hay un camino más corto p’ desde v0 a vk usando ϖ . Entonces ϖ (p’)<
ϖ (p).
w(p’) + h(v0) – h(vk) = ϖ (p’)
< w(p)
= w(p)+h(v0)+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 = <v0, v1, …, vk>
Luego, ϖ (c)=w(c) + h(v0) – 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 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 BELLMAN-
FORD 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
0
Ejemplo
-1
0 3 4
7 1
0 0 -5
0 8
5
-4 2
-5
0 -1
-4 0 0 4 0
6 10 0
0 0 -5
0 13

0 0 2
0
4
-4 0
2

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

0 2 0 2
0 0

0/-4 2/2 2/-1 0/1


2 2
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 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 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. f:VxV→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
8 de v1 a v2 3 de v2 a v1 cancelación 7 más de v2 a v1

v1 v1 v1 v1 v1
8/10

8/10

5/10
10 10

3/4

2/4
4 4 4

v2 v2 v2 v2 v2
Redes de múltiples entradas y
múltiples salidas
s1

s2
t1
∞ ∞

∞ s3 T’
S’
∞ ∞
∞ t2
s4

s5
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 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 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) ∈ VxV: cf(u,v) > 0}
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
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 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 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] ← f[u,v] + cf(p)
8 f[v,u] ← -f[u,v]
Ejemplo
s s s
2 0 3 2 0 3 2 0
1
2
1 2 1 2 1 2
1 1 1 1 1
1
3 1 1 2 1 1 2 1

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

s
S
2 0
2

Dirección del Flujo


1
1 2
1 1
2 1 1

3 4
2

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

1.0 1.0
00
.000 00 . 999 .00
1.00
0
u
.00
0 999 u 0

s 1 1
s 1 t 1 t
1.0 1.0
0 0.0 0 0 .9 99
00 v 0. 00 0.0 v 999
1.00 00
99
9 .9
. 99 9 99
999 u
s 1 1 1 t
99
9.9
99 v .9 99
999
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).

Potrebbero piacerti anche