Pathfinding para fugir


61

Como você sabe, existem muitas soluções quando você procura o melhor caminho em um ambiente bidimensional que leva do ponto A ao ponto B.

Mas como eu calculo um caminho quando um objeto está no ponto A e quer fugir do ponto B, o mais rápido e longe possível?

Um pouco de informações básicas: Meu jogo usa um ambiente 2D que não é baseado em blocos, mas tem precisão de ponto flutuante. O movimento é baseado em vetor. A busca de caminhos é feita dividindo o mundo do jogo em retângulos que podem ser percorridos ou não, e construindo um gráfico a partir de seus cantos. Eu já tenho pathfinding entre pontos trabalhando usando o algoritmo Dijkstras. O caso de uso do algoritmo de fuga é que, em certas situações, os atores do meu jogo devem perceber outro ator como um perigo e fugir dele.

A solução trivial seria apenas mover o ator em um vetor na direção oposta à ameaça, até que uma distância "segura" fosse alcançada ou o ator chegasse a uma parede onde, em seguida, cobre com medo.

O problema dessa abordagem é que os atores serão bloqueados por pequenos obstáculos que poderiam facilmente contornar. Contanto que mover-se ao longo da parede não os aproximasse da ameaça que eles poderiam fazer, mas pareceria mais inteligente quando eles evitassem obstáculos em primeiro lugar:

insira a descrição da imagem aqui

Outro problema que vejo é com becos sem saída na geometria do mapa. Em algumas situações, um ser deve escolher entre um caminho que o afaste mais rapidamente agora, mas que termina em um beco sem saída onde seria preso, ou outro caminho que significaria que ele não se afastaria tanto do perigo a princípio (ou ainda mais perto), mas, por outro lado, teria uma recompensa a longo prazo muito maior, pois acabaria por afastá-los. Então, a recompensa de curto prazo de fugir rápido deve ser de algum modo valorizado contra a recompensa a longo prazo de se afastar muito .

insira a descrição da imagem aqui

Há também outro problema de classificação para situações em que um ator deve aceitar se aproximar de uma ameaça menor para se afastar de uma ameaça muito maior. Mas ignorar completamente todas as ameaças menores também seria tolo (é por isso que o ator neste gráfico se esforça para evitar a ameaça menor na área superior direita):

insira a descrição da imagem aqui

Existem soluções padrão para esse problema?


8
+1 Ótima pergunta com ótimos recursos visuais. Isso realmente esclarece a questão.
MichaelHouse

Respostas:


24

Esta pode não ser a melhor solução, mas funcionou para mim criar uma IA em fuga para este jogo .

Etapa 1. Converta o algoritmo do seu Dijkstra em A * . Isso deve ser simples, basta adicionar uma heurística, que mede a distância mínima restante para o alvo. Essa heurística é adicionada à distância percorrida até o momento na pontuação de um nó. Você deve fazer essa alteração de qualquer maneira, pois isso aumentará significativamente o localizador de caminho.

Etapa 2. Crie uma variação da heurística que, em vez de estimar a distância para o alvo, mede a distância do (s) perigo (s) e nega esse valor. Isso nunca alcançará um alvo (como não há nenhum); portanto, é necessário encerrar a pesquisa em algum momento, talvez após um número específico de iterações, após uma distância específica ser alcançada ou quando todas as rotas possíveis forem tratadas. Essa solução cria efetivamente um localizador de caminhos que encontra a rota de fuga ideal com a limitação fornecida.


11
Observe que o uso de algo como uma distância em linha reta do perigo como a heurística na etapa 2 geralmente não dará uma heurística admissível. Obviamente, isso não significa que você não possa tentar usá-lo de qualquer maneira, mas pode não gerar caminhos de fuga ideais. Para obter uma heurística realmente admissível para esse "A * reverso", acho que você precisará usar A * / Dijkstra normal para calcular a distância real de cada quadrado do perigo.
Ilmari Karonen

+1 Acho que isso dá o melhor retorno possível em termos de esforço para obter resultados.
MichaelHouse

33

Se você realmente quer que seus atores sejam espertos em fugir, simplesmente encontrar o caminho Dijkstra / A * não é suficiente. A razão para isso é que, para encontrar o caminho ideal de fuga de um inimigo, o ator também precisa considerar como o inimigo se moverá em busca.

