• Nenhum resultado encontrado

Caminhos Mais Curtos Fluxo Máximo Árvores Geradoras Mínimas

N/A
N/A
Protected

Academic year: 2021

Share "Caminhos Mais Curtos Fluxo Máximo Árvores Geradoras Mínimas"

Copied!
85
0
0

Texto

(1)

Caminhos Mais Curtos

Fluxo Máximo

Árvores Geradoras Mínimas

Túlio Toffolo – www.toffolo.com.br

Marco Antônio Carvalho – marco.opt@gmail.com

(2)

Plano da Aula

•  Caminhos Mais Curtos

•  Algoritmo de Dijkstra •  Algoritmo de Floyd

•  Fluxo Máximo

•  Algoritmo de Ford Fulkerson

•  Árvores Geradoras Mínimas

•  Algoritmo de Kruskal •  Algoritmo de Prim

•  Otimização dos algoritmos

(3)

PROGRAMAÇÃO

DE TRIPULAÇÕES

CAMINHOS

(4)

Caminhos mais Curtos

•  Dados: grafo G=(V,A) orientado e

distância cij associada ao arco (i,j) ∈ A.

Problema: Obter o caminho mais curto entre dois nós s e t.

4

•  O comprimento de um caminho é igual à soma dos

comprimentos (distâncias) dos arcos que formam o caminho. •  A distância ou comprimento de um arco pode ter diversas

interpretações

Exemplo 1: Dado um mapa rodoviário, determinar a rota mais curta de uma cidade a outra.

(5)

Caminhos mais Curtos

Exemplo 2: Construção de uma estrada entre duas cidades A e K. O grafo abaixo representa os diversos trechos possíveis e o custo de construção de cada um. Determinar o trajeto ótimo cujo custo de construção seja mínimo (corresponde a achar o caminho mais curto de A a K em relação a estes custos).

A B C D F E G J I H K 8 7 5 6 4 2 4 5 4 4 2 2 4 4 5 2 4 4 Solução: A – D – G – I – K custo = 7 + 2 + 2 + 5 = 16

(6)

Caminhos mais Curtos

•  Condição de existência:

Caminho de i a j contendo um circuito w:

6 k j i w Comprimento do caminho = comprimento (i → k) + comprimento (w) + comprimento (k → j)‏

Qual é o comprimento do caminho mais curto de i a j se o comprimento do circuito w é negativo?

(7)

Caminhos mais Curtos

Condição de existência:

não há circuitos de comprimento negativo.

A solução ótima (caminho mais curto) sempre será um caminho elementar (sem ciclo).

(8)

Caminhos mais Curtos

8

" Caminho mais curto:

- De um nó a outro

- De um nó a todos os demais

(9)

Caminhos mais Curtos

Caminho mais curto do nó 1 a cada nó do grafo G=(V,A)‏

Hipótese: todas as distâncias cij são positivas: cij ≥ 0, ∀(i,j) ∈ A

•  Algoritmo de Moore-Dijkstra (1957-1959)‏

π*(i) = comprimento do caminho mais curto do nó 1 ao nó i Em especial, π*(1)=0 (distâncias positivas).

" Algoritmo com n-1 iterações

"   No início de cada iteração, o conjunto V de nós está

particionado em dois subconjuntos S e S, com o nó 1 em S. V

S S

S S ∩ =φ

(10)

Caminhos mais Curtos

10

–  Cada nó i ∈ V possui um rótulo

π

(

i

), que verifica

