Pathfinding pour fuir


61

Comme vous le savez, il existe de nombreuses solutions lorsque vous cherchez le meilleur chemin dans un environnement bidimensionnel qui mène du point A au point B.

Mais comment calculer un chemin lorsqu'un objet se trouve au point A et veut s'éloigner du point B le plus rapidement et le plus loin possible?

Quelques informations de base: Mon jeu utilise un environnement 2D qui n’est pas basé sur des tuiles mais qui possède une précision en virgule flottante. Le mouvement est basé sur un vecteur. Le repérage se fait en divisant le monde du jeu en rectangles qui peuvent ou non marcher et en créant un graphique à partir de leurs coins. J'ai déjà un cheminement entre les points en utilisant l'algorithme de Dijkstras. Le cas d'utilisation de l'algorithme de fuite est que, dans certaines situations, les acteurs de mon jeu devraient percevoir un autre acteur comme un danger et s'enfuir.

La solution triviale serait de déplacer l'acteur dans un vecteur dans la direction opposée à la menace jusqu'à atteindre une distance "sûre" ou jusqu'à ce que l'acteur atteigne un mur où il se couvrira ensuite de peur.

Le problème avec cette approche est que les acteurs seront bloqués par de petits obstacles qu'ils pourraient facilement contourner. Tant que se déplacer le long du mur ne les rapprocherait pas de la menace, ils pourraient le faire, mais ce serait plus intelligent s'ils évitaient les obstacles au départ:

entrez la description de l'image ici

Un autre problème que je vois concerne les impasses dans la géométrie de la carte. Dans certaines situations, un être doit choisir entre un chemin qui l'éloigne plus rapidement maintenant mais se termine dans une impasse où il serait piégé, ou un autre chemin qui signifierait qu'il ne s'éloignerait pas si loin du danger au début (ou même un peu plus près) mais aurait par contre une récompense beaucoup plus grande à long terme en ce sens que cela les éloignerait beaucoup plus loin. Donc, la récompense à court terme de partir vite doit être évaluée d'une manière ou d'une autre par rapport à la récompense à long terme de partir loin .

entrez la description de l'image ici

Il existe également un autre problème d’évaluation des situations dans lesquelles un acteur doit accepter de s’approcher d’une menace mineure pour s’éloigner d’une menace beaucoup plus vaste. Mais ignorer complètement toutes les menaces mineures serait également stupide (c'est pourquoi l'acteur dans ce graphique fait tout son possible pour éviter la menace mineure dans la zone supérieure droite):

entrez la description de l'image ici

Existe-t-il des solutions standard à ce problème?


8
+1 Grande question avec de superbes graphismes. Cela clarifie vraiment la question.
MichaelHouse

Réponses:


24

Ce n'est peut-être pas la meilleure solution, mais cela a fonctionné pour moi de créer une IA en fuite pour ce match .

Étape 1. Convertissez l'algorithme de Dijkstra en A * . Cela devrait être simple en ajoutant simplement une heuristique, qui mesure la distance minimale laissée à la cible. Cette heuristique s’ajoute à la distance parcourue jusqu’à présent lors de la notation d’un nœud. Quoi qu'il en soit, vous devriez faire ce changement, car cela stimulera considérablement votre indicateur de trajectoire.

Étape 2. Créez une variante de l'heuristique qui, au lieu d'estimer la distance à la cible, mesure la distance par rapport au (x) danger (s) et annule cette valeur. Cela n'atteindra jamais une cible (car il n'y en a pas), vous devez donc mettre fin à la recherche à un moment donné, peut-être après un nombre spécifique d'itérations, après qu'une distance spécifique est atteinte ou lorsque tous les itinéraires possibles sont gérés. Cette solution crée efficacement un détecteur de chemin qui trouve la meilleure voie d'échappement avec la limitation donnée.


1
Notez que le fait d'utiliser quelque chose comme la distance en ligne droite du danger comme heuristique à l'étape 2 ne donnera généralement pas une heuristique admissible. Bien sûr, cela ne signifie pas que vous ne pouvez pas essayer de l’utiliser de toute façon, mais cela pourrait ne pas générer des chemins d’échappement optimaux. Pour obtenir une heuristique réelle admissible pour cet "inversement A *", je pense que vous devez utiliser un A * / Dijkstra normal pour calculer la distance réelle de chaque carré par rapport au danger.
Ilmari Karonen

+1 Je pense que cela vous en donne pour votre argent en ce qui concerne les résultats.
MichaelHouse

33

Si vous voulez vraiment que vos acteurs fassent preuve de discernement, tout simplement Dijkstra / A * pathfinding ne vous coupera rien. La raison en est que, pour trouver le meilleur moyen de s'échapper d'un ennemi, l'acteur doit également prendre en compte la manière dont l'ennemi se déplacera à sa poursuite.

