Ich habe den A * -Algorithmus in AS3 implementiert und es funktioniert gut bis auf eine Sache. Oft der resultierende Pfad nicht am meisten "Natürliche" oder glatte Route zum Ziel. In meiner Umgebung kann sich das Objekt diagonal so günstig bewegen, wie es horizontal oder vertikal bewegen kann. Hier ist ein sehr einfaches Beispiel; der Startpunkt ist durch das S markiert, und das Ende (oder Finish) Punkt von der F.Wie finde ich die "Natürlich" direkte Route mit A-Stern (A *)
| | | | | | | | | |
|S| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Wie Sie während der ersten Runde der Erkenntnis sehen können, Knoten [0,2], [1,2], [2,2] werden alle hinzugefügt werden die Liste der möglichen Knoten wie sie alle ha ve eine Punktzahl von N. Das Problem, das ich habe, kommt am nächsten Punkt, wenn ich versuche, zu entscheiden, mit welchem Knoten fortzufahren. Im obigen Beispiel benutze ich mapsNodes [0], um den nächsten Knoten zu wählen. Wenn ich dies in possibleNodes [possibleNodes.length-1] ändere, erhalte ich den folgenden Pfad.
| | | | | | | | | |
|S| | | | | | | | |
| |x| | | | | | | |
| | |x| | | | | | |
| | | |x| | | | | |
| | |x| | | | | | |
| |x| | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Und dann mit possibleNextNodes [Math.round (possibleNextNodes.length/2) -1]
| | | | | | | | | |
|S| | | | | | | | |
|x| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Alle diese Wege haben die gleichen Kosten wie sie alle die gleiche Anzahl von Schritten enthalten aber, in dieser Situation wäre der vernünftigste Weg wie folgt ...
| | | | | | | | | |
|S| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
gibt es eine formal anerkannte Methode den Weg zu machen scheint vernünftige und nicht nur mathematisch korrekt?
+1. Ausgezeichnete Tiebreaker-Funktion. (Möglicherweise müssen Sie die 0,001 einzustellen, um sicherzustellen, dass die Heuristik nicht in der Vergangenheit eine andere klettern kann, kürzer, aber hässlicher Weg in den Reihen ... OTOH, könnte dies einige produzieren interessant und schön (wenn auch suboptimal) Wege!) –