a seguinte propriedade:

) ( * ) ( Se ) ( * ) ( Se i i S i i i S i π π π π ≥ ⇒ ∈ = ⇒ ∈

{

ki

}

Γ k S k k c i i + = − ∈ ∈ ( ) min ) ( π π

– 

dá o valor do caminho mais curto de 1 a i sob a restrição de que todos os nós utilizados (exceto o próprio i ) pertençam a S. , ), (i i S π a 1 b c i ) (a π ) (b π ) (c π ) (i π cai cbi cci S S

(11)

Caminhos mais Curtos

Teorema: Seja o nó tal que .

Então , isto é, o comprimento do caminho mais curto do nó 1 ao nó j é igual a .

S j (

j

) min (

i

) S i

π

π

∈ = ) ( ) ( * j

π

j

π

= Demonstração:

–  Por construção, certamente existe um caminho de 1 até j com comprimento π(j).

–  Suponhamos que exista outro caminho de 1 a j de comprimento menor do que π(j).

–  Dividamos este caminho em duas partes:

- P1 é a parte inicial, do nó 1 ao nó L, onde L é o primeiro nó de encontrado - P2 é a parte final, do nó L ao nó j ) (j π

S

(12)

Caminhos mais Curtos

12

–  comprimento de P

1

π

(

L

) ≥

π

(

j

)‏

comprimento de P

2

≥ 0

(13)

PROGRAMAÇÃO

DE TRIPULAÇÕES

CAMINHOS MAIS CURTOS

(14)

Caminhos mais Curtos

Algoritmo de Moore-Dijkstra 14 Inicializar S ← {2,3,...,n}, S ← {1}, π(1)← 0, π(j)← c1j se j∈Γ1+ +∞ caso contrário Enquanto S ≠ ∅ faça

Selecionar j∈S tal que π(j)= mini∈S{π(i)}

S ← S – {j}

Para ∀i∈S e i∈Γj+ faça

π(i) ← min{π(i), π(j)+cji}

(15)

Caminhos mais Curtos

•  O algoritmo de Moore-Dijkstra constrói progressivamente

o conjunto dos nós mais próximos de 1.

•  Construção de uma arborescência com raiz em 1 que

define os caminhos mais curtos do nó 1 a cada nó do

grafo.

(16)

Caminhos mais Curtos

16 Exemplo: 1 2 3 4 5 6 1 2 3 5 7 7 5 1 2 4 ITERAÇÃO 1 π*(1) = 0 π*(3) = 1 1 2 3 4 5 6 1 2 3 5 7 7 5 1 2 4 S = {1} S = {2,3,4,5,6} π(1) = 0 π(2) = 7 π(3) = 1 π(4) = π(5) = π(6) = +∞ π(2) = min{7, π(5) = min{∞, π(6) = min{∞, j = 3 S = {2,4,5,6} 1+5} = 6 1+2} = 3 1+7} = 8

(17)

Caminhos mais Curtos

ITERAÇÃO 2 π(2) = min{6, π(4) = min{∞, j = 5 S = {2,4,6} 3+2} = 5 3+5} = 8 π*(1) = 0 π*(3) = 1 1 2 3 4 5 6 1 2 3 5 7 7 5 1 2 4 π*(5) = 3 ITERAÇÃO 3 π(4) = min{8, π(6) = min{∞, j = 2 S = {4,6} 5+4} = 8 5+1} = 6 π*(1) = 0 π*(3) = 1 1 2 3 4 5 6 1 2 3 5 7 7 5 1 2 4 π*(5) = 3 π*(2) = 5

(18)

Caminhos mais Curtos

18 ITERAÇÃO 4 π(4) = 8 j = 6 S = {4} ITERAÇÃO 5 j = 4 S = { } π*(1) = 0 π*(3) = 1 1 2 3 4 5 6 1 2 3 5 7 7 5 1 2 4 π*(5) = 3 π*(2) = 5 π*(6) = 6 π*(1) = 0 π*(3) = 1 1 2 3 4 5 6 1 2 3 5 7 7 5 1 2 4 π*(5) = 3 π*(2) = 5 π*(6) = 6 π*(4) = 8

(19)

Caminhos mais Curtos

1 2 3 5 4 2 3 2 5 4 3 1 2 6 7 3 1 4 3 6 5 4 3 2 1 1 2 3 6 5 4 nó Iteração Início 0 4 2 ∞ ∞ ∞

π

0 4 2 5 4 7 0 4 2 5 4 ∞ 0 4 2 5 4 7 0 4 2 5 4 7 0 4 2 5 4 7 0 4 2 5 4 7

(20)

Caminhos mais Curtos

20

•  Número de operações (tempo): ~ n2

n-1 iterações, cada iteração busca o mínimo em uma lista com até n-1 elementos (vetor π)‏

"   Caminho mais curto do nó 1: → ao nó j

→ a todos os nós

Mesma complexidade, mas critérios de parada diferentes. "   Distâncias negativas: 1 3 2 10 - 8

3 Caminho mais curto de 1 a 3?

Resultado do algoritmo?

2 3

(21)

Caminhos mais Curtos

Algoritmo de Moore-Dijkstra para o caso com distâncias negativas

Inicializar S ← {2,3,...,n}, S ← {1}, π(1)← 0, π(j)← c1j se j∈Γ1+ +∞ caso contrário Enquanto S ≠ ∅ faça

Selecionar j∈S tal que π(j)= mini∈S{π(i)}

S ← S – {j}

Para ∀i∈Γj+ faça

Calcular π* ← π(j)+ cji Se π* < π(i) então S ← S ∪ {i} π(i) ← π* fim-se fim-para fim-enquanto

(22)

PROGRAMAÇÃO

DE TRIPULAÇÕES

CAMINHOS MAIS CURTOS

(23)

Caminhos mais Curtos

•  Dados:

Grafo G=(V, A) orientado, |V | = n. Não há circuitos negativos.

c = {cij}, j = 1,...,n, i = 1,...,n cij ≥ 0

cii = 0

cij = +∞, (i, j ) ∉ A

Ak(i, j ) = valor do caminho mais curto de i a j podendo

usar apenas nós numerados de 1 a k como nós intermediários.

(24)

Caminhos mais Curtos

A0(i, j ) = c

ij : caminho mais curto de i a j usando no máximo o nó

0 (que não existe) como nó intermediário (caminho mais curto de i a j sem nós intermediários)‏

24

Ak(i, j ) : pode usar o nó k ou não.

Ak+1(i, j ) : pode usar o nó k+1 ou não.

A0 A1

A1 A2

...

An-1 An

An(i, j ) = valor do caminho mais curto

de i a j podendo usar

qualquer nó de 1 a n como nó intermediário.

(25)

Caminhos mais Curtos

•  Se Ak+1(i, j ) não usa o nó k+1 como intermediário, então:

Ak+1(i, j ) = Ak(i, j )

•  Se Ak+1(i, j ) usa o nó k+1 como intermediário, então:

Ak+1(i, j ) = Ak(i, k+1) + Ak(k+1, j )

(26)

Caminhos mais Curtos

Algoritmo de Floyd: 26 Para i = 1,...,n faça Para j = 1,...,n faça A0(i,j) ← c ij fim-para fim-para Para k = 1,...,n faça Para i = 1,...,n faça Para j = 1,...,n faça

Ak(i,j) ← min{Ak-1(i,j),

Ak-1(i,k) + Ak-1(k,j)}

fim-para fim-para fim-para

(27)

Caminhos mais Curtos

0 7 3 2 0 6 11 4 0

A

1

=

Exemplo: 1 2 3 3 6 4 11 2 3 +∞ 0 2 0 6 11 4 0

C =

0 +∞ 3 2 0 6 11 4 0

A

0

=

0 7 3 2 0 6 6 4 0

A

2

=

0 7 3 2 0 5 6 4 0

A

3

=

(28)

Caminhos mais Curtos

•  Algoritmo de Dijkstra: número de operações (tempo) ~ n2

n-1 iterações, cada iteração busca o mínimo em uma lista com até n-1 elementos (vetor π)‏

•  Algoritmo de Floyd: número de operações (tempo) ~ n3

Três comandos for de 1 até n um dentro do outro

•  Ou seja, o problema de calcular os caminhos mais curtos entre todos os pares de nós pode ser resolvido com a mesma eficiência

aplicando-se n vezes o algoritmo de Dijkstra, uma vez a partir de cada nó inicial.

(29)

Otimizações: uso de Heaps

Operação Complex. “Real” Complexidade Amortizada

Pairing Heap Fibonacci Heap

isEmpty O(1) O(1) O(1)

size O(1) O(1) O(1)

getMax O(1) O(1) O(1)

put O(1) O(log n) ** O(1)

removeMax O(n) O(log n) O(log n)

meld O(1) O(log n) ** O(1)

(30)

PROGRAMAÇÃO

DE TRIPULAÇÕES

(31)

Problema do Fluxo Máximo

•  Dados: Grafo G=(X,U) orientado

∀u ∈ U: capacidade c(u)‏ 0 ≤ f(u) ≤ c(u)‏

•  Problema: Obter um fluxo máximo de S a P respeitando as

restrições de capacidade e as restrições de conservação de fluxo em cada nó.

S P

(32)

Problema do Fluxo Máximo

32 Exemplo: S P

f

S P a b 1 2 4 3 5 1, 1, 2, 3, 0, ∞ 3, capacidades c fluxos f

" Inserindo-se um arco de retorno, transforma-se um fluxo em uma circulação :

(33)

Problema do Fluxo Máximo

Com o arco de retorno:

= −

= =x uT u x u I u

u

f

u

f

) ( : ) ( : ) ( ) ( v, x = S 0, ∀x ≠ S, ∀x ≠ P -v, x ≠ P I(u) u T(u) : ( ) : ( ) ( ) ( ) 0, u I u x u T u x

f u

f u

x X

= = − = ∀ ∈

(34)

Problema do Fluxo Máximo

34 Exemplo: a b c d e S P ∞ ∞ ∞ ∞ ∞ 5 2 1 1 1 7 3 2

"   Capacidades associadas aos nós:

x 2 8 7 3 x1 2 8 x2 7 3 c(x

)‏

(35)

FLUXO MÁXIMO

ALGORITMO DE

FORD FULKERSON

(36)

Problema do Fluxo Máximo

"   Algoritmo de rotulação de Ford e Fulkerson (idéia básica)‏

36

Início: fluxo viável (por exemplo um fluxo nulo)

Iteração:

Determinar um caminho C de S a P ao longo do qual nenhum arco esteja saturado.

(isto é, f(u) = c(u))

Circuito Γ = C ∪ {(P,S)}

Aumentar o fluxo ao longo dos arcos de Γ do valor δ = minu∈Γ[c(u)-f(u)]

(37)

Problema do Fluxo Máximo

Exemplo: S P a b 1 4 3 5 2

Este fluxo (f=3) é máximo? Por que? 2 2 1 1 1 1 3 3 Fluxo máximo = 4

(38)

Problema do Fluxo Máximo

•  Obter uma cadeia ligando S e P que, em conjunto com o arco de retorno (P,S) defina um ciclo Γ:

Γ+: arcos de Γ orientados como (P,S)‏

Γ-: arcos de Γ orientados no sentido oposto a (P,S)‏

δ1= minu∈Γ+ [c(u) – f(u)] (aumento possível nos arcos de Γ+)

δ2= minu∈Γ- [f(u)] (redução possível nos arcos de Γ-)

38

" Melhorar a solução (aumentar o fluxo) somando

δ = min{δ1, δ2} aos fluxos nos arcos de Γ+ e subtraindo δ aos

fluxos nos arcos de Γ-.

"   A inexistência de um caminho aumentante no grafo original não quer dizer que não seja possível aumentar o fluxo.

(39)

Problema do Fluxo Máximo

Exemplo: S P a b 2, 4 1, 1 3, 3 0, 5 1, 2 Γ- Γ+ Γ+ Γ+ 3, Γ δ1 = 2 δ2 = 1 f(u) c(u) δ = 1 +1 -1 +1 +1 X 3 X 0 1 X X 4

(40)

Problema do Fluxo Máximo

Algoritmo

•  Procedimento de rotulação para obter um ciclo Γ:

40

x → rótulo δ(x)‏

Quantidade pela qual pode ser

aumentado o fluxo de S a x seguindo uma cadeia cujo último arco é A(x)‏

"   Rotulação direta:

x marcado δ(x)‏ com u = (x,y)‏

f(u) < c(u)‏ y não marcado

δ(y) = min { δ(x), c(u)-f(u) }

x u y

δ(x)

(41)

Problema do Fluxo Máximo

" Rotulação inversa: x marcado δ(x)‏ arco u = (y,x)‏ f(u) > 0 y não marcado

δ(y) = min { δ(x), f(u) }

x u y

δ(x)

A(y) = u

f(u) ← 0 ∀u ROTULAR(f,δ,A,Y) Enquanto δ > 0 faça ALTERAR_FLUXOS(f,δ,A) ROTULAR(f,δ,A,Y) fim-enquanto

(42)

Problema do Fluxo Máximo

42 ROTULAR(f,δ,A,Y) δ, δ(S) ← +∞ Y ← {S} Enquanto P ∉ Y e δ > 0 faça

Se ∃u =(x,y): x ∈ Y, y ∉ Y e f(u) < c(u) então

Y ← Y ∪ {y} A(y) ← u

δ(y) ← min {δ(x), c(u)-f(u)} Senão

Se ∃u =(y,x): x ∈ Y, y ∉ Y e f(u) > 0 então

Y ← Y ∪ {y} A(y) ← u

δ(y) ← min {δ(x), f(u)} Senão

δ ← 0

fim-enquanto

Se P ∈ Y então δ ← δ(P)

(43)

Problema do Fluxo Máximo

ALTERAR_FLUXOS(f,δ,A) x ← P f(P,S) ← f(P,S) + δ Enquanto x ≠ S faça u ← A(x) Se x = T(u) então f(u) ← f(u) + δ x ← I(u) Senão f(u) ← f(u) - δ x ← T(u) fim-enquanto FIM-ALTERAR_FLUXOS

(44)

Problema do Fluxo Máximo

44 Exemplo: S P a b 2, 4 1, 1 3, 3 0, 5 1, 2 3, A(P) = (a,P)‏ Y = {S, b, a, P} δ(P) = 1 A(a) = (a,b)‏ Y = {S, b, a} δ(a) = 1 δ = 1 A(b) = (S,b)‏ Y = {S, b} δ(b) = 2 A(S) = (P,S)‏ Y = {S} δ(S) = +∞ f(S,b) = 3 f(a,b) = 0 f(a,P) = 1 f(b,P) = 3 f(S,a) = 1 f(P,S) = 4 4, 1, 5 0, 2 3, 4 Marcação:

(45)

Problema do Fluxo Máximo

S P a b 1, 1 3, 3 δ = 0, P ∉ Y Y = {S, b} δ(b) = 1 4, 1, 5 0, 2 3, 4 Y = {S} δ(S) = +∞ FIM Marcação: Exemplo:

(46)

Problema do Fluxo Máximo

46 1 5 2 3 4 8 7 6 10 20 12 8 9 12 6 8 8 15 4 5 15 ∞ A(7) = (6,7)‏ Y = {1, 2, 6, 7} δ(7) = 15 A(6) = (2,6)‏ Y = {1, 2, 6} δ(6) = 15 δ = 15 A(2) = (1,2)‏ Y = {1, 2} δ(2) = 20 A(1) = (7,1)‏ Y = {1} δ(1) = +∞ f(6,7) = 15 f(2,6) = 15 f(1,2) = 15 f(7,1) = 15 15 15 15 15 Exemplo:

(47)

Problema do Fluxo Máximo

1 5 2 3 4 8 7 6 10 20 12 8 9 12 6 8 8 15 4 5 15 ∞ A(8) = (4,8)‏ Y = {1, 3, 4, 8} δ(8) = 9 A(4) = (3,4)‏ Y = {1, 3, 4} δ(4) = 9 A(3) = (1,3)‏ Y = {1, 3} δ(3) = 10 A(1) = (7,1)‏ Y = {1} δ(1) = +∞ f(4,8) = 8 f(3,4) = 8 f(1,3) = 8 15 15 15 15 A(7) = (8,7)‏ Y = {1, 3, 4, 8, 7} δ(7) = 8 f(8,7) = 8 23 8 8 8 8 Exemplo:

(48)

Problema do Fluxo Máximo

48 1 5 2 3 4 8 7 6 10 20 12 8 9 12 6 8 8 15 4 5 15 ∞ A(5) = (3,5)‏ Y = {1, 2, 3, 5} δ(5) = 5 A(3) = (2,3)‏ Y = {1, 2, 3} δ(3) = 5 δ = 5 A(2) = (1,2)‏ Y = {1, 2} δ(2) = 5 A(1) = (7,1)‏ Y = {1} δ(1) = +∞ f(3,5) = 5 f(2,3) = 5 f(1,2) = 20 f(7,1) = 28 15 15 15 23 A(7) = (5,7)‏ Y = {1, 2, 3, 5, 7} δ(7) = 5 f(5,7) = 5 8 8 8 8 28 20 5 5 5 Exemplo:

(49)

Problema do Fluxo Máximo

20 1 5 2 3 4 8 7 6 10 20 12 8 9 12 6 8 8 15 4 5 15 ∞ A(7) = (5,7)‏ Y = {1, 3, 5, 7} δ(7) = 2 A(5) = (3,5)‏ Y = {1, 3, 5} δ(5) = 2 = 2 A(3) = (1,3)‏ Y = {1, 3} δ(3) = 2 A(1) = (7,1)‏ Y = {1} δ(1) = +∞ f(5,7) = 7 f(3,5) = 7 f(1,3) = 10 f(7,1) = 30 15 15 28 8 8 8 8 30 5 5 5 10 7 7 Exemplo:

(50)

Problema do Fluxo Máximo

50 7 7 10 30 20 1 5 2 3 4 8 7 6 10 20 12 8 9 12 6 8 8 15 4 5 15 ∞ Y = {1} δ(1) = +∞ 15 15 8 8 8 5 δ = 0, P ∉ Y FIM Exemplo:

(51)

Problema do Fluxo Máximo

Teorema do Corte Mínimo

•  Um conjunto de arcos C é chamado de corte separando P de S se ∃

Y ⊂ X com S ∈ Y e P ∉ Y tal que

C = { u ∈ U: I(u) ∈ Y, T(u) ∉ Y }

•  Um corte separando P de S corta qualquer caminho de S a P no grafo G = (X,U).

•  Capacidade de um corte separando P de S:

(52)

Problema do Fluxo Máximo

" Teorema: 52

f

S P

f

P S S P

Y

Y

f(P,S) ≤ c(C)‏ fluxo viável f corte C ) ( ) ( ) ( ) , ( 0 ) , (

C

c

u

c

u

f

f

S

P

f

f

S

P

f

f

f

C u C u sp ps ps sp = ≤ = ≤ ⇒ ≥ + =

∈ ∈

(53)

Problema do Fluxo Máximo

•  Corolário:

Quando o algoritmo de rotulação termina com um fluxo f sem que seja possível marcar o nó P, f é a solução ótima do problema de fluxo máximo de S a P. P ∉ Y f(u) = c(u), senão a extremidade u estaria marcada u T(u)‏ u I(u)‏ Y Y f(u) = 0, senão a extremidade u estaria marcada Y Y

(54)

Problema do Fluxo Máximo

•  Corolário:

Se as capacidades são inteiras, então o algoritmo de Ford e

Fulkerson obtém em um número finito de iterações uma solução ótima do problema de fluxo máximo.

(55)

Problema do Fluxo Máximo

•  Teorema:

O valor do fluxo máximo é igual à capacidade do corte mínimo separando P de S.

Ao final do procedimento de rotulação:

fSP = fPS + f*(P,S)‏ fPS = 0 fSP = c(C)‏ f*(P,S) = c(C)‏ f(P,S) ≤ c(C)‏ corte é mínimo. f*(P,S)‏ S P Y Y fSP fPS

(56)

Problema do Fluxo Máximo

56 7 7 10 30 20 Exemplo: 1 5 2 3 4 8 7 6 10 20 12 8 9 12 6 8 8 15 4 5 15 ∞ Y = {1} δ(1) = +∞ 15 15 8 8 8 5 δ = 0, P ∉ Y FIM Corte mínimo Capacidade = 30 Fluxo máximo = 30

(57)

PROGRAMAÇÃO

DE TRIPULAÇÕES

ÁRVORES

GERADORAS

MÍNIMAS

(58)

Introdução

•  Árvore Geradora Mínima – AGM

(

Minimum Spanning Tree

– MST)

•  Um dos problemas de otimização mais simples e mais

bem estudados em Ciência da Computação e Teoria dos

Grafos

•  Objetivos

•  Obtenção de uma árvore em um grafo conexo, com arestas valoradas, de tal forma que a soma dos custos das arestas seja mínimo

(59)

Principais Algoritmos

•  Algoritmo de Boruvka (1926)

O. Boruvka. O jistém problému minimálním. Práca Moravské Prirodovedecké Spolecnosi, 3 (1926), 37-58. (In Czech.)

•  Algoritmo de Kruskal (1956)

J.B. Kruskal. On the shortest spanning tree of a graph and the traveling salesman problem. Proceedings of the American

Mathematical Society, 7:48-50, 1956.

•  Algoritmo de Prim (1957)

R.C. Prim. Shortest connection networks and some

(60)

PROGRAMAÇÃO

DE TRIPULAÇÕES

ÁRVORES GERADORAS MÍNIMAS

(61)

Algoritmo de Boruvka

•  Primeiro algoritmo proposto para resolução do Problema

da Árvore Geradora Mínima

•  Surgiu em 1926 antes dos primeiros computadores e da

publicação do primeiro livro sobre teoria dos grafos

(1936)

•  Seu propósito era fornecer uma cobertura elétrica

eficiente para a cidade de Bohemia

(62)

Algoritmo de Boruvka

• 

Seja um grafo G(N, A), onde N é o conjunto de nós e A o

conjunto de arestas

Passo 1: Para cada i ∈ N faça N

i

← { i }

Passo 2: T* ← {}

Passo 3: Enquanto |T*| < (n-1) faça

Ø Para cada árvore Nk faça min(Nk, ik, jk) Ø Para cada árvore Nk faça

Se os nós ik e jk pertencem a árvores diferentes então unir(ik, jk) e atualizar T* ← T* ∪ {(ik, jk)}

(63)

Algoritmo de Boruvka

7

21

14

1

6

(64)

PROGRAMAÇÃO

DE TRIPULAÇÕES

ÁRVORES GERADORAS MÍNIMAS

(65)

Algoritmo de Kruskal

•  Idéia do algoritmo:

•  Aresta de menor peso sempre pertence à árvore

geradora de peso mínimo

(66)

Algoritmo de Kruskal

Criar uma lista L com as arestas ordenadas em ordem crescente de pesos.

Criar |V| subárvores contendo cada uma um nó isolado.

F ← ∅

contador ← 0

Enquanto contador < |V|-1 e L ≠ ∅ faça

Seja (u,v) o próximo arco de L. L ← L – {(u,v)}

Se u e v não estão na mesma subárvore então

F ← F ∪ {(u,v)}

Unir as subárvores que contêm u e v. contador ← contador + 1

fim-se fim-enquanto

(67)

Algoritmo de Kruskal

2 3 7 8 7 17 11 12 9

(68)

Variação do Algoritmo de Kruskal

•  Idéia do algoritmo:

•  Se a aresta de menor peso sempre pertence à

árvore geradora de peso mínimo, então a aresta de

maior peso não

pertence, se o número de arestas

for maior que n-1

•  Complexidade: O(A*log A)

(69)

Variação do Algoritmo de Kruskal

Criar uma lista L com as arestas ordenadas em ordem decrescente de pesos.

F ← L

contador ← 0

Enquanto contador < |A|-|V|-1 e L ≠ ∅ faça

Seja (u,v) o próximo arco de L. L ← L – {(u,v)}

Se (u,v) não é ponte então

F ← F - {(u,v)}

(70)

Variação do Algoritmo de Kruskal

2 7 17 3 7 11 10 12 8 9

(71)

Algoritmo de Kruskal

•  Principais desvantagens:

•  O método exige uma “etapa preparação”, por

exemplo, em caso de representação por listas de

adjacência

(72)

PROGRAMAÇÃO

DE TRIPULAÇÕES

ÁRVORES GERADORAS MÍNIMAS

(73)

Algoritmo de Prim

•  Idéia do algoritmo:

•  Inicia com uma árvore formada apenas por um nó

qualquer do grafo, ou pela aresta de peso mínimo.

•  A cada iteração, adiciona a aresta de menor peso que

conecta um nó já conectado a um nó ainda não

conectado

(74)

Algoritmo de Prim

Seja (u,v) a aresta de menor peso.

F ← {(u,v)}

Para i = 1,...,n faça

Se c(i,u) < c(i,v) então prox(i) ← u Senão prox(i) ← v

fim-para

prox(u), prox(v) ← 0, contador ← 0

Enquanto contador < n-2 faça

Seja j tal que prox(j)≠0 e c(j,prox(j)) é mínimo.

F ← F ∪ {(j,prox(j))}

prox(j) ← 0

Para i = 1,...,n faça

Se prox(i) ≠ 0 e c(i,prox(i)) > c(i,j) então

prox(i) ← j fim-para

contador ← contador + 1

(75)

Algoritmo de Prim

2 3 17 11 12 9 7 8 7

(76)

PROGRAMAÇÃO

DE TRIPULAÇÕES

ÁRVORES GERADORAS MÍNIMAS

(77)

Implementações

•  Variação na estrutura de dados utilizada:

•  Prim usando

Pairing Heap

•  Prim usando

Fibonacci Heap

(78)

Pairing Heap x Fibonacci Heap

Operação Complex. “Real” Complexidade Amortizada

Pairing Heap Fibonacci Heap

isEmpty O(1) O(1) O(1)

size O(1) O(1) O(1)

getMax O(1) O(1) O(1)

put O(1) O(log n) ** O(1)

removeMax O(n) O(log n) O(log n)

meld O(1) O(log n) ** O(1)

remove O(n) O(log n) O(log n)

(79)

Resultados de Moret e Shapiro (1991)

•  Grafos esparsos

1)  Binary Heap 2)  Fibonacci Heap