Le diagramme MS Paint suivant devrait illustrer une situation particulière dans laquelle l’utilisation exclusive de la reconnaissance de trajectoire statique pour maximiser la distance par rapport à l’ennemi conduirait à un résultat non optimal:

Schéma d'un acteur fuyant un ennemi dans un labyrinthe en forme de P

Ici, le point vert fuit le point rouge et a deux choix de chemin à suivre. Descendre dans la voie de droite lui permettrait de s’éloigner beaucoup plus de la position actuelle du point rouge , mais finira par piéger le point vert dans une impasse. Au lieu de cela, la stratégie optimale consiste à faire en sorte que le point vert continue de tourner autour du cercle, en essayant de rester à l’opposé du point rouge.

Pour trouver correctement de telles stratégies d'échappement, vous aurez besoin d'un algorithme de recherche contradictoire tel que la recherche minimax ou ses raffinements tels que l' élagage alpha-bêta . Un tel algorithme, appliqué au scénario ci-dessus avec une profondeur de recherche suffisante, déduira correctement que le fait de prendre l'impasse à droite entraînera inévitablement la capture, alors que rester sur le cercle ne le fera pas (tant que le point vert peut dépasser le un rouge).

Bien sûr, s’il existe de nombreux acteurs de l’un ou l’autre type, ils devront tous planifier leurs propres stratégies - soit séparément, soit ensemble, si les acteurs coopèrent. De telles stratégies de poursuite / d’évasion multi-acteurs peuvent devenir étonnamment complexes; Par exemple, une stratégie possible pour un acteur en fuite consiste à essayer de distraire l'ennemi en le dirigeant vers une cible plus tentante. Bien sûr, cela affectera la stratégie optimale de l'autre cible, et ainsi de suite ...

Dans la pratique, vous ne pourrez probablement pas effectuer de recherches très approfondies en temps réel avec de nombreux agents. Vous devrez donc beaucoup vous appuyer sur des méthodes heuristiques. Le choix de ces heuristiques déterminera ensuite la "psychologie" de vos acteurs - leur intelligence, leur degré d'attention portée aux différentes stratégies, leur degré de coopération ou d'indépendance, etc.


7

Vous avez le cheminement, vous pouvez donc réduire le problème à choisir une bonne destination.

S'il existe des destinations absolument sûres sur la carte (par exemple, des sorties que la menace ne peut pas suivre votre acteur), choisissez une ou plusieurs destinations proches et déterminez celle qui présente le coût de trajectoire le plus bas.

Si votre acteur en fuite a des amis bien armés, ou si la carte comprend des dangers auxquels l'acteur est immunisé mais que la menace ne blesse pas, choisissez un emplacement dégagé à proximité d'un tel ami ou un danger et une piste pour y parvenir.

Si votre acteur en fuite est plus rapide qu'un autre acteur auquel la menace pourrait également intéresser, choisissez un point dans la direction de cet autre acteur, mais au-delà, et dirigez-vous vers ce point: "Je n'ai pas à distancer l'ours. , Je n'ai qu'à te dépasser. "

Sans la possibilité de vous échapper, de tuer ou de distraire la menace, votre acteur est condamné, n'est-ce pas? Alors choisissez un point arbitraire pour courir, et si vous y arrivez, et que la menace vous suit toujours, que diable allez-vous: tournez-vous et combattez.


7

Étant donné que la spécification d'une position cible appropriée peut s'avérer délicate dans de nombreuses situations, l'approche suivante basée sur des cartes quadrillées d'occupation 2D peut être utile. Il est communément appelé "itération de valeur" et associé à un algorithme de planification de trajectoire simple et assez efficace (en fonction de la mise en oeuvre). En raison de sa simplicité, il est bien connu dans la robotique mobile, en particulier pour les "robots simples" naviguant dans des environnements intérieurs. Comme suggéré ci-dessus, cette approche fournit un moyen de trouver un chemin s'éloignant d'une position de départ sans spécifier explicitement une position cible comme suit. Notez qu'une position cible peut éventuellement être spécifiée, si disponible. En outre, l’approche / l’algorithme constitue une recherche en profondeur,

Dans le cas binaire, la grille d'occupation 2D est une carte pour les cellules de grille occupées et zéro ailleurs. Notez que cette valeur d'occupation peut aussi être continue dans la plage [0,1], je reviendrai sur celle ci-dessous. La valeur d'une cellule de grille donnée, g i, est V (g i ) .

