Como sabe, hay muchas soluciones cuando busca el mejor camino en un entorno bidimensional que conduce del punto A al punto B.
Pero, ¿cómo calculo una ruta cuando un objeto está en el punto A y quiere alejarse del punto B, lo más rápido y lejos posible?
Un poco de información de fondo: mi juego utiliza un entorno 2D que no está basado en mosaicos pero tiene precisión de coma flotante. El movimiento está basado en vectores. La búsqueda de caminos se realiza al dividir el mundo del juego en rectángulos que son transitables o no transitables y construir un gráfico desde sus esquinas. Ya tengo pathfinding entre puntos trabajando usando el algoritmo Dijkstras. El caso de uso del algoritmo de huida es que, en ciertas situaciones, los actores en mi juego deberían percibir a otro actor como un peligro y huir de él.
La solución trivial sería simplemente mover al actor en un vector en la dirección opuesta a la amenaza hasta que se alcance una distancia "segura" o el actor llegue a una pared donde luego se cubra de miedo.
El problema con este enfoque es que los actores serán bloqueados por pequeños obstáculos que podrían sortear fácilmente. Mientras se mueva a lo largo de la pared no los acercaría a la amenaza, podrían hacerlo, pero se vería más inteligente cuando evitaran obstáculos en primer lugar:
Otro problema que veo es con callejones sin salida en la geometría del mapa. En algunas situaciones, un ser debe elegir entre un camino que lo aleja más rápido ahora pero termina en un callejón sin salida donde quedaría atrapado, u otro camino que significaría que al principio no se alejaría tanto del peligro (o incluso un poco más cerca), pero por otro lado tendría una recompensa a largo plazo mucho mayor, ya que eventualmente los alejaría mucho más. Por lo tanto, la recompensa a corto plazo de alejarse rápidamente debe valorarse de alguna manera frente a la recompensa a largo plazo de alejarse mucho .
También hay otro problema de calificación para situaciones en las que un actor debe aceptar acercarse a una amenaza menor para alejarse de una amenaza mucho mayor. Pero ignorar completamente todas las amenazas menores también sería una tontería (es por eso que el actor en este gráfico hace todo lo posible para evitar la amenaza menor en el área superior derecha):
¿Hay alguna solución estándar para este problema?
fuente
Respuestas:
Puede que esta no sea la mejor solución, pero funcionó para mí crear una IA fugaz para este juego .
Paso 1. Convierte el algoritmo de tu Dijkstra a A * . Esto debería ser simple simplemente agregando una heurística, que mide la distancia mínima que queda al objetivo. Esta heurística se agrega a la distancia recorrida hasta ahora al puntuar un nodo. Debería hacer este cambio de todos modos, ya que aumentará significativamente su buscador de ruta.
Paso 2. Cree una variación de la heurística, que en lugar de estimar la distancia al objetivo, mide la distancia desde el peligro y niega este valor. Esto nunca alcanzará un objetivo (ya que no hay ninguno), por lo que debe finalizar la búsqueda en algún momento, tal vez después de un número específico de iteraciones, después de alcanzar una distancia específica o cuando se manejan todas las rutas posibles. Esta solución crea efectivamente un buscador de ruta que encuentra la ruta de escape óptima con la limitación dada.
fuente
Si realmente desea que sus actores sean inteligentes al huir, simplemente la búsqueda de caminos Dijkstra / A * no será suficiente. La razón de esto es que, para encontrar la ruta de escape óptima de un enemigo, el actor también debe considerar cómo se moverá el enemigo en su búsqueda.
El siguiente diagrama de MS Paint debería ilustrar una situación particular en la que el uso de solo rutas estáticas para maximizar la distancia del enemigo conducirá a un resultado subóptimo:
Aquí, el punto verde huye del punto rojo y tiene dos opciones para tomar un camino. Bajar por el camino de la derecha le permitiría ir mucho más lejos de la posición actual del punto rojo , pero eventualmente atraparía el punto verde en un callejón sin salida. La estrategia óptima, en cambio, es que el punto verde siga corriendo alrededor del círculo, tratando de mantenerse en el lado opuesto del punto rojo.
Para encontrar correctamente tales estrategias de escape, necesitará un algoritmo de búsqueda contradictorio como minimax search o sus refinamientos como la poda alfa-beta . Tal algoritmo, aplicado al escenario anterior con una profundidad de búsqueda suficiente, deducirá correctamente que tomar el camino sin salida a la derecha inevitablemente conducirá a la captura, mientras que permanecer en el círculo no lo hará (siempre y cuando el punto verde pueda superar al rojo).
Por supuesto, si hay múltiples actores de cualquier tipo, todos ellos deberán planificar sus propias estrategias, ya sea por separado o, si los actores están cooperando, juntos. Tales estrategias de persecución / escape de múltiples actores pueden volverse sorprendentemente complejas; Por ejemplo, una posible estrategia para un actor que huye es tratar de distraer al enemigo llevándolo hacia un objetivo más tentador. Por supuesto, esto afectará la estrategia óptima del otro objetivo, y así sucesivamente ...
En la práctica, probablemente no podrá realizar búsquedas muy profundas en tiempo real con muchos agentes, por lo que tendrá que confiar mucho en la heurística. La elección de estas heurísticas determinará la "psicología" de sus actores: qué tan inteligentes actúan, cuánta atención prestan a las diferentes estrategias, cuán cooperativos o independientes son, etc.
fuente
Tienes la búsqueda de caminos, por lo que puedes reducir el problema a elegir un buen destino.
Si hay destinos absolutamente seguros en el mapa (por ejemplo, salidas por las que la amenaza no puede seguir a su actor), elija uno o más cercanos y descubra cuál tiene el costo de ruta más bajo.
Si su actor que huye tiene amigos bien armados, o si el mapa incluye peligros a los que el actor es inmune pero la amenaza no lo es, elija un lugar abierto cerca de ese amigo o peligro y encuentre ese camino.
Si su actor que huye es más rápido que otro actor en el que la amenaza también podría estar interesada, elija un punto en la dirección de ese otro actor, pero más allá, y encuentre ese punto: "No tengo que escapar del oso , Solo tengo que huir de ti ".
Sin la posibilidad de escapar, o matar o distraer la amenaza, su actor está condenado, ¿verdad? Así que elige un punto arbitrario para correr, y si llegas allí, y la amenaza aún te sigue, qué demonios: da la vuelta y lucha.
fuente
Dado que especificar una posición de destino adecuada podría ser complicado en muchas situaciones, vale la pena considerar el siguiente enfoque basado en mapas de cuadrícula de ocupación 2D. Se le conoce comúnmente como "iteración de valor" y, combinado con el gradiente de descenso / ascenso, proporciona un algoritmo de planificación de ruta simple y bastante eficiente (según la implementación). Debido a su simplicidad, es bien conocido en robótica móvil, en particular para "robots simples" que navegan en ambientes interiores. Como se indicó anteriormente, este enfoque proporciona un medio para encontrar un camino lejos de una posición de inicio sin especificar explícitamente una posición de destino de la siguiente manera. Tenga en cuenta que una posición de destino se puede especificar opcionalmente, si está disponible. Además, el enfoque / algoritmo constituye una búsqueda de amplitud,
En el caso binario, el mapa de cuadrícula de ocupación 2D es uno para celdas de cuadrícula ocupadas y cero en cualquier otro lugar. Tenga en cuenta que este valor de ocupación también puede ser continuo en el rango [0,1], volveré a eso a continuación. El valor de una celda de cuadrícula dada g i es V (g i ) .
La versión básica
Notas sobre el paso 4.
Extensiones y comentarios adicionales
La ecuación de actualización V (g j ) = V (g i ) +1 deja mucho espacio para aplicar todo tipo de heurísticas adicionales ya sea reduciendo V (g j )o el componente aditivo para reducir el valor de ciertas opciones de ruta. La mayoría de las modificaciones, si no todas, pueden incorporarse de manera agradable y genérica utilizando un mapa de cuadrícula con valores continuos de [0,1], que constituye efectivamente un paso de preprocesamiento del mapa de cuadrícula binario inicial. Por ejemplo, agregar una transición de 1 a 0 a lo largo de los límites de los obstáculos hace que el "actor" se mantenga preferiblemente libre de obstáculos. Tal mapa de cuadrícula puede, por ejemplo, generarse a partir de la versión binaria mediante desenfoque, dilatación ponderada o similar. Agregar las amenazas y los enemigos como obstáculos con un gran radio borroso, penaliza los caminos que se acercan a estos. También se puede usar un proceso de difusión en el mapa de cuadrícula general como este:
V (g j ) = (1 / (N + 1)) × [V (g j ) + suma (V (g i ))]
donde " suma " se refiere a la suma de todas las celdas vecinas. Por ejemplo, en lugar de crear un mapa binario, los valores iniciales (enteros) podrían ser proporcionales a la magnitud de las amenazas y los obstáculos presentan amenazas "pequeñas". Después de aplicar el proceso de difusión, los valores de la cuadrícula deben / deben escalarse a [0,1], y las celdas ocupadas por obstáculos, amenazas y enemigos deben establecerse / forzarse a 1. De lo contrario, la escala en la ecuación de actualización puede No funciona como se desea.
Hay muchas variaciones en este esquema / enfoque general. Los obstáculos, etc., pueden tener valores pequeños, mientras que las celdas de la cuadrícula libre tienen valores grandes, lo que puede requerir un descenso de gradiente en el último paso según el objetivo. En cualquier caso, el enfoque es, en mi humilde opinión, sorprendentemente versátil, bastante fácil de implementar y potencialmente bastante rápido (sujeto al tamaño / resolución del mapa de cuadrícula). Finalmente, como con muchos algoritmos de planificación de rutas que no asumen una posición de destino específica, existe el riesgo obvio de quedar atrapado en callejones sin salida. Hasta cierto punto, podría ser posible aplicar pasos dedicados de postprocesamiento antes del último paso para reducir este riesgo.
Aquí hay otra breve descripción con una ilustración en Java-Script (?), Aunque la ilustración no funcionó con mi navegador :(
http://www.cs.ubc.ca/~poole/demos/mdp/vi.html
Se pueden encontrar muchos más detalles sobre la planificación en el siguiente libro. La iteración del valor se trata específicamente en el Capítulo 2, Sección 2.3.1 Planes óptimos de longitud fija.
http://planning.cs.uiuc.edu/
Espero que ayude, saludos cordiales, Derik.
fuente
¿Qué tal centrarse en los depredadores? Vamos a emitir rayos 360 grados en la posición del Depredador, con la densidad adecuada. Y podemos tener muestras de refugio. Y elige el mejor refugio.
fuente
Un enfoque que tienen en Star Trek Online para rebaños de animales es elegir una dirección abierta y dirigirse a eso, rápidamente, desovando a los animales después de una cierta distancia. Pero eso es principalmente una animación glorificada de desove para rebaños que se supone que debes asustar para no atacarte, y que no son adecuados para las turbas de combate reales.
fuente