(80)

Resultados de Moret e Shapiro (1991)

•  Grafos com A = N * log N

1)  Binary Heap 2)  Fibonacci Heap

3)  Slay tree

4)  Rank-relaxed Heap

(81)

Resultados de Moret e Shapiro (1991)

•  Grafos com A = N

3/2

(grafos densos)

1)  Binary Heap 2)  Fibonacci Heap

(82)

Resultados da Literatura

•  Moret e Shapiro (1991) fazem uma série de

experimentos envolvendo vários algoritmos e estruturas

de dados para gerar uma AGM.

•  Nos testes foram utilizadas diferentes estruturas e

densidades de grafos

•  Foi feita uma análise tanto de desempenho quanto de

consumo de espaço em memória

(83)

Resultados da Literatura

•  Consumo de memória

(84)

Resultados da Literatura

•  Tempo de execução

(85)

Referências

Documentos relacionados

A começar pela literatura infantil, passando pelos desenhos animados á televisão e ao cinema, os personagens oferecem imagens que são muito significativas para

R. A admissão de membros, na Igreja Presbiteriana, obedece aos seguintes critérios: 1. As pessoas batizadas na infância, numa Igreja Evangélica, são admitidas como membros da

De Conceição de Macabú para Macaé o modelo ajustado para o movimento, da mesma forma que para Campos dos Goytacazes, indicou baixo poder de explicação para o rendimento do trabalho

A leitura é uma atividade que pode ser explicada por diferentes perspectivas teóricas. Nesta aula aprendemos que diferentes perspectivas teóricas explicam o processo de leitura:

A partir da análise de cadernos escolares das décadas de 1960 e 1970, busca-se investigar a presença de uma geometria proposta pelo Movimento da Matemática Moderna

No entanto, expressões de identidade não são banidas da linguagem com sentido apenas porque a identidade não é uma relação objetiva, mas porque enunciados de identi- dade

Tabela de medidas: todas as medidas especificadas na tabela de medida em anexo se referem à peça pronta, já tendo recebido a 1ª lavagem caso haja diferença na peça

Os roedores (Rattus norvergicus, Rattus rattus e Mus musculus) são os principais responsáveis pela contaminação do ambiente por leptospiras, pois são portadores