170 likes | 257 Views
Understand how to find the shortest path between nodes in a graph by calculating the sum of edge lengths. This includes determining optimal routes in road networks and construction projects. Explore the conditions for existence of paths and learn about the Moore-Dijkstra algorithm.
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