Как лучше всего представить следующую ситуацию - агент ( @
) должен добраться до цели ( $
). Путь заблокирован рвом ( ~~~
). Доступны грабли (или другие устройства, например, ботинки для прогулки по воде), которые позволят пересечь препятствие.
.....~~~... . ground
...=.~~~... = rake
.....~~~.$. ~ water
.@...~~~... @ agent
.....~~~... $ goal
Как правильно найти путь от @
до, $
если нет сразу доступного пути? Должен ли мой путь иметь не только стоимость, но и предпосылки?
UPD : Проблема в том, что цель недоступна, а рейк - это лишь один из множества возможных объектов на карте. Тогда возникает вопрос: «Как заставить агента понять, что ему нужны грабли?»
ai
path-finding
zzandy
источник
источник
Ответы:
Я думаю о стеке целей, поиск пути должен быть аннотирован :
get $
$
- путь существует с необходимой способностью ходить по воде.get waterwalking
.get waterwalking, get $
get $
.$
- теперь у нас есть возможности и мы можем достичь цели.источник
Весь способ поиска пути - это просто поиск кратчайшего пути на графике. Чтобы решить вашу проблему, единственное изменение, которое вам нужно применить, - это добавить несколько дополнительных ребер (представляющих путь, по которому может пройти лодка) и выполнить простой алгоритм поиска пути. не имеет значения, используете ли вы BFS, Dijkstra или A *, просто реализуйте обычный алгоритм поиска пути с некоторыми дополнительными ребрами. для получения дополнительной информации о поиске пути на вики-странице проверки графа
источник
no path from @ to $
кgoto rake, bring it to water, place it, goto $
.Я бы сделал это с помощью какого-то решения дерева поведения - вы идете к цели и принимаете к сведению все препятствия, которые блокировали ваш A *. Если вы терпите неудачу, вы проверяете, есть ли объекты, которые могут помочь преодолеть эти препятствия, в этом случае путь к этому объекту. Повторение. Это означает, что агент должен попытаться найти путь к цели и потерпеть неудачу, прежде чем получить представление об использовании инструментов, хотя это может занять время, особенно если существует огромный мир плиток, которые необходимо проверить. Может показаться неуместным, что агенту нужно время, чтобы подумать, как решить проблему.
Однако я могу представить себе реальное, хардкорное решение. Добавьте другое измерение в вашу сетку поиска пути. Таким образом, в случае 2D-карты вы делаете сетку для поиска пути 3D. В этом простом примере это новое измерение будет иметь только глубину два, но в реальной игре оно быстро увеличится.
При z = 0 вы отображаете местность в обычных условиях, что означает, что водные плитки считаются непроходимыми.
При z = 1 вы отображаете местность в том виде, в котором она есть, имея грабли, что означает, что водяные плитки считаются пригодными для ходьбы (но если у вас есть, например, настенные плитки, они могут оставаться сплошными).
Нахождение пути - это обычный A * в измерениях x и y, означающий, что каждая ячейка сетки имеет доступ к своим соседям. В измерении z, однако, A * не допускается распространение.
Кроме того, где грабли. Грабли объект действует как отверстие между z = 0 и z = 1 в сетке поиска пути.
Это означает, что A * будет заполнять заливку в z = 0, попадать в воду и заканчиваться без вариантов - тогда он будет распространяться до z = 1 через грабли, и в z = 1 (где вода проходима) найти свой путь к цели. В результате NPC без колебаний перемещается к рейку, а затем перемещается по кратчайшему пути к цели.
источник