Muitos algoritmos de busca de caminhos foram desenvolvidos nos últimos anos, que podem calcular o melhor caminho em resposta a alterações de gráficos muito mais rapidamente que A * - o que são e como diferem? Eles são para situações diferentes, ou alguns outros obsoletos?
Estes são os que consegui encontrar até agora:
- D * (1994)
- Focado D * (1995)
- DynamicSWSF-FP (1996)
- LPA (1997)
- LPA * / Incremental A * (2001)
- D * Lite (2002)
- SetA * (2002)
- HPA * (2004)
- A qualquer momento D * (2005)
- PRA * (2005)
- Campo D * (2007)
- Teta * (2007)
- HAA * (2008)
- GAA * (2008)
- LEARCH (2009)
- BDDD * (2009 - Não consigo acessar este documento: |)
- Phi Incremental * (2009)
- GFRA * (2010)
- MTD * -Lite (2010)
- Árvore-AA * (2011)
Não tenho certeza de quais delas se aplicam ao meu problema específico - vou ler todas, se necessário, mas pouparia muito tempo se alguém pudesse escrever um resumo.
Meu problema específico: eu tenho uma grade com um começo, um acabamento e algumas paredes. Atualmente, estou usando A * para encontrar o melhor caminho do início ao fim.
O usuário moverá uma parede e eu tenho que recalcular todo o caminho novamente. A etapa "move-wall / recalculate-path" acontece várias vezes seguidas, por isso estou procurando um algoritmo capaz de recalcular rapidamente o melhor caminho sem precisar executar uma iteração completa de A *.
No entanto, não estou necessariamente procurando uma alteração em A * - poderia ser um algoritmo completamente separado.
fonte
Respostas:
Então, eu olhei os papéis, e é isso que eu brilhava. Se houver alguém mais qualificado no assunto, corrija-me se eu estiver errado (ou adicione sua própria resposta, e eu a aceitarei!) .
Os links para cada artigo podem ser encontrados no post de perguntas acima.
Diante de tudo isso, parece que o LPA * é o mais adequado para o meu problema.
fonte
Há uma grande ressalva ao usar D *, D * -Lite ou qualquer um dos algoritmos incrementais nesta categoria (e vale a pena notar que essa ressalva é raramente mencionada na literatura). Esses tipos de algoritmos usam uma pesquisa invertida. Ou seja, eles calculam os custos para fora do nó da meta, como uma ondulação se espalhando para fora. Quando os custos das arestas mudam (por exemplo, você adiciona ou remove uma parede no seu exemplo), todos eles têm várias estratégias eficientes para atualizar apenas o subconjunto dos nós explorados (também conhecidos como 'visitados') que são afetados pelas alterações.
A grande ressalva é que a localização dessas mudanças em relação à localização da meta faz uma enorme diferença para a eficiência dos algoritmos. Eu mostrei em vários artigos e minha tese que é perfeitamente possível que o pior desempenho de qualquer um desses algoritmos incrementais seja pior do que jogar fora todas as informações e começar de novo com algo não incremental, como o simples A * antigo.
Quando as informações de custo alteradas estão próximas do perímetro da frente de pesquisa em expansão (a região 'visitada'), poucos caminhos precisam ser alterados e as atualizações incrementais são rápidas. Um exemplo pertinente é um robô móvel com sensores conectados ao seu corpo. Os sensores apenas veem o mundo perto do robô e, portanto, as mudanças ocorrem nesta região. Essa região é o ponto de partida da pesquisa, não o objetivo, portanto tudo funciona bem e os algoritmos são muito eficientes na atualização do caminho ideal para corrigir as alterações.
Quando as informações de custo alteradas estão próximas do objetivo da pesquisa (ou o seu cenário vê os locais de alteração do objetivo, não apenas o início), esses algoritmos sofrem uma desaceleração catastrófica. Nesse cenário, quase todas as informações salvas precisam ser atualizadas, porque a região alterada está tão próxima da meta que quase todos os caminhos pré-calculados passam pelas alterações e devem ser reavaliados. Devido à sobrecarga de armazenar informações e cálculos extras para fazer atualizações incrementais, uma reavaliação nessa escala é mais lenta que um novo começo.
Como o cenário de exemplo parece permitir ao usuário mover qualquer barreira que desejar, você sofrerá esse problema se usar D *, D * -Lite, LPA * etc. O desempenho do tempo do seu algoritmo será variável, dependendo do usuário entrada. Em geral, "isso é uma coisa ruim" ...
Como exemplo, o grupo de Alonzo Kelly na CMU tinha um programa fantástico chamado PerceptOR, que tentava combinar robôs terrestres com robôs aéreos, todos compartilhando informações de percepção em tempo real. Quando tentaram usar um helicóptero para fornecer atualizações de custos em tempo real ao sistema de planejamento de um veículo terrestre, eles enfrentaram esse problema porque o helicóptero podia voar à frente do veículo terrestre, vendo mudanças de custo mais próximas da meta e, assim, diminuindo a velocidade abaixo seus algoritmos. Eles discutiram essa observação interessante? Não. No final, o melhor que conseguiram foi fazer o helicóptero voar diretamente acima do veículo terrestre - tornando-o o mastro de sensor mais caro do mundo. Claro, estou sendo mesquinho. Mas é um grande problema que ninguém quer falar - e deveria,
Existem apenas alguns documentos que discutem isso, principalmente por mim. Dos artigos escritos pelos autores ou estudantes dos autores dos artigos originais listados nesta pergunta, posso pensar em apenas um que realmente mencione esse problema. Likhachev e Ferguson sugerem tentar estimar a escala de atualizações necessárias e liberar as informações armazenadas se estima-se que a atualização incremental leve mais tempo do que um novo começo. Esta é uma solução bastante sensata, mas também existem outras. Meu doutorado generaliza uma abordagem semelhante em uma ampla gama de problemas computacionais e está indo além do escopo desta pergunta. No entanto, você pode achar úteis as referências, pois ele tem uma visão geral completa da maioria desses algoritmos e muito mais. Veja http://db.acfr.usyd.edu.au/download.php/Allen2011_Thesis.pdf?id=2364 para detalhes.
fonte
A idéia principal é usar um algoritmo incremental, capaz de tirar proveito dos cálculos anteriores quando a rota calculada inicial for bloqueada. Isso é frequentemente investigado no contexto de robôs, navegação e planejamento.
Koenig & Likkachev, replanejamento rápido para navegação em terrenos desconhecidos, IEEE Transactions on Robotics, vol. 21, nº 3, junho de 2005 apresenta o D * Lite. Parece seguro dizer que D * está desatualizado no sentido de que D * Lite é sempre tão rápido quanto D *. Além disso, o D * é complexo, difícil de entender, analisar e estender. A Figura 9 fornece o pseudocódigo para D * Lite, e a Tabela 1 mostra resultados experimentais com D * Lite em comparação com BFS, Backward A *, Forward A *, DynamicSWSF-P e D *.
Não conheço os algoritmos mais recentes que você listou (A qualquer momento D *, Campo D *, LEARCH). Muito recentemente, vi um robô que usava o D * Lite para planejar em um ambiente com caminhantes aleatórios. Nesse sentido, não acho que o D * Lite esteja desatualizado. Para o seu problema prático, acho que não há mal em tentar a maneira usual de engenharia: adote alguma abordagem e, se ela não atender às suas necessidades, tente outra coisa (mais complexa).
fonte
Gostaria de acrescentar algo sobre árvores aleatórias de exploração rápida, ou RRTs. A idéia básica tem boa discussão em toda a Internet, mas provavelmente é seguro começar com os links da página da Wikipedia e com os documentos originais de Kuffner e LaValle sobre o assunto.
A característica mais importante dos RRTs é que eles podem lidar com espaços com valor real de dimensão extremamente alta sem asfixia. Eles podem lidar com a dinâmica, não são ideais, mas são probabilisticamente completos (garantido que terão sucesso, se possível, à medida que o tempo de computação chegar ao infinito) e são capazes de lidar com alvos em movimento. Existem algumas extensões que permitem trabalhar em espaços não estáticos, o melhor dos quais parece ser o trabalho multipartido de RRT que eu vinculei abaixo.
fonte
As estruturas de dados chamadas oráculos a distância lidam com esses problemas. No entanto, a maioria dos resultados de pesquisa é apenas para gráficos estáticos .
Se os gráficos são grades (e, portanto, planares), existem algumas estruturas de dados dinâmicas (não está claro se as constantes são pequenas o suficiente para o aplicativo em questão):
Caminhos mais curtos exatos:
Jittat Fakcharoenphol, Satish Rao: Gráficos planares, arestas de peso negativo, caminhos mais curtos e tempo quase linear. J. Comput. Syst. Sci. 72 (5): 868-889 (2006)
Caminhos mais curtos aproximados:
Philip N. Klein, Sairam Subramanian: Um esquema de aproximação totalmente dinâmico para caminhos mais curtos em gráficos planares. Algoritmica 22 (3): 235-249 (1998)
Ittai Abraham, Shiri Chechik, Cyril Gavoille: Oráculos de distância aproximada totalmente dinâmicos para gráficos planares por meio de etiquetas de distância proibidas. STOC 2012: 1199-1218
fonte
Na escola, me envolvi com a otimização de colônias de formigas . Em alguns textos, foi apresentada como uma solução para a mudança contínua de gráficos, redes de roteamento, etc. Não é uma solução projetada, mas uma adaptação de como as formigas navegam em torno de obstáculos, espalhando feromônios para marcar bons e maus caminhos. Não tenho idéia se funciona para o seu problema, mas acho que é um ponto de vista interessante.
fonte