O diagrama do MS Paint a seguir deve ilustrar uma situação específica em que o uso apenas de pathfinding estático para maximizar a distância do inimigo levará a um resultado abaixo do ideal:

Diagrama de um ator que foge de um inimigo em um labirinto em forma de P

Aqui, o ponto verde está fugindo do ponto vermelho e tem duas opções para seguir um caminho. Seguir o caminho da direita permitiria que ele ficasse muito mais longe da posição atual do ponto vermelho , mas acabaria prendendo o ponto verde em um beco sem saída. A melhor estratégia, em vez disso, é que o ponto verde continue correndo ao redor do círculo, tentando ficar do lado oposto ao ponto vermelho.

Para encontrar corretamente essas estratégias de escape, você precisará de um algoritmo de pesquisa antagônico, como a pesquisa minimax, ou seus refinamentos, como a poda alfa-beta . Esse algoritmo, aplicado ao cenário acima com uma profundidade de pesquisa suficiente, deduzirá corretamente que seguir o caminho sem saída à direita levará inevitavelmente à captura, enquanto permanecer no círculo não o fará (desde que o ponto verde possa ultrapassar o vermelho).

Obviamente, se houver vários atores de qualquer tipo, todos precisarão planejar suas próprias estratégias - separadamente ou, se os atores estiverem cooperando, juntos. Tais estratégias de perseguição / fuga de múltiplos atores podem se tornar surpreendentemente complexas; por exemplo, uma estratégia possível para um ator em fuga é tentar distrair o inimigo, levando-o a um alvo mais tentador. Obviamente, isso afetará a estratégia ideal do outro alvo, e assim por diante ...

Na prática, você provavelmente não será capaz de realizar pesquisas muito profundas em tempo real com muitos agentes, portanto, terá que confiar muito na heurística. A escolha dessas heurísticas determinará a "psicologia" de seus atores - quão inteligentes eles agem, quanta atenção prestam a diferentes estratégias, quão cooperativos ou independentes são etc.


7

Você tem o pathfinding, para reduzir o problema a escolher um bom destino.

Se houver destinos absolutamente seguros no mapa (por exemplo, saídas em que a ameaça não pode seguir o seu ator), escolha um ou mais locais próximos e descubra qual deles tem o menor custo de caminho.

Se o seu ator em fuga tiver amigos bem armados, ou se o mapa incluir perigos aos quais o ator está imune, mas a ameaça não é, escolha um local aberto perto de um amigo ou perigo e encontre o caminho.

Se o seu ator em fuga for mais rápido do que algum outro ator em que a ameaça também possa estar interessada, escolha um ponto na direção desse outro ator, mas além dele, e encontre o caminho para esse ponto: "Não preciso fugir do urso , Eu só tenho que superar você. "

Sem a possibilidade de escapar, matar ou distrair a ameaça, seu ator está condenado, certo? Portanto, escolha um ponto arbitrário para o qual correr, e se você chegar lá, e a ameaça ainda estiver seguindo você, que diabos: vire-se e lute.


7

Como especificar uma posição-alvo apropriada pode ser complicado em muitas situações, vale a pena considerar a abordagem a seguir, com base em mapas de grade de ocupação 2D. É geralmente chamado de "iteração de valor" e, combinado com a descida / ascensão do gradiente, fornece um algoritmo de planejamento de caminho simples e bastante eficiente (dependendo da implementação). Devido à sua simplicidade, é bem conhecido na robótica móvel, principalmente nos "robôs simples" que navegam em ambientes internos. Conforme implícito acima, essa abordagem fornece um meio de encontrar um caminho para longe de uma posição inicial sem especificar explicitamente uma posição-alvo da seguinte maneira. Observe que uma posição de destino pode opcionalmente ser especificada, se disponível. Além disso, a abordagem / algoritmo constitui uma busca pela primeira vez,

No caso binário, o mapa de grade de ocupação 2D é um para células de grade ocupadas e zero em outro lugar. Observe que esse valor de ocupação também pode ser contínuo no intervalo [0,1]. Voltarei a isso abaixo. O valor de uma determinada célula da grade g i é V (g i ) .

