Я реализовал алгоритм A * в AS3, и он отлично работает, за исключением одной вещи.
Часто полученный путь не идет по самому «естественному» или плавному пути к цели.
В моем окружении объект может перемещаться по диагонали так же недорого, как и горизонтально или вертикально.
Вот очень простой пример; начальная точка отмечена буквой S, а конечная (или конечная) - буквой F.
| | | | | | | | | |
|S| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Как вы можете видеть, в течение 1-го раунда поиска все узлы [0,2], [1,2], [2,2] будут добавлены в список возможных узлов, поскольку все они имеют оценку Н.
Проблема, с которой я столкнулся, возникает в следующий момент, когда я пытаюсь решить, с какого узла продолжить работу. В приведенном выше примере я использую возможный узел [0], чтобы выбрать следующий узел. Если я изменю это на возможный узел [возможный узел [длина 1]], я получу следующий путь.
| | | | | | | | | |
|S| | | | | | | | |
| |x| | | | | | | |
| | |x| | | | | | |
| | | |x| | | | | |
| | |x| | | | | | |
| |x| | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
И затем с возможнымиNextNodes [Math.round (возможныйNextNodes.length / 2) -1]
| | | | | | | | | |
|S| | | | | | | | |
|x| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Все эти пути имеют одинаковую стоимость, поскольку все они содержат одинаковое количество шагов, но в этой ситуации наиболее разумный путь будет следующим:
| | | | | | | | | |
|S| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|x| | | | | | | | |
|F| | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Существует ли формально принятый способ придания пути большей осмысленности, нежели математически правильного?