La version de base

  1. En supposant que la cellule de grille g 0 contienne la position de départ. Définissez V (g 0 ) = 0 et mettez g 0 dans une file d'attente FIFO.
  2. Prenez la cellule de grille suivante, g i, de la file d'attente.
  3. Pour tous les voisins g j de g i :
    • Si g j n'est pas occupé et n'a pas été visité précédemment:
      • V (g j ) = V (g i ) +1
      • Mark g j comme visité.
      • Ajoutez g j à la file d'attente FIFO.
  4. Si un seuil de distance donné n’est pas encore atteint, continuez avec (2.), sinon continuez avec (5.).
  5. Le chemin est obtenu en suivant la pente la plus raide à partir de g 0 .

Notes sur l'étape 4.

  • Comme indiqué ci-dessus, l'étape (4.) nécessite de garder une trace de la distance maximale parcourue, ce qui a été omis dans la description ci-dessus pour des raisons de clarté / concision.
  • Si une position cible est donnée, l'itération est arrêtée dès que la position cible est atteinte, c'est-à-dire traitée / visitée dans le cadre de l'étape (3.).
  • Bien entendu, il est également possible de traiter simplement l’ensemble de la grille, c’est-à-dire de continuer jusqu’à ce que toutes les cellules (gratuites) de la grille aient été traitées / visitées. Le facteur limitant est évidemment la taille de la carte quadrillée associée à sa résolution.

Extensions et autres commentaires

L'équation de mise à jour V (g j ) = V (g i ) +1 laisse beaucoup de place pour appliquer toutes sortes d'heuristiques supplémentaires en réduisant l'échelle V (g j )ou le composant additif afin de réduire la valeur de certaines options de chemin. La plupart, sinon toutes, de telles modifications peuvent être incorporées de manière simple et générique en utilisant une carte de grille avec des valeurs continues de [0,1], ce qui constitue en réalité une étape de prétraitement de la carte de base binaire initiale. Par exemple, l'ajout d'une transition de 1 à 0 le long des frontières d'un obstacle oblige l '"acteur" à rester de préférence à l'écart des obstacles. Une telle carte en grille peut, par exemple, être générée à partir de la version binaire par flou, par dilatation pondérée ou similaire. L'ajout des menaces et des ennemis en tant qu'obstacles de grand rayon flou pénalise les chemins qui s'en approchent. On peut également utiliser un processus de diffusion sur la grille globale comme ceci:

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

où " somme " fait référence à la somme sur toutes les cellules de la grille voisines. Par exemple, au lieu de créer une carte binaire, les valeurs initiales (entières) pourraient être proportionnelles à l'ampleur des menaces, et les obstacles représentent des "petites" menaces. Après avoir appliqué le processus de diffusion, les valeurs de grille doivent / doivent être mises à l'échelle à [0,1], et les cellules occupées par des obstacles, des menaces et des ennemis doivent être définies / forcées à 1. Sinon, la mise à l'échelle dans l'équation de mise à jour peut ne fonctionne pas comme souhaité.

Il y a beaucoup de variations sur ce schéma général / approche. Les obstacles, etc. peuvent avoir de petites valeurs, tandis que les cellules de grille libres ont de grandes valeurs, ce qui peut nécessiter une descente de gradient dans la dernière étape en fonction de l'objectif. Dans tous les cas, l'approche est, à mon humble avis, étonnamment polyvalente, assez facile à mettre en œuvre et potentiellement assez rapide (sous réserve de la taille / résolution de la carte en grille). Enfin, à l'instar de nombreux algorithmes de planification de chemin qui n'assument pas une position cible spécifique, il existe un risque évident de rester bloqué dans des impasses. Dans une certaine mesure, il pourrait être possible d'appliquer des étapes de post-traitement dédiées avant la dernière étape pour réduire ce risque.

Voici une autre brève description avec une illustration en Java-Script (?), Bien que l'illustration ne fonctionne pas avec mon navigateur :(

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

Vous trouverez beaucoup plus de détails sur la planification dans le livre suivant. L'itération de valeur est spécifiquement traitée dans le chapitre 2, section 2.3.1 Plans optimaux de longueur fixe.

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

Espérons que cela aide, Cordialement, Derik.


3

Que diriez-vous de vous concentrer sur les prédateurs? Disons simplement que nous diffusons à 360 degrés sur la position de Predator, avec la densité appropriée. Et nous pouvons avoir des échantillons de refuge. Et choisissez le meilleur refuge.

cas 1

cas 2


0

Une approche qu’ils ont dans Star Trek Online pour les troupeaux d’animaux consiste simplement à choisir une direction ouverte et à se diriger dans cette direction, en effectuant une rapide ponte des animaux après une certaine distance. Mais il s’agit surtout d’une animation glorifiée de rejet pour les troupeaux que vous êtes censé éviter d’attaquer et qui ne convient pas aux foules de combat.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.