A* манхэттенское расстояние

Я искал алгоритм/псевдокод A*, следовал ему и закодировал. Я использовал манхэттенское расстояние для h(n). ( f(n) = g(n) + h(n) ) И это результат,

Это всегда происходит, когда нет стен, преграждающих путь, но когда я ставлю много стен, кажется, что он выбирает кратчайший путь. Это самый короткий путь? Я имею в виду, почему это не так, как ниже?

Этот тоже A* Manhattan, и они имеют одинаковый размер (19x19). Это из http://qiao.github.com/PathFinding.js/visual/


person Zik    schedule 15.06.2012    source источник
comment
гм, это то же расстояние, 33 куба... если я не ошибся.   -  person Samy Vilar    schedule 15.06.2012
comment
Поскольку вы не можете идти по диагонали, вы не станете короче, чем в первом примере. Вы можете получить много других способов (например, второй), которые имеют такое же расстояние и выглядят короче, но это не так. Вам всегда придется проходить 16 блоков вправо и 16 вниз (для приведенных вами примеров).   -  person Nobody moving away from SE    schedule 15.06.2012
comment
Ну так есть и другие кратчайшие пути.   -  person Zik    schedule 15.06.2012
comment
Я имею в виду, что первый тоже кратчайший путь, но второй выглядит короче, потому что путь ведет прямо к цели. :)   -  person Zik    schedule 15.06.2012
comment
это оптимальное расстояние, потому что вы не используете диагонали. если вы возьмете 8 соседей для каждой ячейки, путь в вашем случае будет диагональю от начала до конца.   -  person Mensur Grišević    schedule 29.03.2017


Ответы (3)


Оба пути имеют одинаковое манхэттенское расстояние. Следовательно, выбор пути зависит от реализации. Чтобы понять, почему была выбрана именно эта часть, нам нужно взглянуть на код этой конкретной реализации A*.

Подсказка: каждый путь от исходной к целевой ячейке, который использует только район фон Неймана (т. е. не идет по диагонали) и не делает шаг в «неправильном» направлении (т. е. никогда не идет вверх или влево в вашем примере) имеет такое же манхэттенское расстояние. Так что, если вы находитесь в Нью-Йорке, не имеет значения, какой перекресток вы выберете, чтобы добраться до определенного места на Манхэттене :)

person gexicide    schedule 15.06.2012
comment
Значит, первый все-таки один из кратчайших путей? - person Zik; 15.06.2012

При манхэттенском расстоянии первый путь является кратчайшим. Он просто подсчитывает количество сделанных горизонтальных и вертикальных шагов. Если вам нужно что-то, что больше похоже на кратчайший путь на евклидовом расстоянии, вы можете попробовать изменить свой алгоритм так, чтобы, когда у него есть выбор двигаться по горизонтали или вертикали в одной точке, он выбирал горизонтальный путь, если расстояние по горизонтали больше, чем по вертикали. один и наоборот.

person nhkode    schedule 15.06.2012

Вам нужно провести линию взгляда (пифагорейскую/евклидову) от начальной точки до каждой точки (результата Манхэттена/A*) до финиша. Если бросок лески в определенную точку заблокирован/скрыт препятствием, вы используете предыдущую брошенную точку и начинаете бросать другую леску из этой заблокированной точки, а затем вперед до конца. Заблокированная точка — это когда точка скрыта линией прямой видимости начальной точки сегмента/линии. Так это как:

Первая строка: Старт--------->S+N(до заблокированной точки)

Вторая/Средняя линия/с:Заблокированная точка---------->S+N(перед другой заблокированной точкой) повторить еще раз(новая линия/сегмент), пока не установится линия прямой видимости к цели.

Последняя строка:Заблокированная точка------------->Цель

Соедините все линии, и у вас будет гораздо более короткий кратчайший путь. Вы можете выполнить еще раз, но в обратном порядке, чтобы добавить еще одну точность, чтобы линия прицеливания начиналась с цели до начала.

person D.R.Bendanillo    schedule 17.03.2015