Path

Материал из Dwarf Fortress Wiki
Версия от 15:37, 25 ноября 2014; 149.126.168.203 (обсуждение) (→‎Как это работает: Про алгоритмы явно не сведущие люди писали...)
Перейти к навигацииПерейти к поиску


Поиск пути в видеоиграх относится к тому, как ИИ идёт из A в B. Существует несколько способов поиска пути, но в этой теме приведены серьёзные аргументы, что ToadyOne использует модифицированный метод A*.

Как это работает

Большая часть этого текста - догадки, и предполагает скорее функциональное объяснение, чем точное описание.

Алгоритм A* - один из наиболее эффективных алгоритмов поиска кратчайшего пути из точки А в точку B, однако в первую очередь он пытается проверить существование путей, ведущих к цели по прямой, и скорость его работы сильно зависит от того, насколько реальный кратчайший путь отличается от пути по прямой. Например, если кратчайший путь в точку B начинается с нескольких шагов в противоположную от точки B сторону, то алгоритм А* будет работать не слишком эффективно. Красивая визуализация.

При поиске материалов в первую очередь путь ищется к тем материалам, Манхеттенское расстояние[1] (расстояние городских кварталов) до которых будет наименьшим. Это гораздо менее затратно, чем вычислять полноценные пути ко всем материалам. То есть первым делом проверяется расстояние от текущего положения дварфа до материала по горизонтали и вертикали, игнорируя диагональные перемещения и любые препятствия, которые могут оказаться на пути. Так строится список доступных при строительстве материалов.

Применение

В примерах ниже: А - существо, В - его цель.

Применение механизма поиска пути в целях безопасности

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

Понимание алгоритма поиска пути поможет вам должным образом спроектировать крепость. Для крепости важно быть отрытой настолько, насколько возможно, т.к. увеличение числа проходов делает пути короче, снижая затраты на их поиск, и помогает избежать побочного эффекта метода Манхеттена, когда Урист решает взять предмет из смежной комнаты, несмотря на то, что для этого ему придется обойти полкрепости, вместо того, чтобы взять такой же на другом конце комнаты (потому что без учета препятствий предмет в соседней комнате ближе).

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

Выполняем вычисление

Если DF использует алгоритм A*, то для каждой клетки карты, обрабатываемой алгоритмом, расчитывается стоимость пути через нее, получающуюся из информации о том, насколько эта клетка близка к конечной цели (используются эвристические функции, вроде метода Манхеттена) и ее значении траффика. Процесс поиска пути должен выглядеть примерно так[2]:

  1. Сначала мы проверяем все соседние точке А клетки и рассчитываем их значения.
  2. Затем последовательно проверяем все свободные клетки, пока не достигнем точки B.
  3. Выбираем те из клеток, соединяющих А и В, которые имеют наименьшую стоимость.
  4. Теперь А может следовать к точке В.

Бесцельно скитающиеся существа могут использовать этот метод в комбинации со случайными перемещениями. Для работ, которые требуют преследования движущегося существа алгоритм будет повторяться снова и снова (или будет использован другой алгоритм). В дополнение, незначительные вариации:

  • Дварфы могут помнить путь, который работал раньше, и проверят его, прежде чем искать новый.
  • Недоступные предметы могут быть невидимы для дварфов, будучи помечеными как forbidden через некоторое время после того, как дварфы узнают, что он недоступен. Таким образом, этот предмет не будет учитываться при поиске пути.

Советы для повышения скорости нахождения пути

  • Ставьте маленькие склады вплотную к мастерским. Это значит, что Уристу МакКрафтеру не придется долго искать путь к своему камню (хотя это может привести и к тому, что он будет искать еще дольше).
  • Держите носильщиков в местах, где часто нужно таскать вещи (особенно рядом со складами, шахтами, скотобойней и другими мастерскими, которые производят на выходе большое количество предметов).
  • Страрайтесь, чтобы входы и выходы из зон мастерских было легко найти.
  • Размещение лестниц в комнатах, а не в центре зон, значительно уменьшает время поиска пути.
  • Грамотная разметка зон передвижения значительно уменьшает время поиска пути. Назначьте углам комнат высокую цену, а центрам важных проходов и комнат со складами - низкую.

Примечания

  1. Манхеттенское расстояние - простая сумма разностей по координатам и для трехмерной системы вычисляется по формуле:
    |XA - XB| + |YA - YB| + |ZA - ZB|
  2. Для более глубокого изучения алгоритма стоит прочитать статью Патрика Лестера Алгоритм A* для новичков.