Como encontrar um obstáculo?

10

Como representar a seguinte situação, o melhor agente ( @) precisa chegar ao objetivo ( $). O caminho está bloqueado por um fosso ( ~~~). Está disponível um ancinho (ou algum outro dispositivo, como botas de caminhada aquática), que permitirá atravessar o obstáculo.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

Como localizar corretamente o caminho @para, $desde que não haja um caminho imediatamente disponível? Meu caminho deveria ter não apenas custo, mas também pré-requisitos?

UPD : O problema é que o objetivo não está acessível e o rake é apenas um dos muitos objetos possíveis no mapa. A pergunta então é "como fazer o agente entender que precisa do rake?"

zzandy
fonte
Eu acho que você deve esclarecer seu caso de uso, porque isso afetaria a abordagem adotada para resolver esse problema. Por exemplo, se o caso de uso é calcular caminhos para inimigos, você provavelmente deve primeiro ver se o objetivo pode ser alcançado atualmente, se não houver inimigos recebendo o rake (ou seja, o rake É o objetivo) e, em seguida, encontrar o caminho para o primeiro objetivo novamente.
Jhocking

Respostas:

6

Estou pensando em uma pilha de objetivos, o pathfinding terá que ser anotado :

  • Comece com um objetivo get $
  • Tente encontrar caminho a caminho $- com a capacidade de caminhada na água necessária.
  • Empurre a meta get waterwalking.
  • A pilha de objetivos está agora get waterwalking, get $
  • De alguma forma, ache que o rake dá caminhadas na água, vamos renomeá-lo para barco.
  • Caminho para varrer. O objetivo principal alcançado, retira-o da pilha, o objetivo é get $.
  • Caminho para $- agora temos capacidade e podemos alcançar a meta.
zzandy
fonte
1
+1 Eu fiz algo parecido com o meu jogo e escrevi um pequeno post sobre isso um tempo atrás, em Unit Tasks e pathfinding .
MichaelHouse
@ byte66 não manipula caso especial quando há um caminho sem usar ancinho, mas, usando os resultados de rake no caminho mais curto
Ali1S232
@ Gajet, você está certo. Acho que vai precisar de uma abordagem diferente para isso.
Zzandy
1
É apenas uma questão de adicionar custo adicional. Quando encontrar água, adicione o custo de levar o item que caminha pela água ao caminho. A * pulará a caminhada na água até que se torne o caminho mais barato.
MichaelHouse
3

Todo o caminho para encontrar coisas é apenas uma busca pelo caminho mais curto em um gráfico. Para resolver seu problema, a única alteração que você precisa aplicar é adicionar algumas arestas extras (representando o caminho que o barco pode seguir) e criar um algoritmo simples de localização de caminhos. não importa se você usa BFS, Dijkstra ou A *, basta implementar um algoritmo de localização de caminho normal com algumas arestas extras. para obter mais informações sobre localização de caminhos em uma página de wiki de verificação de gráfico

Ali1S232
fonte
+1 Faça do seu rake um link unidirecional para a água, também com links unidirecionais da água para o solo.
Laurent Couvidou
Não tenho um entendimento claro de como vincular pesquisa geométrica e pesquisa de recursos. Como ir de no path from @ to $para goto rake, bring it to water, place it, goto $.
Zzandy
@zzandy ao encontrar o caminho, para cada bloco você vai para os blocos mais próximos, se possível. você só precisa adicionar uma condição de que, se o nó atual for um rake, poderá adicionar diretamente um nó do outro lado do rio para abrir a lista.
1001 Ali1S232
Mas e se você puder carregar o dispositivo? Eu pensei que era isso que ele queria dizer (e, portanto, a minha resposta.)
kaoD
Sim, quero dizer que o dispositivo pode (e deve) ser transportado. @kaoD, sua resposta não inclui a etapa em que um agente obtém a idéia de que precisa do rake.
Zzandy
2

Eu faria isso com algum tipo de solução em árvore de comportamento - você encaminha para o objetivo e anota todos os obstáculos que estão bloqueando seu A *. Se você falhar, verifique se há objetos que possam ajudar a superar esses obstáculos, nesse caso, o caminho para esse objeto. Repetir. Isso significa que o agente precisa tentar encontrar o caminho para a meta e falhar antes de ter a idéia de usar ferramentas, o que pode levar tempo, especialmente se houver um mundo enorme de peças que precisam ser verificadas. Pode não parecer muito fora do lugar que o agente leva algum tempo para pensar em como resolver o problema.

Eu posso imaginar uma solução real e hardcore, no entanto. Adicione outra dimensão ao caminho que encontra a grade. Portanto, no caso de um mapa 2D, você cria a grade de localização 3D. Neste exemplo simples, essa nova dimensão teria apenas duas profundidades, mas em um jogo real ela aumentaria rapidamente.

Em z = 0, você mapeia o terreno em circunstâncias normais, o que significa que os ladrilhos de água são considerados intransitáveis.

Em z = 1, você mapeia o terreno como está durante o rake, o que significa que os ladrilhos de água são considerados acessíveis (mas se você tiver, por exemplo, ladrilhos de parede, eles podem permanecer sólidos).

A localização do caminho é um A * comum nas dimensões x e y, o que significa que todas as células da grade são consideradas como tendo acesso aos seus vizinhos. Na dimensão z, no entanto, o A * NÃO pode se espalhar.

Exceto onde está o ancinho. O objeto rake atua como uma abertura entre z = 0 e z = 1 na grade de localização de caminho.

Isso significa que o A * inundará o preenchimento externo em z = 0, atingirá a água e ficará sem opções - então ele se espalhará para z = 1 através do ladrilho de ancinho e em z = 1 (onde a água é passável) encontre o caminho para a meta. O efeito é que o NPC sem hesitação se move para o rake e depois move o caminho mais curto para o objetivo.

Joar Jakobsson
fonte
Venho tratando o ancinho mais como "botas de caminhada aquática" no meu exemplo, significando um objeto que, se você o tiver, poderá viajar sobre ladrilhos de água. Se o ancinho precisar ser realmente "construído" como um terreno e cobrir uma quantidade limitada de ladrilhos que podem ou não ser suficientes para atravessar a água, o problema é mais difícil. Minha solução permite itens de uso único, se você fizer o movimento em z = 1 cair automaticamente automaticamente para z = 0 novamente.
Joar Jakobsson