Algoritmos de Busca em Mapas Um estudo educacional de BFS, DFS, Dijkstra e A* Resumo Este material apresenta, de forma gradual, o problema de encontrar caminhos em mapas representados por grades. Os experimentos disponíveis foram executados com a Busca em Largura, conhecida pela sigla BFS (do inglês Breadth-First Search), e são usados como ponto de partida para compreender também a DFS, o algoritmo de Dijkstra e o A*. Além da explicação conceitual, são analisados três cenários com diferentes posições de início e objetivo e três níveis de complexidade. O propósito é distinguir o caminho encontrado do trabalho necessário para encontrá-lo e mostrar como a estrutura de dados e a informação utilizada por cada algoritmo alteram a ordem de exploração. Conteúdo 1 O problema de busca de caminhos 3 2 Da grade para um grafo 2.1 Comparação inicial entre algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 Como funciona a Busca em Largura 3.1 Estruturas de dados necessárias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Execução passo a passo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Custo computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 4 4 Busca em Profundidade (DFS) 4.1 Pilha, recursão e ordem dos vizinhos . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Execução passo a passo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 5 5 Algoritmo de Dijkstra 5.1 Fila de prioridade e relaxamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Execução passo a passo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 6 6 Busca A* 6.1 A heurística em uma grade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Execução passo a passo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 7 Quatro maneiras de decidir o próximo passo 7 8 Como ler os experimentos 8.1 Cenário 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Cenário 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Cenário 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 9 10 9 Resultados consolidados 9.1 Indicadores derivados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 11 1 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* 10 Leitura comparativa dos experimentos 10.1 O que poderia mudar com a DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 O que mudaria com Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 O que poderia mudar com o A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4 Um protocolo justo de comparação . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 12 12 11 O que os resultados ensinam 12 12 Limitações e extensões 13 13 Questões para revisão 13 14 Conclusão 13 2 Algoritmos de busca em mapas 1 BFS, DFS, Dijkstra e A* O problema de busca de caminhos Encontrar um caminho é uma tarefa recorrente em robótica móvel, jogos digitais, logística e sistemas de navegação. Em termos simples, deseja-se responder à seguinte pergunta: Como sair de uma posição inicial e alcançar um objetivo sem atravessar obstáculos? Neste estudo, o ambiente é representado por um occupancy grid, ou mapa de ocupação. Trata-se de uma grade dividida em células, na qual cada célula informa se uma pequena região do ambiente pode ou não ser atravessada. Vocabulário essencial. Uma célula livre pode ser visitada; uma célula bloqueada representa um obstáculo; a célula de partida indica o início da busca; e a célula objetivo indica o destino. Para este documento, considera-se que um movimento leva o agente de uma célula para uma vizinha permitida. O conjunto de movimentos aceitos deve ser definido antes da execução do algoritmo. Em uma grade com vizinhança de quatro direções, por exemplo, são permitidos movimentos para cima, para baixo, para a esquerda e para a direita. 2 Da grade para um grafo Embora o ambiente seja desenhado como uma grade, um algoritmo de busca pode interpretá-lo como um grafo: • cada célula livre corresponde a um vértice (ou nó); • uma ligação entre duas células vizinhas corresponde a uma aresta; • as células bloqueadas não participam das rotas possíveis; • encontrar um caminho equivale a encontrar uma sequência de vértices entre a partida e o objetivo. Essa transformação é importante porque permite empregar algoritmos clássicos de busca em grafos, como DFS, BFS, Dijkstra e A*. 2.1 Comparação inicial entre algoritmos Tabela 1: Visão geral de algoritmos comuns de busca Algoritmo Estratégia Garante menor caminho? Observação didática DFS Aprofunda uma rota antes de testar alternativas. Explora o mapa por camadas de distância. Não, em geral. Usa pilha ou recursão e pode seguir cedo por uma direção pouco promissora. Usa uma fila e serve como referência neste estudo. BFS Dijkstra A* 3 Expande primeiro o menor custo acumulado. Combina custo acumulado e estimativa até o objetivo. Sim, quando todas as ações têm o mesmo custo. Sim, para custos não negativos. Sim, sob condições apropriadas da heurística. Adequado quando movimentos possuem custos diferentes. Em geral direciona melhor a busca ao destino. Como funciona a Busca em Largura A BFS explora as células em camadas. Primeiro visita as células a um movimento da partida; depois, as células a dois movimentos; em seguida, as células a três movimentos, e assim por diante. 3 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* Essa ordem explica por que ela encontra um caminho com o menor número de passos quando todos os movimentos possuem o mesmo custo. 3.1 Estruturas de dados necessárias Uma implementação típica utiliza: • uma fila, que preserva a ordem de descoberta das células; • um conjunto de visitados, que impede a exploração repetida de uma mesma célula; • um registro de predecessores, usado para reconstruir o caminho após alcançar o objetivo. 3.2 Execução passo a passo 1. Coloque a célula de partida na fila e marque-a como visitada. 2. Retire a primeira célula da fila. 3. Se ela for o objetivo, encerre a busca. 4. Examine seus vizinhos livres. 5. Para cada vizinho ainda não visitado, registre seu predecessor, marque-o como visitado e coloque-o no fim da fila. 6. Repita os passos 2 a 5 enquanto houver células na fila. 7. Se a fila ficar vazia antes de o objetivo ser encontrado, não existe caminho válido nas condições definidas. Por que o caminho é mínimo? Como a BFS examina todas as células a uma distância d antes das células a uma distância d + 1, o primeiro encontro com o objetivo corresponde ao menor número de movimentos, desde que todas as arestas tenham o mesmo custo. 3.3 Custo computacional Em um grafo com V vértices e E arestas, a complexidade de tempo da BFS é O(V + E), pois cada vértice é visitado no máximo uma vez e cada aresta é examinada um número constante de vezes. O consumo de memória também é O(V ), devido à fila, ao conjunto de visitados e ao registro de predecessores. Em uma grade, isso significa que, no pior caso, uma grande parte das células livres poderá ser armazenada e explorada. 4 Busca em Profundidade (DFS) A Busca em Profundidade, ou DFS (do inglês Depth-First Search), adota uma atitude diferente da BFS. Em vez de visitar todas as células próximas antes de avançar, ela escolhe uma direção e segue por essa alternativa enquanto for possível. Quando encontra um obstáculo, um beco sem saída ou uma região já visitada, retorna ao último ponto em que havia outra escolha e tenta a próxima opção. Esse retorno recebe o nome de backtracking. Uma analogia simples é a exploração de um labirinto. A BFS se parece com várias frentes avançando ao mesmo tempo, uma camada após a outra. A DFS se parece com uma pessoa que percorre um corredor até o fim e somente então volta para experimentar outro corredor. 4 Algoritmos de busca em mapas 4.1 BFS, DFS, Dijkstra e A* Pilha, recursão e ordem dos vizinhos A estrutura característica da DFS é a pilha. O último elemento inserido é o primeiro a ser retirado. A busca também pode ser programada de forma recursiva, pois as chamadas de função formam implicitamente uma pilha. Em ambos os casos, é necessário manter o conjunto de células visitadas para evitar ciclos. Em uma grade, a ordem escolhida para examinar os vizinhos exerce grande influência sobre o resultado. Se a implementação testa direita, baixo, esquerda e cima, por exemplo, ela pode encontrar uma rota completamente diferente daquela obtida ao testar cima, esquerda, baixo e direita. As duas execuções continuam sendo DFS; o que muda é a prioridade local das direções. 4.2 Execução passo a passo 1. Coloque a partida na pilha e marque-a como visitada. 2. Retire a célula que está no topo da pilha. 3. Se ela for o objetivo, encerre a busca. 4. Escolha um vizinho livre que ainda não foi visitado. 5. Registre o predecessor e coloque esse vizinho no topo da pilha. 6. Se não houver vizinho disponível, retorne ao ponto de decisão anterior. 7. Repita o processo até encontrar o objetivo ou esvaziar a pilha. A DFS encontra um caminho mínimo? Não necessariamente. Ela pode alcançar rapidamente o objetivo por uma rota longa, sem examinar uma alternativa curta que ficou para trás na pilha. Em um grafo finito, com controle correto de visitados, ela encontra algum caminho quando existe, mas não garante o menor número de movimentos. O custo de tempo da DFS é O(V + E) e sua memória é O(V ) no pior caso. Apesar de BFS e DFS terem a mesma ordem assintótica de tempo, elas não exploram as células na mesma sequência. Por isso, em um mapa específico, uma pode alcançar o objetivo depois de poucas visitas e a outra pode percorrer quase todo o espaço disponível. 5 Algoritmo de Dijkstra Até aqui, cada deslocamento foi tratado como se tivesse o mesmo custo. Essa hipótese funciona para muitos exercícios em grades, mas não representa todas as situações. Um robô pode gastar mais energia ao subir uma rampa; um veículo pode demorar mais em uma rua congestionada; e um personagem pode se mover lentamente sobre areia. Nesses casos, não basta contar passos: é preciso somar custos. O algoritmo de Dijkstra expande primeiro a célula com o menor custo acumulado desde a partida. Esse valor costuma ser representado por g(n). Inicialmente, o custo da partida é zero e o das demais células é considerado infinito. Sempre que a busca encontra uma forma mais barata de chegar a uma célula, seu custo e seu predecessor são atualizados. Esse procedimento é chamado de relaxamento. 5.1 Fila de prioridade e relaxamento Diferentemente da fila comum da BFS, Dijkstra utiliza uma fila de prioridade. O próximo elemento retirado não é simplesmente o mais antigo, mas aquele que possui o menor custo acumulado conhecido. Se a busca está na célula u, pretende alcançar a vizinha v e o movimento custa c(u, v), o custo candidato é gcandidato (v) = g(u) + c(u, v). 5 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* Se esse valor for menor que o custo anteriormente registrado para v, ocorre a atualização: g(v) ← gcandidato (v). 5.2 Execução passo a passo 1. Atribua custo zero à partida e infinito às demais células. 2. Insira a partida na fila de prioridade. 3. Retire a célula de menor custo acumulado. 4. Para cada vizinho livre, calcule o custo de alcançá-lo pela célula atual. 5. Se o novo custo for menor, atualize o custo, o predecessor e a prioridade do vizinho. 6. Encerre quando o objetivo for retirado da fila com seu menor custo definitivo. Relação entre BFS e Dijkstra. Quando todas as arestas custam exatamente o mesmo, Dijkstra e BFS encontram soluções de mesmo custo. Nesse caso especial, a fila de prioridade não oferece a vantagem conceitual que possui em mapas ponderados, e a BFS costuma ser uma implementação mais simples. Com uma fila de prioridade eficiente, uma representação comum da complexidade de Dijkstra é O((V + E) log V ). O algoritmo garante o caminho de menor custo quando os pesos das arestas são não negativos. Custos negativos quebram a lógica de tornar definitivo o menor custo retirado da fila. 6 Busca A* O A* pode ser entendido como uma busca de menor custo que também observa a direção do objetivo. Enquanto Dijkstra decide apenas com base no custo já percorrido, o A* combina esse custo com uma estimativa do que ainda falta percorrer. Para cada célula n, calcula-se f (n) = g(n) + h(n), em que g(n) é o custo acumulado da partida até n e h(n) é uma heurística: uma estimativa do custo de n até o objetivo. A fila de prioridade seleciona a célula com o menor valor de f (n). 6.1 A heurística em uma grade Em uma grade que permite apenas movimentos horizontais e verticais, cada um com custo unitário, uma escolha comum é a distância de Manhattan. Para uma célula (x, y) e um objetivo (xo , yo ), h(x, y) = |x − xo | + |y − yo |. Essa expressão conta quantos deslocamentos horizontais e verticais seriam necessários se não existissem obstáculos. Ela não conhece a rota real, mas fornece uma direção aproximada para a busca. 6.2 Execução passo a passo 1. Atribua g = 0 à partida e calcule sua estimativa h. 2. Insira a partida na fila de prioridade usando f = g + h. 3. Retire a célula com menor valor de f . 4. Calcule novos custos para os vizinhos livres. 6 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* 5. Quando um caminho melhor for descoberto, atualize g, o predecessor e o valor de f do vizinho. 6. Repita até retirar o objetivo da fila ou concluir que ele é inalcançável. O que torna uma heurística segura? Para preservar a garantia de custo mínimo, a heurística deve ser admissível, isto é, não pode superestimar o custo real restante. Em implementações usuais de busca em grafos, também é desejável que ela seja consistente. A distância de Manhattan satisfaz essas condições em uma grade de quatro direções com custos unitários. Se h(n) = 0 para todas as células, o A* passa a se comportar como Dijkstra. Quando a heurística informa bem a direção do objetivo, o A* tende a expandir uma região menor. Contudo, obstáculos podem enganar temporariamente a estimativa: uma célula geometricamente próxima do destino pode estar separada dele por uma parede extensa. No pior caso, o A* ainda pode consumir tempo e memória exponenciais em relação à profundidade da solução, dependendo do espaço de estados e da heurística. Em uma grade finita representada explicitamente, também é possível descrevê-lo em função do número de vértices e arestas; na prática, a principal observação é que a lista aberta pode crescer bastante, embora uma boa heurística normalmente reduza a expansão em comparação com Dijkstra. 7 Quatro maneiras de decidir o próximo passo Os quatro algoritmos se tornam mais fáceis de distinguir quando se observa a pergunta usada para selecionar a próxima célula: • BFS: qual célula foi descoberta primeiro entre as que aguardam exploração? • DFS: qual foi a célula descoberta mais recentemente? • Dijkstra: qual célula possui o menor custo acumulado desde a partida? • A*: qual célula possui a melhor combinação entre custo acumulado e estimativa até o objetivo? Tabela 2: Comparação conceitual dos critérios de exploração 8 Algoritmo Estrutura principal Critério de escolha Solução tida garan- Situação representativa BFS Fila comum Ordem de descoberta Grade pequena ou média sem pesos DFS Pilha Última descoberta Dijkstra Fila de prioridade Menor g(n) A* Fila de prioridade Menor g(n) + h(n) Menor número de passos, com custos iguais Algum caminho, não necessariamente o menor Menor custo, com pesos não negativos Menor custo, com heurística adequada Exploração, conectividade e memória sensível à largura Terrenos e movimentos com custos diferentes Busca dirigida a um objetivo conhecido Como ler os experimentos Foram avaliados três cenários. Em cada cenário, são mantidos os níveis de complexidade simples, intermediário e difícil. Todos os mapas possuem 100 células, mas a quantidade de obstáculos cresce com a dificuldade: • simples: 15 células bloqueadas e 85 livres; 7 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* • intermediário: 37 células bloqueadas e 63 livres; • difícil: 48 células bloqueadas e 52 livres. As duas imagens de cada caso devem ser lidas em conjunto. A primeira apresenta a configuração inicial: células livres em branco, obstáculos em preto, partida em verde e objetivo em vermelho. A segunda apresenta o estado final da busca: o trajeto reconstruído aparece em azul, as regiões processadas são indicadas em cinza e as células em ciano pertencem à fronteira ainda aberta no instante registrado. Assim, é possível comparar o produto final (o caminho) com o trabalho computacional necessário para encontrá-lo (as células exploradas). 8.1 Cenário 1 (a) Mapa simples. (b) Mapa intermediário. (c) Mapa difícil. Figura 1: Configurações iniciais dos mapas do cenário 1. (a) Resultado no mapa simples. (b) Resultado no mapa intermediário. (c) Resultado no mapa difícil. Figura 2: Estado final da BFS no cenário 1: caminho, exploração e fronteira. Neste cenário, os mapas simples e intermediário produzem caminhos de mesmo comprimento (14), mas exigem 81 e 58 células exploradas, respectivamente. Isso mostra que a quantidade de células livres, por si só, não determina o comprimento da rota. Já o mapa difícil força um desvio maior: o caminho cresce para 22 células e todas as 52 células livres são exploradas. 8 Algoritmos de busca em mapas 8.2 BFS, DFS, Dijkstra e A* Cenário 2 (a) Mapa simples. (b) Mapa intermediário. (c) Mapa difícil. Figura 3: Configurações iniciais dos mapas do cenário 2. (a) Resultado no mapa simples. (b) Resultado no mapa intermediário. (c) Resultado no mapa difícil. Figura 4: Estado final da BFS no cenário 2: caminho, exploração e fronteira. O cenário 2 evidencia o efeito da distância entre partida e objetivo. No mapa simples, apenas 16 células são exploradas para produzir um caminho de comprimento 5. Conforme os obstáculos impõem desvios, o comprimento aumenta para 7 e depois para 17, acompanhado pelo crescimento da exploração para 24 e 40 células. 9 Algoritmos de busca em mapas 8.3 BFS, DFS, Dijkstra e A* Cenário 3 (a) Mapa simples. (b) Mapa intermediário. (c) Mapa difícil. Figura 5: Configurações iniciais dos mapas do cenário 3. (a) Resultado no mapa simples. (b) Resultado no mapa intermediário. (c) Resultado no mapa difícil. Figura 6: Estado final da BFS no cenário 3: caminho, exploração e fronteira. Neste cenário, o mapa difícil apresenta um resultado particularmente instrutivo: seu caminho tem comprimento 12, igual ao do mapa simples, mas somente 39 células são exploradas, contra 77 no caso simples. Os obstáculos reduziram o número de alternativas disponíveis e canalizaram a expansão da BFS. Portanto, adicionar obstáculos nem sempre aumenta o esforço da busca; o efeito depende de onde eles estão posicionados. 9 Resultados consolidados As Tabelas 3, 4 e 5 reúnem as métricas dos experimentos. A coluna “células exploradas” mede o esforço da busca, enquanto o “comprimento do caminho” mede o tamanho da solução encontrada. Essas grandezas estão relacionadas, mas não são equivalentes. Tabela 3: Métricas da BFS no cenário 1 Complexidade Total Bloqueadas Livres Exploradas Caminho Simples Intermediário Difícil 100 100 100 15 37 48 85 63 52 81 58 52 14 14 22 10 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* Tabela 4: Métricas da BFS no cenário 2 Complexidade Total Bloqueadas Livres Exploradas Caminho Simples Intermediário Difícil 100 100 100 15 37 48 85 63 52 16 24 40 5 7 17 Tabela 5: Métricas da BFS no cenário 3 9.1 Complexidade Total Bloqueadas Livres Exploradas Caminho Simples Intermediário Difícil 100 100 100 15 37 48 85 63 52 77 49 39 12 14 12 Indicadores derivados Para aprofundar a leitura, pode-se calcular a taxa de exploração: células exploradas × 100%. células livres Por exemplo, no mapa simples do cenário 1, a BFS explora taxa de exploração = 81 × 100% ≈ 95,3% 85 das células livres. No mapa simples do cenário 2, essa taxa é de apenas 16 × 100% ≈ 18,8%. 85 Os dois mapas possuem o mesmo número de células livres, mas exigem esforços muito diferentes. A posição relativa entre partida e objetivo e a distribuição espacial dos obstáculos são, portanto, decisivas. 10 Leitura comparativa dos experimentos Os valores das Tabelas 3, 4 e 5 foram medidos para a BFS. Como não há registros de execução dos outros três algoritmos, não seria correto atribuir a eles quantidades exatas de células exploradas. Ainda assim, os mapas permitem discutir, de maneira fundamentada, como cada estratégia tenderia a se comportar. 10.1 O que poderia mudar com a DFS No cenário 1, a BFS explora 81 células no mapa simples antes de obter um caminho de comprimento 14. Uma DFS poderia encontrar o objetivo após explorar menos células se a ordem dos vizinhos a conduzisse cedo para a região correta. A situação inversa também é possível: se a primeira direção escolhida se afastasse do objetivo, a busca poderia visitar muitos corredores e devolver um caminho maior que 14. O cenário 2 reforça essa dependência. Como partida e objetivo estão próximos no mapa simples, a BFS encerra a busca após 16 células exploradas. A DFS não aproveita automaticamente essa proximidade, pois não mede distância. Seu desempenho dependeria de a primeira sequência de decisões coincidir ou não com uma rota até o objetivo. No mapa difícil do cenário 3, os obstáculos canalizam a expansão da BFS e reduzem as alternativas. Essa característica também pode favorecer a DFS: com menos bifurcações, há menos possibilidades de ela seguir por um ramo inadequado. Mesmo assim, sem executar o algoritmo e fixar a ordem dos vizinhos, não se pode afirmar qual seria o caminho produzido. 11 Algoritmos de busca em mapas 10.2 BFS, DFS, Dijkstra e A* O que mudaria com Dijkstra Nos experimentos apresentados, cada movimento vale uma unidade. Portanto, Dijkstra encontraria caminhos com o mesmo custo mínimo da BFS, embora a ordem entre células empatadas pudesse alterar detalhes da exploração. Sua verdadeira utilidade apareceria se as células livres recebessem pesos diferentes. Suponha, por exemplo, que uma rota de cinco movimentos atravesse três células de custo 4, totalizando custo elevado, enquanto outra rota utilize oito movimentos de custo 1. A BFS escolheria a primeira por conter menos passos. Dijkstra escolheria a segunda por possuir menor custo total. Assim, o significado de “melhor caminho” precisa ser definido antes da escolha do algoritmo. 10.3 O que poderia mudar com o A* O A* usaria a posição do objetivo, informação que a BFS e Dijkstra não usam para definir a prioridade. No mapa simples do cenário 1, a BFS expande quase todas as células livres. Uma heurística de Manhattan provavelmente concentraria mais a busca nas direções que reduzem a distância até o destino. Essa é uma expectativa qualitativa, não um resultado medido. Nos mapas difíceis, paredes podem exigir que o agente se afaste temporariamente do objetivo para alcançar uma passagem. Nesses trechos, a heurística aponta a direção geral, mas não prevê o obstáculo. O componente g(n) impede que a busca dependa apenas dessa estimativa e ajuda a preservar a escolha de uma rota de custo mínimo. 10.4 Um protocolo justo de comparação Para transformar as observações anteriores em resultados experimentais, os quatro algoritmos devem receber exatamente os mesmos mapas, movimentos e critérios de contagem. Também é necessário registrar: • a ordem dos vizinhos, especialmente para BFS e DFS; • o custo de cada movimento, para Dijkstra e A*; • a heurística utilizada pelo A*; • o instante em que uma célula é considerada explorada; • o critério de desempate nas filas de prioridade; • o comprimento em passos, o custo total, o número de células exploradas, o tempo e o pico de memória. Sem esse controle, diferenças atribuídas ao algoritmo podem, na realidade, ter sido provocadas por detalhes da implementação. 11 O que os resultados ensinam 1. Mais obstáculos não significa automaticamente mais exploração. Obstáculos podem gerar desvios, mas também podem eliminar alternativas e direcionar a expansão. 2. Um caminho curto não implica necessariamente uma busca pequena. A BFS pode examinar muitas células situadas na mesma camada de distância antes de alcançar o objetivo. 3. A posição do objetivo é importante. Um objetivo próximo tende a ser encontrado após poucas camadas, embora a configuração do mapa possa alterar esse comportamento. 4. Exploração e solução medem aspectos diferentes. O número de células exploradas representa custo computacional; o comprimento do caminho representa a qualidade da rota em número de movimentos. 5. A BFS é completa em grafos finitos. Se existir um caminho e o controle de visitados estiver correto, a busca conseguirá encontrá-lo. Se a fila esvaziar, partida e objetivo estão desconectados. 12 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* 6. O menor número de passos não é sempre o menor custo. Quando terrenos possuem pesos diferentes, Dijkstra ou A* representam melhor o problema. 7. Informação sobre o objetivo pode reduzir a exploração. O A* utiliza uma heurística para orientar a busca, enquanto BFS e Dijkstra expandem sem essa direção explícita. 8. A ordem de visita faz parte do comportamento. Na DFS, sobretudo, alterar a prioridade dos vizinhos pode mudar bastante o caminho e o número de células visitadas. 12 Limitações e extensões A BFS é uma excelente ferramenta introdutória e uma referência confiável para grades sem custos diferenciados. Entretanto, ela não considera que certos terrenos possam ser mais difíceis de atravessar, nem utiliza informação sobre a direção do objetivo. A DFS também ignora custos e não garante uma rota mínima. Dijkstra admite pesos, mas não se orienta pela posição do destino. O A* introduz essa orientação, porém seu comportamento depende da qualidade e da adequação da heurística. Em mapas maiores, todos exigem atenção ao tempo e à memória. Como continuidade, podem ser realizados os seguintes experimentos: • executar BFS e DFS com diferentes ordens de vizinhos; • atribuir custos diferentes às células e comparar BFS com Dijkstra; • executar Dijkstra e A* para medir o efeito real da heurística; • permitir movimentos diagonais e observar como muda o comprimento dos caminhos; • medir tempo de execução e consumo de memória em grades maiores. 13 Questões para revisão 1. Por que a BFS utiliza uma fila, e não uma pilha? 2. Em que condição a BFS garante um caminho de custo mínimo? 3. Qual é a diferença entre uma célula explorada e uma célula pertencente ao caminho final? 4. Por que o mapa difícil do cenário 3 explora menos células que o mapa simples? 5. Qual algoritmo seria mais apropriado se atravessar algumas células custasse mais que atravessar outras? 6. Por que duas execuções de DFS podem encontrar rotas diferentes no mesmo mapa? 7. Qual é a função de g(n) em Dijkstra e no A*? 8. O que representa h(n) e por que ela não deve superestimar o custo restante? 9. Em que situação o A* se comporta como Dijkstra? 14 Conclusão Os experimentos mostram que o comportamento de uma busca não depende apenas da quantidade de obstáculos. A distância até o objetivo, a disposição das células bloqueadas, os custos de movimento e o número de rotas alternativas influenciam a expansão. A BFS encontra o menor caminho em número de movimentos quando todos têm o mesmo custo; a DFS privilegia o aprofundamento e pode retornar uma rota não mínima; Dijkstra encontra o menor custo em grafos com pesos não negativos; e o A* acrescenta uma estimativa para orientar a exploração até o objetivo. Não existe um único algoritmo superior em qualquer situação. A escolha depende da pergunta formulada. Se o interesse é minimizar passos com custos iguais, a BFS é suficiente. Se basta localizar alguma solução ou investigar a estrutura do grafo, a DFS pode ser apropriada. Se os 13 Algoritmos de busca em mapas BFS, DFS, Dijkstra e A* movimentos têm pesos diferentes, Dijkstra oferece a referência de menor custo. Quando o objetivo é conhecido e existe uma heurística adequada, o A* pode alcançar a mesma qualidade de solução explorando menos estados. Comparações responsáveis devem medir cada alternativa sob as mesmas condições, sem confundir comprimento, custo e esforço computacional. 14
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )