Не могу понять алгоритм A* Pathfinding, когда кажется, что два пути возвращают одинаковую длину, но один ведет меня в совершенно неверном направлении.

Я читаю о поиске пути A* с использованием эвристики и манхэттенского метода и не могу понять логика в одном конкретном месте в статье.

Я застрял сразу после изображения ниже

введите здесь описание изображения

а чтобы лучше понять вот цитата

На этот раз, когда мы проверяем соседние квадраты, мы обнаруживаем, что тот, что находится непосредственно справа, является квадратом стены, поэтому мы его игнорируем. То же самое касается и того, что чуть выше. Мы также игнорируем квадрат чуть ниже стены. Почему? Потому что вы не можете добраться до этого квадрата прямо с текущего квадрата, не пересекая угол ближайшей стены. Вам действительно нужно сначала спуститься, а затем перейти к этому квадрату, двигаясь за угол в процессе. (Примечание. Это правило обрезания углов необязательно. Его использование зависит от того, как расположены узлы.)

и - я выделил часть, которая меня смущает

Остаются пять других квадратов. Два других квадрата под текущим квадратом еще не находятся в открытом списке, поэтому мы добавляем их, и текущий квадрат становится их родителем. Из остальных трех квадратов два уже находятся в закрытом списке (начальный квадрат и тот, что находится чуть выше текущего квадрата, оба выделены синим цветом на диаграмме), поэтому мы их игнорируем. Кроме того, проверяется последний квадрат, расположенный слева от текущего квадрата, чтобы увидеть, не станет ли показатель G ниже, если вы пройдете через текущий квадрат, чтобы попасть туда. Нет кубиков. Итак, мы закончили и готовы проверить следующую клетку в нашем открытом списке.

Таким образом, автор предполагает, что F ( G + H ) непосредственно слева теперь больше, чем F справа внизу. Логически, посмотрев на это ДА, даже ребенок согласится, что вы должны идти к КРАСНОМУ, поэтому идите вниз и через СИНЮЮ стену, но математически (если нет чего-то очевидного, что я пропустил) я видеть это таким образом в этот момент

введите здесь описание изображения

Итак, если бы я писал этот алгоритм на C#, я бы застрял, потому что и слева, и снизу от «здесь и сейчас» будет возвращаться одно и то же число, 60? Как я узнаю, какой из них принесет мне наибольшую пользу?

Даже в этом сценарии число по-прежнему будет равно 60.

  • 10 идти прямо налево + 50 (H)

  • 10, чтобы пойти прямо вниз + 50 (H)

введите здесь описание изображения

Я что-то пропустил здесь? Что я делаю не так?


person Community    schedule 14.08.2014    source источник
comment
Быстрый ответ: нет, это не посылает вас в неправильном направлении. Что, если бы синий барьер был расширен на 100 клеток? Тогда восходящий путь является правильным решением. Помните, что в отличие от вас, который может видеть решение, алгоритм может смотреть только на соседние квадраты. Имея только это небольшое представление, он часто рассматривает другие пути, которые не кажутся человеку логичными.   -  person shawnhcorey    schedule 15.08.2014


Ответы (3)


Стоимость G суммируется.

Из начальной точки движение на юго-восток стоит 14. С юго-восточного квадрата (ваш квадрат «здесь и сейчас») движение на юг стоит 10, это составляет совокупную стоимость G 10 + 14 = 24.

Опять же, от юго-восточного квадрата (ваш квадрат «здесь и сейчас») движение на запад будет стоить 10 очков (G), что дает нам снова 24 (поскольку мы уже заплатили 14, чтобы добраться до этого квадрата). Но этот квадрат уже находится в вашем открытом списке, поэтому вы проверяете, лучше ли полученный результат. Ваш открытый список показывает G 10 для этого квадрата, и поскольку 24 хуже, вы не обновляете его. (вот что значит выделенное жирным шрифтом)

person kugans    schedule 14.08.2014
comment
Боже, о чем я думал - я только что перечитал твой ответ, он имеет смысл! Как я мог не увидеть это с самого начала... Большое спасибо за объяснение. - person ; 15.08.2014

Да вы что-то упускаете. Хотя я не уверен, что именно.

Отрывок, выделенный жирным шрифтом, относится к обновлению узла, который уже находится в открытом наборе.

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

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

Похоже, вы не знаете, что делать, если у вас есть два разных узла с одинаковой стоимостью. Это другая часть алгоритма, та, где вы добавляете узлы в открытый набор.

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

person n. 1.8e9-where's-my-share m.    schedule 14.08.2014

Это то, что, по вашему мнению, описывает алгоритм:

 ___ ___ ___ ___ ___
|   |   |xxx|   |   |  p = parent
|___|___|xxx|___|___|  c = current
| p |   |xxx|   | e |  e = end
|___\___|xxx|___|___|
| <---c |xxx|   |   |
|___|_|_|xxx|___|___|
|   | v |   |   |   |
|___|___|___|___|___|

Но вот что происходит на самом деле:

 ___ ___ ___ ___ ___
|   |   |xxx|   |   |  p = parent
|___|___|xxx|___|___|  c = current
| p |   |xxx|   | e |  e = end
|_|_\___|xxx|___|___|
| v | c |xxx|   |   |
|___|_|_|xxx|___|___|
|   | v |   |   |   |
|___|___|___|___|___|

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

Судя по описанию, следующий ход такой:

 ___ ___ ___ ___ ___
|   |   |xxx|   |   |  p = parent
|___|___|xxx|___|___|  c = current
| p |   |xxx|   | e |  e = end
|_|_\___|xxx|___|___|
| c |\  |xxx|   |   |
|_|_\_|_|xxx|___|___|
| v | v |   |   |   |
|___|___|___|___|___|

Что, как вы можете видеть, приведет к тому же выводу, что и угловой квадрат. На самом деле, стоимость движения сначала по диагонали или сначала вниз одинакова — требуется два шага в любом направлении, чтобы добраться до углового квадрата.

person slebetman    schedule 15.08.2014