#c #path-finding #a-star
#c #поиск пути #a-star
Вопрос:
Я пытаюсь написать свой собственный алгоритм поиска пути A * и сталкиваюсь с проблемой; при поиске кратчайшего пути возникает следующая ошибка:
Где узел, заполненный зеленым, является начальным узлом, узел, заполненный красным, является конечным узлом, а узлы, заполненные розовым, являются фактическим путем, пройденным алгоритмом.
Это, конечно, не самый короткий путь, и я уверен, что проблема связана с моей эвристической функцией (расстояние до Манхэттена):
int Map::manhattanDistance(Node evaluatedNode, Node goalNode)
{
int x = evaluatedNode.xCoord - goalNode.xCoord;
int y = evaluatedNode.yCoord - goalNode.yCoord;
if(x y < 0)
return (x y) * -1;
else
return x y;
}
Мне кажется, что формула расстояния Манхэттена здесь не идеальна, и поэтому мой вопрос таков: какой другой алгоритм измерения расстояния будет работать для меня здесь?
РЕДАКТИРОВАТЬ: для наглядности ширина каждого узла определяется количеством узлов в строке / ширина экрана = 640, а высота каждого узла определяется количеством узлов в столбце / высота экрана = 480.
Комментарии:
1. Каково, по-вашему, расстояние между (3,5) и (2,6)?
Ответ №1:
Отрицательная стоимость будет означать, что маршрут свободен или более того, что он учитывает предыдущие ходы. Похоже, вы пытались учесть это, умножив на -1 совокупное значение, однако ущерб уже был нанесен. Вот почему в решении использовались диагонали, (1 — 1) * -1 по-прежнему равен нулю и, следовательно, считается свободным.
Я бы заменил оператор if следующим, который использует величину каждого компонента, применяя abs к нему отдельно:
возвращает Math.abs(x) Math.abs(y);
Комментарии:
1. Это расстояние до Манхэттена . (Ваша формула была просто неправильной).