Я реализовал алгоритм A * в AS3, и он отлично работает, за исключением одного. Часто результирующий путь не занимает больше всего «Естественный» или плавный маршрут к цели В моей среде объект может перемещаться по диагонали как недорого, так как он может двигаться горизонтально или вертикально. Вот очень простой пример: начальная точка отмечена знаком S и концом (или окончание) точка на F.Как найти самый «прямой» маршрут с помощью A-star (A *)
| | | | | | | | | |
|S| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Как вы можете видеть, в течение 1-го раунда нахождения, узлы [0,2], [1,2], [2,2] все будут добавлены к список возможного узла, поскольку все они ve оценка N. Проблема, с которой я сталкиваюсь, приходит в следующий момент, когда я пытаюсь решить, с какого узла продолжить работу. В приведенном выше примере я использую возможныеNodes [0], чтобы выбрать следующий узел. Если я изменю это на возможныеNodes [possibleNodes.length-1], я получаю следующий путь.
| | | | | | | | | |
|S| | | | | | | | |
| |x| | | | | | | |
| | |x| | | | | | |
| | | |x| | | | | |
| | |x| | | | | | |
| |x| | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
А потом с possibleNextNodes [Math.round (possibleNextNodes.length/2) -1]
| | | | | | | | | |
|S| | | | | | | | |
|x| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Все эти пути имеют такую же стоимость, как все они содержат одинаковое количество шагов, но, в этой ситуации самого разумный путь будет выглядеть следующим образом ...
| | | | | | | | | |
|S| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
есть ли официально принятый метод создания путей кажется более разумным, а не просто математически правильно?
+1. Отличная функция тай-брейка. (Вам может потребоваться настроить 0,001, чтобы убедиться, что эвристика не может пройти мимо другого, более короткого, но уродливого пути в строю ... OTOH, это может привести к некоторым интересным и красивым (хотя и субоптимальным) дорожкам!) –