Celso C. Ribeiro Caroline T. Rocha Algoritmos em Grafos Celso C. Ribeiro Caroline T. Rocha
PARTE 6: Caminhamento em Grafos Algoritmos em Grafos
Caminhamento em Grafos Dados: G = (V,E) V = {1, 2, ..., n} conjunto de nós E = { (u1,v1), ..., (um,vm)} conjunto de arestas Representação por listas de adjacências 1 2 3 4 5 5 3 1 2 4 Algoritmos em Grafos
Caminhamento em Grafos Caminhar/percorrer um grafo: visitar todos os nós e arestas BUSCA EM PROFUNDIDADE Enquanto for possível, aprofundar-se no grafo. Quando não for mais possível, recuar. 7º 6º 8 9 1 5 4 2 6 3 7 10 1º 2 8º 3 10 1 10º 9 4 3º 6 2º 4º 7 5 9º 8 5º Algoritmos em Grafos
Caminhamento em Grafos 1 4 6 5 7 8 3 2 10 9 7º 6º 8 9 1 5 4 2 6 3 7 10 1º 2 8º 3 10 1 10º 9 4 3º 6 2º 4º 7 5 9º 8 5º Algoritmos em Grafos
Caminhamento em Grafos A ordem em que os nós e arestas são visitados depende: do nó inicial da ordem em que os nós e as arestas aparecem na estrutura de dados Algoritmos em Grafos
Caminhamento em Grafos Algoritmo recursivo para busca a partir de um nó Procedimento PROF(nó v) visitado(v) sim Para cada nó w adjacente a v faça Se visitado(w) = não então PROF(w) fim-para Fim Algoritmos em Grafos
Caminhamento em Grafos Exemplo: 1 D A E B C F G H A A B C D E F G H X X 2 7 B C X X D E F G 3 X 5 6 8 X X H 4 X não visitado visitado Algoritmos em Grafos
Caminhamento em Grafos Exemplo: A B E F D H C G 1 D A E B C F G H A 2 7 B C D E F G 3 5 6 8 H 4 Árvore de busca em profundidade (pilha) Algoritmos em Grafos
Caminhamento em Grafos Algoritmo de busca em profundidade Procedimento BUSCA-PROF Para i = 1,...,n faça visitado(i) não fim-para Se visitado(i) = não então PROF(i) Fim Algoritmos em Grafos
Caminhamento em Grafos Exemplo: 7 1 11 8 2 3 1 7 5 6 4 11 9 14 12 10 13 1 2 11 6 8 7 8 2 3 10 14 9 4 9 12 6 3 10 5 5 13 4 13 12 14 Algoritmos em Grafos
Caminhamento em Grafos Aplicações de busca em profundidade, grafo G=(V,E): G é acíclico? G é conexo? G é bipartido? G é planar? Quais são as componentes conexas de G? Quais são as componentes biconexas de G? Quais são os pontos de articulação de G? Algoritmos em Grafos
Caminhamento em Grafos Algoritmo para encontrar as componentes conexas Procedimento COMPONENTES-CONEXAS Para i = 1,...,n faça visitado(i) 0 fim-para componente 0 Se visitado(i) = 0 então componente componente + 1 PROF(i, componente) fim-se Fim Algoritmos em Grafos
Caminhamento em Grafos Algoritmo para encontrar as componentes conexas Procedimento PROF(v, marca) visitado(v) marca Para cada nó w adjacente a v faça Se visitado(w) = 0 então PROF(w, marca) fim-se fim-para Fim Algoritmos em Grafos
Caminhamento em Grafos Exemplo: Problema do mosaico 4 5 3 8 2 7 1 6 ■ Novas configurações (mosaicos) são obtidas através do movimento de um elemento para a posição vazia. Quantos e quais mosaicos intermediários existem entre dois mosaicos específicos? 4 5 3 8 2 7 1 6 ■ 1 2 3 4 5 7 6 8 ■ Algoritmos em Grafos
Caminhamento em Grafos 4 ■ 6 2 7 5 1 3 8 4 5 6 ■ 7 2 1 3 8 4 5 6 2 7 ■ 1 3 8 4 5 6 2 7 3 1 ■ 8 4 5 6 2 7 1 ■ 3 8 4 5 6 2 7 1 8 3 ■ 4 5 6 2 ■ 1 7 3 8 1 2 3 4 5 ■ 6 8 7 ? Algoritmos em Grafos
Caminhamento em Grafos 1 2 8 3 1 6 4 7 ■ 5 Busca em profundidade 2 NÓ INICIAL 18 2 8 3 1 6 4 ■ 7 5 2 8 3 1 ■ 4 7 6 5 2 8 3 1 6 4 7 5 ■ 3 19 28 2 8 3 ■ 6 4 1 7 5 2 8 3 ■ 1 4 7 6 5 2 ■ 3 1 8 4 7 6 5 2 8 3 1 4 ■ 7 6 5 4 8 20 24 29 ■ 8 3 2 6 4 1 7 5 2 8 3 6 ■ 4 1 7 5 ■ 8 3 2 1 4 7 6 5 2 8 3 7 1 4 ■ 6 5 ■ 2 3 1 8 4 7 6 5 2 3 ■ 1 8 4 7 6 5 5 9 12 15 21 25 30 8 ■ 3 2 6 4 1 7 5 2 ■ 3 6 8 4 1 7 5 2 8 3 6 4 ■ 1 7 5 2 8 3 6 7 4 1 ■ 5 8 ■ 3 2 1 4 7 6 5 2 8 3 7 1 4 6 ■ 5 1 2 3 ■ 8 4 7 6 5 NÓ ALVO 6 7 10 11 13 14 16 17 22 23 26 27 31 8 3 ■ 2 6 4 1 7 5 8 6 3 2 ■ 4 1 7 5 ■ 2 3 6 8 4 1 7 5 2 3 ■ 6 8 4 1 7 5 2 8 ■ 6 4 3 1 7 5 2 8 3 6 4 5 1 7 ■ 2 8 3 6 7 4 ■ 1 5 2 8 3 6 7 4 1 5 ■ 8 3 ■ 2 1 4 7 6 5 8 1 3 2 ■ 4 7 6 5 2 8 3 7 ■ 4 6 1 5 2 8 3 7 1 4 6 5 ■ 1 2 3 8 ■ 4 7 6 5 1 2 3 7 8 4 ■ 6 5 Algoritmos em Grafos
Caminhamento em Grafos BUSCA EM AMPLITUDE Enquanto for possível, examinar todos os nós à mesma distância do nó inicial. Quando não for mais possível, aprofundar. 5 6 8 9 1 5 4 2 6 3 7 10 1 2 9 3 10 1 2 9 4 7 6 4 10 7 5 3 8 8 Algoritmos em Grafos
Caminhamento em Grafos D A E B C F G Exemplo: Árvore de busca em profundidade (pilha) Árvore de busca em amplitude (fila) B C A F G D E D E A F G C B Algoritmos em Grafos
Caminhamento em Grafos Algoritmo de busca em amplitude Procedimento BUSCA-AMPL(v) visitado(v) sim Colocar v em uma fila Enquanto fila não vazia faça w retirar o elemento da frente da fila Para cada vértice i adjacente a w faça Se visitado(i) = não então visitado(i) sim Colocar i no final da fila fim-se fim-para fim-enquanto Fim Algoritmos em Grafos
Caminhamento em Grafos Exemplo: A B C D E F G H 1 D A E B C F G H A 2 3 B C D E F G 4 5 6 7 H 8 Fila w = G H F B D E A C não visitado visitado F G H B C A E D E C D B G F D F E C D E Algoritmos em Grafos
Caminhamento em Grafos Exemplo: D A E B C F G H 1 D A E B C F G H A 2 3 B C D E F G 4 5 6 7 H 8 Árvore de busca em amplitude (fila) Algoritmos em Grafos
Caminhamento em Grafos 1 2 8 3 1 6 4 7 ■ 5 Busca em amplitude Exemplo do mosaico: 2 NÓ INICIAL 3 4 2 8 3 1 6 4 ■ 7 5 2 8 3 1 ■ 4 7 6 5 2 8 3 1 6 4 7 5 ■ 5 6 7 8 9 2 8 3 ■ 6 4 1 7 5 2 8 3 ■ 1 4 7 6 5 2 ■ 3 1 8 4 7 6 5 2 8 3 1 4 ■ 7 6 5 2 8 3 1 4 ■ 7 6 5 10 11 12 13 14 15 16 17 18 19 ■ 8 3 2 6 4 1 7 5 2 8 3 6 ■ 4 1 7 5 ■ 8 3 2 1 4 7 6 5 2 8 3 7 1 4 ■ 6 5 ■ 2 3 1 8 4 7 6 5 2 3 ■ 1 8 4 7 6 5 2 8 ■ 1 4 3 7 6 5 2 8 3 1 4 5 7 6 ■ 2 8 3 1 ■ 6 7 5 4 2 8 ■ 1 6 3 7 5 4 20 21 22 23 24 25 26 8 ■ 3 2 6 4 1 7 5 2 ■ 3 6 8 4 1 7 5 2 8 3 6 4 ■ 1 7 5 2 8 3 6 7 4 1 ■ 5 8 ■ 3 2 1 4 7 6 5 2 8 3 7 1 4 6 ■ 5 1 2 3 ■ 8 4 7 6 5 2 3 4 1 8 ■ 7 6 5 2 ■ 8 1 4 3 7 6 5 2 8 3 1 4 5 7 ■ 6 2 8 3 ■ 1 6 7 5 4 2 ■ 3 1 8 6 7 5 4 2 8 3 1 5 6 7 ■ 4 2 ■ 8 1 6 3 7 5 4 NÓ ALVO 27 8 3 ■ 2 6 4 1 7 5 8 6 3 2 ■ 4 1 7 5 ■ 2 3 6 8 4 1 7 5 2 3 ■ 6 8 4 1 7 5 2 8 ■ 6 4 3 1 7 5 2 8 3 6 4 5 1 7 ■ 2 8 3 6 7 4 ■ 1 5 2 8 3 6 7 4 1 5 ■ 8 3 ■ 2 1 4 7 6 5 8 1 3 2 ■ 4 7 6 5 2 8 3 7 ■ 4 6 1 5 2 8 3 7 1 4 6 5 ■ 1 2 3 8 ■ 4 7 6 5 1 2 3 7 8 4 ■ 6 5 Algoritmos em Grafos
Caminhamento em Grafos Algoritmo de Dijkstra: Caminho mais curto do nó 1 (inicial) ao nó n (final) Grafo G = (V,E) distâncias cij 0 Passo 0: (1) 0, (i) +, i = 2,...,n Passo 1: Obter i V tal que (i) = minjV (j) Passo 2: Se i = n, então terminar Passo 3: V V – {i} Passo 4: Atualizações: (j) min{(j), (i)+cij}, j +(i) Passo 5: Voltar ao passo 1 Algoritmos em Grafos
Caminhamento em Grafos Suponha-se que exista um oráculo que, para cada nó, estima o comprimento h* do caminho mais curto deste nó até o nó final. *(i) 1 i n i h*(i) Valor do caminho mais curto de 1 a i Valor do caminho mais curto de i a n Qual é a interpretação de *(i) + h*(i) ? Caminho mais curto de 1 a n passando pelo nó i Algoritmos em Grafos
Caminhamento em Grafos = 2 = 5 3 1 2 5 3 6 4 8 7 = 4 = = 0 5 2 = 5 = 5 = 3 = = 3 = h*(j) = 5 = = 1 = 4 3 Caminho mais curto de 1 a 8: aplicando Dijkstra 5 (1 3 4 8) O que acontece se no passo 1 escolhermos (i) = minjN{ (j) + h*(j) } ? Algoritmos em Grafos
Caminhamento em Grafos = 2 = 7 7 1 2 5 3 6 4 8 7 = 4 = 1 = 0 5 8 5 = 5 = 5 = 3 = = 3 = (j) + h*(j) = 5 = = 1 = 5 8 Oráculo: h*(1) = 5 h*(2) = 5 h*(3) = 4 h*(4) = 2 h*(5) = 5 h*(6) = 3 h*(7) = 3 h*(8) = 0 Se a soma (j) + h*(j) é utilizada, apenas os nós do caminho mais curto são examinados. Algoritmos em Grafos
Caminhamento em Grafos = 2 = 3 7 1 2 5 3 6 4 8 7 = 4 = 1 = 0 5 7 4 = 5 = 4 = 3 = = 3 = (j) + h(j) = 5 = = 1 = 4 7 O que acontecerá se usarmos h(j) h*(j) ? Se a soma (j) + h(j) é utilizada, o número de nós aumenta à medida que h(j) decresce de h*(j) até 0. h(1) = 4 h(2) = 1 h(3) = 3 h(4) = 1 h(5) = 4 h(6) = 3 h(7) = 2 h(8) = 0 Em especial, a que corresponde o caso h(j) = 0 j ? Algoritmos em Grafos
Caminhamento em Grafos 3 7 1 2 5 3 6 4 8 7 = 2 = = 4 = 1 = 0 7 7 8 = 7 = = 3 = = 3 = = 5 = = 1 = 5 8 Finalmente, o que poderá acontecer se usarmos h(j) > h*(j) ? A utilização de h(j) > h*(j) pode levar à perda do caminho mais curto. h(1) = 0 h(2) = 1 h(3) = 4 h(4) = 5 h(5) = 4 h(6) = 3 h(7) = 3 h(8) = 0 Algoritmos em Grafos
Caminhamento em Grafos Algoritmo A* A cada etapa, selecionar o nó com menor valor de *(j) + h*(j) Na prática, usar h(j) (estimativa) e não h*(j). h(i) h*(i) h(n) = 0 (alvo) solução ótima, caminho mais curto cij = 1 h(i) 0 busca em amplitude h h* menor número de nós Algoritmos em Grafos
Caminhamento em Grafos Exemplo: Problema do mosaico 4 5 3 8 2 7 1 6 ■ 1 2 3 4 5 7 6 8 ■ Que heurísticas podem ser usadas para estimar a distância (número de movimentos) para chegar no alvo? h1 número de peças fora de posição h2 distância da peça mais afastada h3 soma das distâncias de todas as peças Algoritmos em Grafos
Caminhamento em Grafos 1 2 8 3 1 6 4 7 ■ 5 h1= número de peças fora de posição 0+4 NÓ INICIAL 2 2 8 3 1 6 4 ■ 7 5 2 8 3 1 ■ 4 7 6 5 2 8 3 1 6 4 7 5 ■ 1+5 1+3 1+5 3 4 2 8 3 ■ 1 4 7 6 5 2 ■ 3 1 8 4 7 6 5 2 8 3 1 4 ■ 7 6 5 2+3 2+3 2+4 5 ■ 8 3 2 1 4 7 6 5 2 8 3 7 1 4 ■ 6 5 ■ 2 3 1 8 4 7 6 5 2 3 ■ 1 8 4 7 6 5 3+3 3+4 3+2 3+4 6 1 2 3 ■ 8 4 7 6 5 4+1 7 1 2 3 8 ■ 4 7 6 5 1 2 3 7 8 4 ■ 6 5 NÓ ALVO 5+0 5+2 Algoritmos em Grafos
Caminhamento em Grafos 1 2 8 3 1 6 4 7 ■ 5 h3= soma das distâncias 0+5 NÓ INICIAL 2 2 8 3 1 6 4 ■ 7 5 2 8 3 1 ■ 4 7 6 5 2 8 3 1 6 4 7 5 ■ 1+6 1+4 1+6 3 2 8 3 ■ 1 4 7 6 5 2 ■ 3 1 8 4 7 6 5 2 8 3 1 4 ■ 7 6 5 2+5 2+3 2+5 4 ■ 2 3 1 8 4 7 6 5 2 3 ■ 1 8 4 7 6 5 3+2 3+3 5 1 2 3 ■ 8 4 7 6 5 4+1 6 1 2 3 8 ■ 4 7 6 5 1 2 3 7 8 4 ■ 6 5 NÓ ALVO 5+0 5+2 Algoritmos em Grafos