Enumeração Caminhos - Algoritmo Grafos
-
Upload
thiagoprocaci -
Category
Technology
-
view
4.146 -
download
3
Transcript of Enumeração Caminhos - Algoritmo Grafos
UNIVERSIDADE FEDERAL DE JUIZ DE FORA INSTITUTO DE CIÊNCIAS EXATAS
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO
Enumeração de Caminhos
Thiago Baêsso ProcaciCláudio Lopes
Agenda
• Algoritmo de rotulação de nós
• Algoritmo de rotulação de arcos
• Números de caminhos através de qualquer nó ou arco
• Detalhes de implementação
• Complexidade
Objetivo
• Estudar algoritmos que nos permita obter o números de caminhos, em uma rede acíclica e direcionada, de um nó origem a um nó destino
Algoritmo de Rotulação de Nós
Rotulação de Nós - Definições
O que significa o rótulo de um nó?Considere: s nó origem; t nó destino
O rótulo de cada nó denota o número possíveis de
caminhos para alcançar o nó destino
1
2
3
Rotulação de Nós - Definições
• Scanned: nó já analisado
• UnScannable: nó não analisado
• NScannable: nó cujo que não tem sucessores imediatos ou todos os seus sucessores já foram analisados (scanned).
Com essas definições já é possível entender o algoritmo
Rotulação de Nós - Passos
• Passo 1: Rotular todos os nós NScannable com 0 (zero). Rotular o nó destino com 1.
• Passo 2 (Geral): Analise todos o NScannable k nós e rotule todos os seus J nós antecessores imediatos com:Rótulo J = Rótulo J + Rótulo K
Rotulação de Nós - Passos
• Passo 3: Se o nó origem se tornar NScannable, pare. O número de caminhos possíveis entre a origem e o destino é o rótulo do nó origem.
• Obs.: Se em algum momento todos os nós forem unScannable, pare (não existe nenhum nó que possa ser analisado). Isso implica a existência de ciclos.
Rotulação de Nós - Exemplo
Inicialização: Identificar quais nós são nScannable (não tem sucessores
imediatos) e rotulá-los com 0. Rotular o destino com 1.
1
O nó t é NScannable
NScannable
s: origem
t: destino
Rotulação de Nós - Exemplo
Passo Geral: Analisar todos os NScannable e rotular seus antecessores
1 NScannable
Antecessores de t: 1 e 2 Rótulo 1 = Rótulo 1 + Rótulo t Rótulo 2 = Rótulo 2 + Rótulo t
1
1
O nó t ficará scanned
Rotulação de Nós - Exemplo
Passo Geral: identificar os novos NScannable (sucessores imediatos
scanned)
scanned
NScannable identificado: 1.Seu sucessor (t) é scanned.
NScannable1
1
1
Rotulação de Nós - Exemplo
Passo Geral: Analisar todos os NScannable e rotular seus antecessores
scanned
NScannable1
1
1
Antecessores de 1: s e 2 Rótulo s = Rótulo s + Rótulo 1 Rótulo 2 = Rótulo 2 + Rótulo 1+ 1 = 2
1
O nó 1 ficará scanned
scanned
1
1
Rotulação de Nós - Exemplo
scanned
2
1
Passo Geral: identificar os novos NScannable (sucessores imediatos
scanned)
NScannable identificado: 2.Seus sucessores (t,1) são scanned.
NScannable
Rotulação de Nós - Exemplo
Passo Geral: Analisar todos os NScannable e rotular seus antecessores
scanned
1
1
scanned
2
1
NScannable
Antecessor de 2: s Rótulo s = Rótulo s + Rótulo 2
+ 2 = 3
O nó 2 ficará scanned
Rotulação de Nós - Exemplo
scanned
1
1 scanned
2 scanned
Passo Geral: identificar os novos NScannable (sucessores imediatos
scanned)
NScannable identificado: s.Seus sucessores (1,s) são
scanned.
3
NScannable
Critério de parada satisfeito. O número de caminhos de s até t é 3
Algoritmo de Rotulação de Arcos
Rotulação de Arcos - Definições
O que significa o rótulo de um arco?Considere: s nó origem; t nó destino
O rótulo de cada arco denota o número possíveis
de caminhos, através do arco, da origem para o nó
onde o arco incide
1
1
1
2
1
• LScannable: nó que não tem nenhum arco que chega ou todos os arcos que chegam estão rotulados
Com essas definições já é possível entender o algoritmo
Rotulação de Arcos - Definições
Rotulação de Arcos - Passos
• Passo 1: Rotular todos os arcos que saem dos nós LScannable com 0 (zero). Rotular todos os arcos que saem da origem com 1
• Passo 2 (Geral): Analise todos o LScannable k nós e rotule todos os seus arcos de saída com a soma de todos os rótulos dos arcos que chegam em k
Rotulação de Arcos - Passos
• Passo 3: Se o nó destino se tornar LScannable, pare. O número de caminhos possíveis entre a origem e o destino é o a soma dos rótulos dos arcos incidentes no nó destino .
• Obs.: Se em algum momento todos os nós forem unScannable, pare (não existe nenhum nó LScannable). Isso implica a existência de ciclos.
Rotulação de Arcos - Exemplo
s: origem
t: destino
Inicialização: Identificar quais nós são LScannable (não tem arco que chega) e
rotular seus arcos de saída com 0. Rotular os arcos que saem da origem
com 1.
LScannable identificado: 1.Não tem arco que chega nele.
Rotular seus arcos de saída com 0
LScannable
0
0
Nó origem: sRotular os arcos que saem de s
com 1
1
11
Sempre que todos os arcos que saem de um nó são rotulados, o nó
passa a ser scanned (1 e s)
Rotulação de Arcos - Exemplo
Passo Geral: Identificar nós que são LScannable
0
0
1
11
scanned
scannedLScannable identificado: 2.
Todos os arcos que chegam nele estão rotulados
LScannable
Rotulação de Arcos - Exemplo
0
0
1
11
scanned
LScannable
Passo Geral: Analisar todos os nós LScannable e rotular seus arcos de saída
com a soma dos rótulos dos arcos que chegam no nó.
Rotular o arco que sai de 2.Rótulo do arco que sai = soma dos
rótulos dos arcos que chegam
0 + 1 = 1
O nó 2 se torna scanned
scanned
Rotulação de Arcos - Exemplo
0
0
1
11
scanned
scanned
scanned1
Passo Geral: Identificar nós que são LScannable
LScannable identificado: 3.Todos os arcos que chegam nele
estão rotulados
LScannable
Rotulação de Arcos - Exemplo
scanned
scanned
scanned LScannable
0
0
1
11
1
Passo Geral: Analisar todos os nós LScannable e rotular seus arcos de saída
com a soma dos rótulos dos arcos que chegam no nó.
Rotular o arco que sai de 3.Rotulo do arco que sai = soma dos
rótulos dos arcos que chegam
1 + 1 = 2
O nó 3 se torna scanned
Rotulação de Arcos - Exemplo
Passo Geral: Identificar nós que são LScannable
LScannable identificado: t.Todos os arcos que chegam nele
estão rotulados
scanned
scanned
scanned
0
0
1
11
1scanned
2 Fim do algoritmo, pois o nó destino se tornou
LScannable. O número de caminhos de s para t é a
soma dos rótulos dos arcos que incide em t.
1 + 2 = 3
LScannable
Números de caminhos através de qualquer nó
Aplicando o algoritmo de rotulação de nós obtemos os rótulos (n’k) de cada nó. O rótulo de um nó indica o número de caminhos distintos de um nó k até o nó destino.
Se invertermos as direções de todos os arcos da rede e aplicar o algoritmo de rotulação de nós obteremos os rótulos (n’’k) de cada nó. Neste caso o rótulo indica o número de caminhos distintos de um nó k até o destino, que era a origem no grafo original
O número total de caminhos da origem ao destino através de um nó k é:
nk = n’k x n’’k
Exemplo
3
1
2
11
1
2
3Inverte
Multiplica-se os rótulos
3
2
2
3
Tem-se o números de caminhos distintos de s a t através do nó 1
Números de caminhos através de qualquer arco
O mesmo é válido para rotulação de arcos.
2. Aplica-se o algoritmo de rotulação de arcos para um rede.
3. Inverte os arcos da rede
4. Aplica o algoritmo de rotulação para a rede invertida
5. Multiplica-se os rótulos dos arcos
Como resultado temos o número de caminhos distintos da origem ao destino através de um arco
Detalhes de implementação - Modelo
Detalhes de implementação
Detalhes de implementação
Detalhes de implementação
ComplexidadeOrdem de O(n³) – Rotulação de nós
ComplexidadeOrdem de O(n³) – Rotulação de
arcos
Fim Fonte: Simple Paths in a Directed
Network by Pitu Mirchandani