A versão básica

  1. Supondo que a célula da grade g 0 contenha a posição inicial. Defina V (g 0 ) = 0 e coloque g 0 em uma fila FIFO.
  2. Tomar a próxima célula da grelha g i a partir da fila.
  3. Para todos os vizinhos g j de g i :
    • Se g j não estiver ocupado e não tiver sido visitado anteriormente:
      • V (g j ) = V (g i ) +1
      • Marque g j como visitado.
      • Adicione g j à fila FIFO.
  4. Se um determinado limite de distância ainda não for atingido, continue com (2.), caso contrário, continue com (5.).
  5. O caminho é obtido seguindo a subida mais gradiente a partir de g 0 .

Notas na etapa 4.

  • Conforme indicado acima, a etapa (4.) exige que se mantenha o controle da distância máxima percorrida, que foi omitida na descrição acima por razões de clareza / concisão.
  • Se uma posição de destino é dada, a iteração é interrompida assim que a posição de destino é alcançada, ou seja, processada / visitada como parte da etapa (3.).
  • É claro que também é possível simplesmente processar o mapa de grade inteiro, ou seja, continuar até que todas as células de grade (gratuitas) tenham sido processadas / visitadas. O fator limitante é obviamente o tamanho do mapa de grade em conjunto com sua resolução.

Extensões e outros comentários

A atualização-equação V (g j ) = V (g i ) +1 deixa muito espaço para aplicar todos os tipos de heurísticas adicionais, reduzindo a escala V (g j )ou o componente aditivo para reduzir o valor de certas opções de caminho. A maioria, se não todas, essas modificações podem ser bem e genericamente incorporadas usando um mapa de grade com valores contínuos de [0,1], que efetivamente constitui uma etapa de pré-processamento do mapa de grade binário inicial. Por exemplo, adicionar uma transição de 1 a 0 ao longo dos limites dos obstáculos faz com que o "ator" fique de preferência limpo de obstáculos. Esse mapa de grade pode, por exemplo, ser gerado a partir da versão binária por desfoque, dilatação ponderada ou similar. Adicionar as ameaças e os inimigos como obstáculos com grande raio de desfoque, penaliza os caminhos que se aproximam deles. Pode-se também usar um processo de difusão no mapa geral como este:

V (g j ) = (1 / (N + 1)) × [V (g j ) + soma (V (g i ))]

onde " soma " se refere à soma de todas as células de grade vizinhas. Por exemplo, em vez de criar um mapa binário, os valores iniciais (inteiros) podem ser proporcionais à magnitude das ameaças, e os obstáculos apresentam ameaças "pequenas". Após a aplicação do processo de difusão, os valores da grade devem / devem ser redimensionados para [0,1] e as células ocupadas por obstáculos, ameaças e inimigos devem ser definidas / forçadas a 1. Caso contrário, o redimensionamento na atualização-equação pode não funciona como desejado.

Existem muitas variações nesse esquema / abordagem geral. Obstáculos etc. podem ter valores pequenos, enquanto células de grade livres têm valores grandes, o que pode exigir uma descida gradual na última etapa, dependendo do objetivo. Em qualquer caso, a abordagem é, IMHO, surpreendentemente versátil, bastante fácil de implementar e potencialmente bastante rápida (sujeita ao tamanho / resolução do mapa da grade). Finalmente, como em muitos algoritmos de planejamento de caminho que não assumem uma posição-alvo específica, existe o risco óbvio de ficar preso em becos sem saída. Até certo ponto, pode ser possível aplicar etapas dedicadas de pós-processamento antes da última etapa para reduzir esse risco.

Aqui está outra breve descrição com uma ilustração em Java-Script (?), Embora a ilustração não funcione com o meu navegador :(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

Muito mais detalhes sobre o planejamento podem ser encontrados no livro a seguir. A iteração de valor é discutida especificamente no Capítulo 2, Seção 2.3.1.

http://planning.cs.uiuc.edu/

Espero que ajude, Atenciosamente, Derik.


3

Que tal se concentrar em predadores? Vamos apenas transmitir 360 graus na posição do Predator, com densidade apropriada. E podemos ter amostras de refúgio. E escolha o melhor refúgio.

caso 1

caso 2


0

Uma abordagem que eles adotam no Star Trek Online para manadas de animais é escolher uma direção aberta e seguir em frente, rapidamente, desovando os animais após uma certa distância. Mas isso é principalmente uma animação de desova glorificada para os rebanhos que você deve assustar e não o atacar, e não é adequado para mobs de combate reais.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.