web-dev-qa-db-fra.com

Est-ce que A * est le meilleur algorithme de recherche de chemin?

On dit généralement que A * est le meilleur algorithme pour résoudre les problèmes de recherche de trajectoire. 

Existe-t-il une situation où A * estpasle meilleur algorithme pour trouver une solution? 

Quelle est la qualité de A * par rapport à BFS, DFS, UCS, etc.?

25
Zombie

A * est spécial parce qu'il peut être transformé en d'autres algorithmes de recherche de chemin en jouant avec la façon dont il évalue les nœuds et les méthodes heuristiques qu'il utilise. Vous pouvez le faire pour simuler la recherche de Djikstra, la meilleure recherche en premier, la recherche en largeur d'abord et la recherche en profondeur d'abord. 

De plus, il est souvent facile d’accélérer les choses. Par exemple, si vous multipliez une heuristique admissible par une constante, c, vous pouvez garantir que le coût de la séquence de nœuds obtenue ne dépasse pas c fois le résultat optimal.

Par exemple, prenons ce awesome paper de Ian Davis (écrit pour Star Trek Armada). A * est utilisé avec un ensemble hiérarchique de points de cheminement, ce qui donne un tracé approximatif. ALORS, afin de lisser le chemin, ils exécutent à nouveau A * sur un nouveau graphe généré contenant les nœuds du chemin et ceux à proximité pour obtenir un chemin plus raisonnable. Enfin, ils utilisent des bandes élastiques pour supprimer les nœuds redondants.

Donc, A * n'est pas la solution à tout, mais c'est un outil très polyvalent.

6
sjdlgjsljg

Une alternative extrêmement simple (sans querelle avec l'heuristique) est Collaborative Diffusion . Il fonctionne parfaitement lorsque vous devez cibler une cible ou tout membre d'un groupe, sans distinction}, et dans ce cas, il peut être plus rapide que A *. Il imite le jeu "Vous obtenez plus chaud/plus froid".

La diffusion collaborative crée une carte thermique par "groupe" que vous souhaitez cibler ... si vous souhaitez suivre une cible spécifique, traitez-la comme son propre groupe en créant une carte thermique spécifique à cette cible; Le domaine de Collaborative Diffusion est constitué de jeux comme le football (où les deux équipes d’agents suivent le ballon et les poteaux de but, n’aboutissant que pour 3 cartes d’influence), ou de Pacman total) de chaque armée déterminée par chaque agent de cette armée, de sorte qu'une armée puisse s'approcher de "l'autre armée" plutôt que d '"unités spécifiques au sein de l'autre armée". Cette généralité peut permettre une performance accrue.

La marche consiste en une escalade (allant de la cellule actuelle à une cellule voisine plus chaude) jusqu'à la destination (point le plus chaud). L’approche traite implicitement des obstacles mobiles, c’est-à-dire d’autres agents.

Il convient mieux lorsque les cartes sont relativement densément peuplées avec de nombreuses unités mobiles, ce qui justifie la diffusion étendue qui doit se produire sur l’ensemble de l’espace de recherche à chaque mise à jour. Il est clair qu’une approche A * bien ajustée peut être beaucoup moins coûteuse sur une grande carte peu dense où nous n’avons qu’une seule unité, car avec A *, dans ce cas, vous ne travaillez que sur une fraction. des tuiles de carte entre le chercheur et la cible; alors qu'avec Collaborative Diffusion, vous diffusez plutôt sur toute la carte pour faire la même chose, ce qui la rend beaucoup plus coûteuse.

4
Engineer

Je vois que la question est ancienne, mais cette solution pratique sera probablement utile à quelqu'un . Récemment, j'ai trouvé un très beau code source ouvert écrit en python

le code contient les algorithmes de recherche de chemin suivants:

  • UNE*
  • Dijkstra
  • Meilleur premier
  • A * bidirectionnel
  • Largeur première recherche (BFS)
  • Approfondissement itératif A * (IDA *)

changer la taille et les valeurs de la matrice permet de sentir la différence entre différents algorithmes de recherche de chemin. Comme il est mentionné sur Wikipedia : "Un * est complet et trouvera toujours une solution si elle existe"

0
zviad