J'ai une carte carrée. Seuls les mouvements horizontaux et verticaux sont autorisés (pas de diagonales). Le coût de déplacement est toujours de 1.
J'implémente un algorithme A * sur cette carte, en utilisant la distance de Manhattan comme heuristique de distance. Cette heuristique est-elle cohérente? Puis-je éviter de vérifier les g(node)
nœuds qui se trouvent dans l'ensemble FERMÉ?
Edit: Par cohérent, je veux dire monotone.
tiles
path-finding
geometry
Emiliano
la source
la source
Réponses:
Pour répondre à votre question: la distance de Manhatten est cohérente lorsque vous êtes contraint de vous déplacer verticalement / horizontalement le long d'une grille non pondérée (cela peut être facilement montré par la définition sur wikipedia) . Alors oui, dans votre cas, vous pouvez éviter de revérifier les nœuds dans l'ensemble fermé.
Cependant, une fois que vous autorisez le mouvement en diagonale ou dans n'importe quel angle, la distance brisée devient inadmissible car elle surestime les coûts diagonaux, ce qui signifie nécessairement qu'elle n'est pas cohérente.
la source
h(x) = min(manhattan(p1), manhattan(p2))
(c'est-à-dire que p1 ou p2 sont un bon point de fin et que je veux atteindre le plus proche). Est-ceh(x)
encore monotone?h(x, p1)
eth(x, p2)
sont cohérents, ilsmin(h(x,p1), h(x,p2))
seront également cohérents. Ceci est facile à montrer à partir de la définition sur wikipedia (nous aurions besoin de montrer quemin(h(x, p1), h(x, p2)) <= distance(x,y) + min(h(y, p1), h(y, p2))
pour tous les nœudsx
ety
avec un bord entre eux. Supposons maintenant queh(x, p1)
c'est le minimum; pouvez-vous montrer que c'est certainement<=
du côté droit, en utilisant le fait que les deux heuristiques sont cohérentes?)Oui, la distance de Manhattan entre deux points est toujours la même, tout comme la distance régulière entre eux. Vous pouvez penser que la distance de Manhattan est les composantes X et Y d'une ligne passant entre les deux points.
Cette image ( de Wikipedia ) illustre bien cela:
La ligne verte est la distance réelle.
Les lignes bleues , rouges et jaunes représentent toutes la même distance de Manhattan (12 unités). Quelle que soit la combinaison de mouvements vers le haut et vers la droite que vous dessinez du point en bas à gauche vers le bas à droite, vous obtiendrez la même distance totale de Manhattan.
la source
h(x) = 1000
, ce qui n'est évidemment pas cohérent) . Il peut éviter de revérifier les nœuds, mais uniquement parce que la distance Manhatten est cohérente, ce que cette réponse ne montre pas.2*manhatten
satisfait cela, mais n'est pas cohérent.Dans le prolongement de la réponse de Byte56, je voudrais souligner que dans votre ensemble de données spécifique, l'utilisation de Manhattan Distance comme fonction heuristique sera en fait toujours une heuristique parfaite dans le sens où elle renverra toujours le coût réel du chemin (en supposant qu'il y ait rien "bloque" les chemins).
Vous devez également noter que tous les nœuds dans la bonne direction (horizontalement ou verticalement) produiront la même distance attendue (car il existe de nombreux chemins également courts vers l'objectif). Vous devez savoir que votre file d'attente prioritaire (ensemble ouvert) doit, en cas de priorités liées, retirer le dernier nœud ajouté en premier (LIFO - Last In First Out). Ce faisant, vous n'examinerez que les nœuds qui se retrouveront dans le chemin optimal . Si vous examinez des nœuds également appropriés d'une manière FIFO (First In First Out), vous examinerez efficacement tous les nœuds qui font partie d'un meilleur chemin. Ce problème se pose car il existe plusieurs chemins d'accès également bons vers le nœud cible.
la source
Je ne sais pas ce que vous entendez par "toujours" cohérent. La distance de Manhattan sur une grille fixe est-elle indépendante du chemin emprunté? Oui, comme l'a dit la réponse de Byte56.
Cependant, par exemple, la distance de Manhattan n'est pas invariante lors des rotations. Par exemple, la distance de Manhattan ( norme L1 ) entre l'origine et un point
(10,10)
est|10-0| + |10-0| = 20
. Cependant, si vous faites pivoter vos coordonnées de 45 degrés (alors votre point fixe se trouve maintenant dans l'une des directions de la grille), vous constaterez maintenant que le même point se trouve maintenant(10sqrt(2),0)
, ainsi que la distance de Manhattan à l'origine de10sqrt(2)~14.14
.la source