Este repositório contém uma explicação prática do Algoritmo A* (A-estrela) e de como combiná-lo com um heap binário para implementar de forma eficiente a fila de prioridade do conjunto aberto (open set).
- O A* seleciona o próximo nó a expandir minimizando
f(n) = g(n) + h(n), onde:g(n)é o custo acumulado do início atén.h(n)é a heurística (estimativa) do custo denaté o objetivo.
- Com heurística admissível e consistente, A* encontra o caminho ótimo.
- O heap binário oferece operações eficientes para a fila de prioridade:
- Inserção:
O(log N) - Extração do mínimo:
O(log N)
- Inserção:
- Na prática, usa-se lazy deletion para lidar com a ausência de
decrease-keyem heaps binários simples (comoheapqdo Python).
Para uma explicação completa, incluindo código de exemplo em Python, boas práticas e alternativas ao heap binário, consulte o tutorial:
O aplicativo interativo está em main.py (Pygame). Principais componentes:
compute_board_rect(...): calcula o retângulo centralizado do tabuleiro.create_grid(...): cria a matriz booleana de células (False = livre, True = obstáculo).pos_to_cell(...): converte posição em pixels para coordenadas de célula(row, col).nearest_free_cell(...): via BFS, encontra a célula livre mais próxima de uma origem.draw_board(...): desenha o tabuleiro, obstáculos e a grade.cell_center_px(...)evalid_cell(...): utilitários de coordenadas/validação.a_star_grid(...): implementação de A* sobre o grid 4-conexo usandoheapq(heap binário).main(): loop do Pygame, trata eventos do mouse, replaneja caminho e anima o movimento do agente.
As funções agora possuem docstrings detalhadas em Português, facilitando o entendimento do fluxo.
A função a_star_grid(grid, start, goal) utiliza:
- Heurística Manhattan:
h(n) = |r_n - r_goal| + |c_n - c_goal|. - Custo uniforme por passo (1 por movimento ortogonal).
heapqcomo fila de prioridade (heap binário) com técnica de lazy deletion: quando um nó recebe um custo melhor, uma nova entrada é empilhada e as antigas são ignoradas no momento da extração sefestiver desatualizado.
No loop principal (main()), o agente:
- Converte sua posição atual para célula e, se bloqueada, usa
nearest_free_cell(...). - Planeja até a célula livre mais próxima do cursor do mouse.
- Replaneja quando o objetivo muda ou quando o grid é editado.
- Move-se suavemente entre os waypoints do caminho planejado em velocidade fixa.
Este projeto inclui um tabuleiro interativo feito em Python com Pygame. O tabuleiro ocupa 80% da janela, utiliza células de 32x32 pixels e permite desenhar/apagar passando o mouse com o botão esquerdo pressionado (toggle por célula).
Passos recomendados (Linux):
- Crie e ative um ambiente virtual
python3 -m venv .venv
source .venv/bin/activate- Instale as dependências
pip install -r requirements.txt- Execute o aplicativo
python main.pyControles:
- Botão esquerdo do mouse pressionado: alterna o estado das células ao passar por cima (marca/desmarca).
- Fechar janela para encerrar.
- Hart, Nilsson, Raphael (1968) — "A Formal Basis for the Heuristic Determination of Minimum Cost Paths".
- Russell & Norvig — "Artificial Intelligence: A Modern Approach".
- Implementações:
heapq(Python),std::priority_queue(C++),PriorityQueue(Java).
Este trabalho está licenciado sob a licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional (CC BY-SA 4.0).
- Consulte o arquivo
LICENSE.mdpara detalhes. - Resumo (legível por humanos): https://creativecommons.org/licenses/by-sa/4.0/deed.pt_BR
- Texto legal completo: https://creativecommons.org/licenses/by-sa/4.0/legalcode
Ao reutilizar, por favor:
- Atribua crédito apropriado, incluindo link para este repositório e para a licença.
- Indique se foram feitas alterações.
- Distribua obras derivadas sob a mesma licença (CompartilhaIgual).