170 likes | 257 Views
Algoritmos em Grafos. CAMINHOS MAIS CURTOS. Caminhos mais Curtos. Dados: grafo G=(V,A) orientado e distância c ij associada ao arco ( i , j ) A. Problema: Obter o caminho mais curto entre dois nós s e t.
E N D
CAMINHOS MAIS CURTOS Algoritmos em Grafos
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. • 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 dependendo da aplicação: custos, distâncias, consumo de combustível, etc. Exemplo 1: Dado um mapa rodoviário, determinar a rota mais curta de uma cidade a outra. (rota mais rápida, rota com menor consumo de combustível, ...) Algoritmos em Grafos
B E H 6 4 4 2 4 4 8 F I 5 5 2 5 K A C 4 2 4 7 4 2 4 G J D 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). Solução: A – D – G – I – K custo = 7 + 2 + 2 + 5 = 16 Algoritmos em Grafos
k w i j Caminhos mais Curtos • Condição de existência: Caminho de i a j contendo um circuito 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? Algoritmos em Grafos
A solução ótima (caminho mais curto) sempre será um caminho elementar (sem circuito). Caminhos mais Curtos Condição de existência: não há circuitos de comprimento negativo. Algoritmos em Grafos
Caminhos mais Curtos • Caminho mais curto: - De um nó a outro - De um nó a todos os demais - Entre todos os pares de nós de um grafo Algoritmos em Grafos
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. 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 Algoritmos em Grafos
cai a 1 b c i cbi cci Caminhos mais Curtos • Cada nó i V possui um rótulo (i ), que verifica a seguinte propriedade: • 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. Algoritmos em Grafos
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 . 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 Algoritmos em Grafos
Caminhos mais Curtos • comprimento de P1 ≥ (L) ≥ (j) comprimento de P2 ≥ 0 Logo, o comprimento de P1 + P2 ≥ (j). Algoritmos em Grafos
Inicializar S {2,3,...,n}, S {1}, (1) 0, (j) c1j se j1+ + caso contrário EnquantoS faça Selecionar jS tal que (j)= miniS{(i)} S S – {j} Para iS e ij+faça (i) min{(i), (j)+cji} fim_enquanto Caminhos mais Curtos Algoritmo de Moore-Dijkstra O algoritmo 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. Algoritmos em Grafos
S = {1} S = {2,3,4,5,6} 1 1 3 3 5 4 2 6 4 5 6 2 4 4 5 5 2 2 7 7 j = 3 S = {2,4,5,6} 1 1 2 2 5 5 3 3 *(1) = 0 1 1 7 7 *(3) = 1 Caminhos mais Curtos Exemplo: (1) = 0 (2) = 7 (3) = 1 (4) = (5) = (6) = + ITERAÇÃO 1 (2) = min{7, 1+5} = 6 (5) = min{, 1+2} = 3 (6) = min{, 1+7} = 8 Algoritmos em Grafos
4 5 *(5) = 3 2 1 1 7 *(1) = 0 1 2 5 3 1 7 3 3 6 4 6 2 5 2 5 4 *(3) = 1 4 5 *(2) = 5 *(5) = 3 j = 2 S = {4,6} j = 5 S = {2,4,6} 2 7 *(1) = 0 1 2 5 3 1 7 *(3) = 1 Caminhos mais Curtos ITERAÇÃO 2 (2) = min{6, 3+2} = 5 (4) = min{, 3+5} = 8 ITERAÇÃO 3 (4) = min{8, 5+4} = 8 (6) = min{, 5+1} = 6 Algoritmos em Grafos
4 5 *(2) = 5 *(5) = 3 2 7 *(1) = 0 1 2 5 3 1 1 1 7 *(3) = 1 *(6) = 6 3 3 5 5 2 2 6 4 4 6 *(4) = 8 4 5 *(2) = 5 *(5) = 3 j = 4 S = { } j = 6 S = {4} 2 7 *(1) = 0 1 2 5 3 1 7 *(3) = 1 *(6) = 6 Caminhos mais Curtos ITERAÇÃO 4 (4) = 8 ITERAÇÃO 5 Algoritmos em Grafos
3 3 4 1 2 5 2 1 3 2 1 3 4 3 2 5 6 7 4 Caminhos mais Curtos Iteração Início nó 0 4 2 0 4 2 5 4 0 4 2 5 4 7 7 0 4 2 5 4 7 7 0 4 2 5 4 7 7 0 4 2 5 4 7 7 0 4 2 5 4 7 7 Algoritmos em Grafos
Caminhos mais Curtos • Número de operações (tempo): O(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. Algoritmos em Grafos