Navigation forestiĂšre
Un * Path Finder Algorithm est un outil puissant pour gĂ©nĂ©rer rapidement des chemins optimaux. Habituellement, A * est affichĂ© lors de la navigation dans les cartes Ă partir des grilles, mais il peut ĂȘtre utilisĂ© non seulement pour les grilles! Il peut fonctionner avec n'importe quel graphique. Vous pouvez utiliser A * pour trouver votre chemin dans le monde des obstacles ronds.
Dans l' article original, toutes les images sont interactives.Comment un algorithme résout-il ces deux problÚmes? Commençons par une brÚve description du fonctionnement d'A *.
Algorithme A *
L'algorithme A * trouve le
chemin optimal du début au point final, en évitant les obstacles en cours de route. Il s'en rend compte, élargissant progressivement de nombreux
chemins partiels . Chaque chemin partiel est une sĂ©rie d'Ă©tapes allant du point de dĂ©part Ă un point intermĂ©diaire sur la route du but. Dans le processus de travail A *, les chemins partiels se rapprochent du point final. L'algorithme cesse de fonctionner lorsqu'il trouve le chemin complet, ce qui est meilleur que les options restantes, et cela peut ĂȘtre prouvĂ©.
à chaque étape de l'algorithme, A * évalue l'ensemble des chemins partiels et génÚre de nouveaux chemins, développant le chemin le plus prometteur hors de l'ensemble. Pour ce faire, A * stocke les chemins partiels dans une file d'attente prioritaire, triés par
longueur approximative - la vraie longueur de chemin mesurĂ©e plus la distance restante approximative jusqu'Ă la cible. Cette approximation doit ĂȘtre
sous-estimĂ©e ; c'est-Ă -dire que l'approximation peut ĂȘtre infĂ©rieure Ă la vraie distance, mais pas supĂ©rieure Ă celle-ci. Dans la plupart des tĂąches de recherche de chemin, une bonne estimation sous-estimĂ©e est la distance gĂ©omĂ©trique en ligne droite entre la fin du chemin partiel et le point final. Le vrai meilleur chemin vers le but depuis la fin du chemin partiel peut ĂȘtre plus long que cette distance en ligne droite, mais ne peut pas ĂȘtre plus court.
Lorsque A * dĂ©marre, la file d'attente prioritaire ne contient qu'un seul chemin partiel: le point de dĂ©part. L'algorithme supprime Ă plusieurs reprises le chemin le plus prometteur de la file d'attente prioritaire, c'est-Ă -dire le chemin avec la plus petite longueur approximative. Si ce chemin se termine au point de terminaison, alors l'algorithme a terminĂ© la tĂąche - la file d'attente prioritaire garantit qu'aucun autre chemin ne peut ĂȘtre meilleur. Sinon, Ă partir de la fin du chemin partiel qu'il a supprimĂ© de la file d'attente, A * gĂ©nĂšre plusieurs nouveaux chemins, faisant des pas unitaires dans toutes les directions possibles. Il remet ces nouveaux chemins dans la file d'attente prioritaire et recommence le processus.
Compter
A * fonctionne avec un
graphe : un ensemble de
nĆuds reliĂ©s par des
arĂȘtes . Dans un monde basĂ© sur une grille, chaque nĆud dĂ©signe une cellule de maillage distincte, et chaque bord est une connexion aux cellules voisines au nord, au sud, Ă l'est ou Ă l'ouest.
Avant de pouvoir exĂ©cuter A * pour la forĂȘt Ă partir d'obstacles ronds, nous devons le convertir en graphique. Tous les chemins Ă travers la forĂȘt sont constituĂ©s de segments alternĂ©s de lignes et d'arcs. Ce sont les bords du graphique du chemin. Les extrĂ©mitĂ©s de ces bords deviennent des nĆuds.
Un chemin Ă travers un graphique est une sĂ©rie de nĆuds reliĂ©s par des bords:
Les segments et les arcs sont tous deux des bords du graphique. Nous appellerons les segments les
bords de transition , car le chemin les utilise pour se déplacer entre les obstacles. Nous appelons arcs les
bords enveloppants , car leur tùche en cours de route est de contourner les cÎtés des obstacles.
Ensuite, nous explorerons un moyen simple de transformer une forĂȘt avec des obstacles en graphique: nous gĂ©nĂ©rerons toutes les arĂȘtes de transition et enveloppes possibles des arĂȘtes.
Transition Edge Generation
Les bords de la transition entre une paire de cercles sont des segments de ligne qui touchent à peine les deux cercles; ces segments sont appelés
tangentes à deux points , et pour chaque paire de cercles, il y a quatre tangentes de ce type. Les tangentes à deux points qui se croisent entre les cercles sont appelées
tangentes internes à deux points , et celles qui passent à l'extérieur sont appelées
externes .
Tangentes intérieures à deux points
Dans le passé, la recherche de tangentes internes était importante pour calculer la longueur de la courroie reliant deux poulies de tailles différentes, de sorte que la tùche de créer des tangentes internes à deux points s'appelle le
problĂšme des courroies . Pour trouver les tangentes internes Ă deux points, vous devez calculer l'angle
theta dans le dessin ci-dessous.
Il s'est avéré que, pour les cercles avec des centres
A et
B et rayons
rA et
rB dont les centres sont Ă distance
d :
theta= arccosrA+rB overd
Définition
theta on peut facilement trouver les points
C ,
D ,
E et
F .
Tangentes externes Ă deux points
Lors de la construction de tangentes externes (c'est la
tùche des poulies ), une technique similaire est utilisée.
Pour les tangentes externes, nous pouvons trouver
theta comme suit:
theta= arccos lvertrAârB rvert overd
Peu importe lequel des cercles est plus grand, A ou B, mais comme vous pouvez le voir sur l'image,
theta posé sur le cÎté A le plus proche de B, mais sur le cÎté B le plus éloigné de A.
Ligne de vue
Pris ensemble, les tangentes internes et externes Ă deux points entre les deux cercles forment les bords de la transition entre les cercles. Mais que se passe-t-il si un ou plusieurs bords de transition ferment le troisiĂšme cercle?
Si le bord de transition est chevauché par un autre cercle, alors nous devons éliminer ce bord. Pour reconnaßtre un tel cas, nous utilisons un calcul simple de la
distance entre un point et une ligne . Si la distance entre le bord de transition et le centre de l'obstacle est inférieure au rayon de l'obstacle, alors l'obstacle chevauche le bord de transition, nous devons donc le jeter.
Pour calculer la distance d'un point
C Ă un segment de ligne droite
overlineAB nous utiliserons la
méthode suivante :
Tout d'abord, nous calculons
u - une partie de la distance le long du segment
overlineAB oĂč la perpendiculaire coupe le point
C :
u=(CâA) cdot(BâA) over(BâA) cdot(BâA)
Ensuite, nous calculons la position
E sur
overlineAB :
E=A+ mathrmclamp(u,0,1)â(BâA)
La distance
d de
C couper
overlineAB La distance de
C avant
E :
d= |EâC |
Depuis
d<r , le cercle chevauche la ligne de visée de
A dans
B et le bord doit ĂȘtre jetĂ©. Si
d ger puis la ligne de vue de
A dans
B existe et la cĂŽte doit ĂȘtre laissĂ©e.
Génération d'enveloppe de bord
Les nĆuds du graphique relient le bord de transition au bord de l'enveloppe. Dans les sections prĂ©cĂ©dentes, nous avons gĂ©nĂ©rĂ© des arĂȘtes de transition. Pour gĂ©nĂ©rer les enveloppes des bords, nous partons du point final du bord de transition, faisons le tour du cercle et terminons au point final d'un autre bord de transition.
Pour trouver l'ensemble des enveloppes des bords d'un cercle, on trouve d'abord tous les bords de la transition qui sont tangents au cercle. Créez ensuite les enveloppes des bords entre tous les points d'extrémité des bords de transition sur le cercle.
Tout mettre ensemble
AprĂšs avoir gĂ©nĂ©rĂ© des arĂȘtes de transition, des enveloppes d'arĂȘtes et de nĆuds, puis Ă©liminĂ© toutes les arĂȘtes de transition qui se chevauchent, nous pouvons crĂ©er un graphique et commencer Ă rechercher le chemin Ă l'aide de l'algorithme A *.
Améliorations
La procĂ©dure de gĂ©nĂ©ration de graphe que nous avons examinĂ©e fonctionne assez bien pour expliquer l'algorithme, mais peut ĂȘtre amĂ©liorĂ©e Ă bien des Ă©gards. De telles amĂ©liorations permettront Ă l'algorithme de dĂ©penser moins de ressources CPU et mĂ©moire, ainsi que de gĂ©rer plus de situations. Regardons quelques-unes des situations.
Obstacles qui se concernent
Vous avez peut-ĂȘtre remarquĂ© que dans les exemples ci-dessus, les obstacles ronds ne se chevauchaient pas et ne se touchaient mĂȘme pas. En supposant que les cercles peuvent se toucher, cela complique la tĂąche de trouver le chemin
Tangentes Ă deux points
Rappelons que les tangentes Ă deux points peuvent ĂȘtre trouvĂ©es en utilisant cette formule pour les tangentes internes:
theta= arccosrA+rB overd
et formules pour tangentes externes:
theta= arccos lvertrAârB rvert overd
Lorsque deux cercles se touchent ou se croisent, il n'y a pas de tangente interne entre eux. Dans ce cas
rA+rB surd plus d'un. Ătant donnĂ© que la valeur de l'arccosine est en dehors du domaine de la dĂ©finition
[â1,1] non dĂ©fini, il est important de vĂ©rifier l'intersection des cercles avant de trouver l'arc cosinus.
De mĂȘme, si un cercle est complĂštement situĂ© dans un autre, il n'y aura pas de tangentes externes entre eux. Dans ce cas
rAârB surd hors de portĂ©e
[â1,1] c'est-Ă -dire qu'il n'a pas d'arc cosinus.
Ligne de visibilité des bords de transition
Si nous autorisons la possibilité de toucher ou de franchir des obstacles, de nouveaux cas apparaissent dans les calculs de la ligne de visée des bords de transition.
Rappeler le calcul
u - partie de la distance le long du bord de la transition à laquelle la perpendiculaire au point touche le bord. Si toucher les cercles n'est pas autorisé, la valeur
u hors de portée
[0,1] c'est-Ă -dire que le cercle ne peut pas toucher le bord, car pour cela il devrait toucher l'un des points d'extrĂ©mitĂ© du bord. Cela n'est pas possible car les extrĂ©mitĂ©s d'une arĂȘte sont dĂ©jĂ tangentes Ă d'autres cercles.
Cependant, si nous permettons la possibilité de cercles qui se chevauchent, les valeurs
u hors de portée
[0,1] peut chevaucher la ligne de visĂ©e le long du bord. Cela correspond aux cas oĂč le cercle est situĂ© au-delĂ de l'extrĂ©mitĂ© du bord de transition, mais chevauche ou touche le point final. Pour suivre de tels cas mathĂ©matiquement, nous
limiterons u intervalle
[0,1] :
E=A+pince(u,0,1)â(BâA)
Ligne de vue de l'enveloppe
Lorsque des obstacles peuvent se toucher ou se croiser, les enveloppes des bords peuvent ĂȘtre bloquĂ©es par des obstacles de la mĂȘme maniĂšre que les bords de transition. ConsidĂ©rez le bord de l'enveloppe de la figure ci-dessous. Si l'enveloppe de la cĂŽte touche un autre obstacle, la cĂŽte est bloquĂ©e et doit ĂȘtre jetĂ©e.
Pour déterminer si l'enveloppe du bord est bloquée par un autre obstacle, nous utilisons la
méthode suivante pour déterminer les points d'intersection de deux cercles. Si les cercles ont des centres aux points
A et
B et rayons
rA et
rB oĂč
d - distance entre
A et
B , pour commencer, nous devons vérifier plusieurs cas. Si les cercles ne se touchent pas (c.-à -d.
d>rA+rB ),
sont l'un dans l'autre (
d<|rAârB| ) ou match (
d=0 et
rA=rB ), les cercles ne peuvent donc pas affecter les enveloppes des uns et des autres.
Si aucune de ces conditions n'est remplie, les cercles se coupent en deux points; si les cercles se touchent, alors ces deux points coïncident. Considérez l'
axe radical reliant les points d'intersection; il est perpendiculaire Ă la ligne reliant
A et
B à un moment donné
C . On peut calculer la distance
a de
A avant
C comme suit:
a=r2Aâr2B+d2 sur2d
Trouver
a on peut trouver l'angle
theta :
theta= arccosa overrA
Si
theta est nul, alors les cercles se touchent
C . Sinon, il y a deux points d'intersection correspondant à positif et négatif
theta .
Ensuite, nous dĂ©terminons si l'un des points d'intersection se situe entre les points de dĂ©but et de fin de l'enveloppe de l'arĂȘte. Si c'est le cas, l'obstacle bloque le bord de l'enveloppe et nous devons jeter ce bord. Notez que nous n'avons pas besoin de considĂ©rer le cas oĂč l'enveloppe du bord est entiĂšrement Ă l'intĂ©rieur de l'obstacle, car l'Ă©crĂȘtage le long de la ligne de visĂ©e pour les bords de transition a dĂ©jĂ rejetĂ© ce bord.
AprÚs avoir modifié le calcul des tangentes à deux points et la ligne de visée des bords de transition et des enveloppes des bords, tout fonctionne correctement.
Rayon d'acteur variable et extension de Minkowski
Lors du calcul de la navigation d'un objet rond dans le monde des obstacles circulaires, on peut prendre en compte des observations qui simplifient la solution du problĂšme. Tout d'abord, on peut simplifier le travail en notant que le mouvement d'un cercle de rayon
r Ă travers la forĂȘt est similaire au mouvement d'un point Ă travers la mĂȘme forĂȘt avec un seul changement: le rayon de chaque obstacle augmente de
r . Il s'agit d'un cas extrĂȘmement simple d'application de la
somme de Minkowski . Si le rayon de l'acteur est supérieur à zéro, alors avant de commencer, nous augmentons simplement la taille des obstacles.
Génération de bords différés
En gĂ©nĂ©ral, un graphique pour une forĂȘt de
n obstacles contient
O(n2) bords de transition, mais comme chacun d'eux doit ĂȘtre vĂ©rifiĂ© pour la ligne de vue avec
n obstacles, la durée totale de génération du graphe est
O(n3) . De plus, des paires de bords de transition peuvent conduire Ă la crĂ©ation de bords d'enveloppe, et chacun d'eux doit ĂȘtre vĂ©rifiĂ© avec chaque obstacle pour la ligne de visĂ©e. Cependant, en raison de la grande efficacitĂ© de l'algorithme A *, il ne regarde gĂ©nĂ©ralement qu'une partie de ce grand graphique pour crĂ©er le chemin optimal.
Nous pouvons gagner du temps en générant de petites parties du graphique à la volée pendant l'exécution de l'algorithme A *, plutÎt que de faire tout le travail à l'avance. Si A * trouve rapidement le chemin, nous ne générerons qu'une petite partie du graphique. Pour ce faire, nous déplaçons la génération de bord vers la fonction
neighbors()
.
Il y a plusieurs cas. Au début de l'algorithme, nous avons besoin de voisins du point de départ. Ce sont les bords de la transition du point de départ aux bords gauche et droit de chaque obstacle.
Le cas suivant est celui oĂč A * vient d'arriver au point
p au bord d'un obstacle
C le long du bord de transition: les
neighbors()
doivent renvoyer les enveloppes des bords menant de
p . Pour ce faire, nous dĂ©terminons quelles arĂȘtes de transition sortent de l'obstacle en calculant les tangentes Ă deux points entre
C et tous les autres obstacles, en éliminant tous ceux qui ne sont pas en vue. On retrouve ensuite toutes les enveloppes des bords se connectant
p avec ces bords de transition, laissant tomber ceux qui sont bloqués par d'autres obstacles. Nous renvoyons toutes ces enveloppes des bords, en sauvegardant les bords de transition pour le retour dans un appel ultérieur aux
neighbors()
.
Le dernier cas est celui oĂč A * a contournĂ© le bord de l'enveloppe le long de l'obstacle
C et il doit partir
C le long du bord de la transition. Ătant donnĂ© que l'Ă©tape prĂ©cĂ©dente a calculĂ© et enregistrĂ© toutes les arĂȘtes de transition, vous pouvez simplement rechercher et renvoyer l'ensemble d'arĂȘtes correct.
Nous coupons les enveloppes pointues des cĂŽtes
Les bords d'enveloppe relient les bords de transition touchant un cercle, mais il s'avÚre que bon nombre de ces bords d'enveloppe ne conviennent pas pour une utilisation optimale. Nous pouvons accélérer l'algorithme en les éliminant.
Le chemin optimal Ă travers la forĂȘt d'obstacles consiste toujours Ă alterner des bords de transition et des enveloppes de bords. Supposons que nous entrons dans un nĆud
A et décidez comment vous en sortir:
Connectez-vous via
A signifie que nous allons
dans le sens horaire (
circlearrowright ) Nous devons sortir par le nĆud, ce qui nous permet de continuer Ă se dĂ©placer dans le sens horaire (
circlearrowright ), c'est-Ă -dire que nous ne pouvons sortir que par le nĆud
B ou
D . Si vous sortez par
C puis une
inflexion (
curlywedge ) des moyens qui ne seront jamais optimaux. Nous devons filtrer ces bords pointus.
Tout d'abord, notez que A * traite de toute façon chaque bord non orienté.
P longleftrightarrowQ comme deux bords orientés
P longrightarrowQ et
Q longrightarrowP . Nous pouvons en profiter en marquant les bords et les nĆuds avec une orientation.
- Noeuds P devenir des nĆuds avec une orientation - dans le sens horaire ( P circlearrowright ) ou dans le sens antihoraire ( P circlearrowleft ) flĂšches.
- Bords de transition non orientĂ©s P longleftrightarrowQ devenir des bords orientĂ©s P,p longrightarrowQ, hatq et Q,q longrightarrowP, hatp oĂč p et q Sont des orientations, et chapeaux signifie la direction opposĂ©e x .
- Enveloppes cÎtelées non orientées P longleftrightarrowQ devenir des bords orientés P circlearrowright longrightarrowQ circlearrowright et P circlearrowleft longrightarrowQ circlearrowleft . C'est là que se produit le filtrage: nous n'activons pas P circlearrowright longrightarrowQ circlearrowleft et P circlearrowleft longrightarrowQ circlearrowright , car un changement de direction crée des plis ( curlywedge )
Dans notre circuit, le nĆud
A se transformera en deux nĆuds,
A circlearrowright et
A circlearrowleft il a un front de transition entrant
longrightarrowA circlearrowright et bord de transition sortant
A circlearrowleft longrightarrow . Si nous prenons la route
A circlearrowright devrait alors sortir par le nĆud
circlearrowright qui sera soit un bord de transition
B circlearrowright longrightarrow (Ă travers le bord de l'enveloppe
A circlearrowright longrightarrowB circlearrowright ), ou bord de transition
D circlearrowright longrightarrow (Ă travers le bord de l'enveloppe
A circlearrowright longrightarrowD circlearrowright ) Nous ne pouvons pas sortir
C circlearrowleft longrightarrow , car le sens de rotation va changer de cette façon, et nous avons filtré l'enveloppe du bord
A circlearrowright longrightarrowC circlearrowleft .
En filtrant ces enveloppes pointues de bords du graphique, nous avons augmenté l'efficacité de l'algorithme.
Couper les bords qui se croisent
Des chemins partiels peuvent ĂȘtre coupĂ©s, dont les derniers bords de la transition coupent l'avant-dernier bord de la transition.
Obstacles polygonaux
Voir
Game Programming Gems 2 , Chapter 3.10, Optimizing Points-of-Visibility Pathfinding, Ă©crit par Thomas Young. Ce chapitre traite de l'Ă©crĂȘtage des nĆuds, mais pas pour les cercles, mais pour les polygones.
Les références