Path
Поиск пути в видеоиграх относится к тому, как ИИ идёт из A в B. Эта механика оказывает большое влияние на частоту кадров, построение обороны и дизайн крепости в целом.
Как это работает
В игре используется модифицированный алгоритм поиска A* (красивая визуализация) (подтверждение), который быстро вычисляет правильный путь между точками. Метод A * берет точку A и пытается быстро вычислить подходящий путь для достижения точки B. Этот путь не всегда является самым быстрым — в игре с такой сложной и постоянно меняющейся средой, как Dwarf Fortress, алгоритм редко выбирает самый быстрый путь. Цель и полезность алгоритма состоит в том, чтобы найти полезный путь, балансируя между скоростью и количеством вычислений.
При поиске материалов в первую очередь путь ищется к тем материалам, Манхеттенское расстояние[1] до которых будет наименьшим. Это гораздо менее затратно, чем вычислять полноценные пути ко всем материалам. Таким образом, при конструировании вещей список допустимых материалов будет упорядочен от ближайшего к самому дальнему; то есть первым делом проверяется расстояние от текущего положения дварфа до материала по горизонтали и вертикали, игнорируя диагональные перемещения и любые препятствия, которые могут оказаться на пути. Важная часть планирования крепости — строить как можно более открытые пространства; большее количество прямых путей приведет к более быстрым вычислениям (и, следовательно, к лучшей производительности), а также позволит избежать сложностей, когда по метрике объекты находятся рядом, а путь приходится искать через всю карту. Мастерские автоматически находят ближайшее доступное сырьё; а при строительстве вам доступен выбор, какой материал брать.
Применение
В примерах ниже: А — существо, В — его цель.
Для мастерских используется ближайший доступный материал, необходимый для работы. Простейший способ использовать это — окружить мастерскую складами, разрешив хранение только тех материалов, которые нужны. В предыдущих версиях это было единственным способом гарантировать создание предметов из конкретного материала или, например, только из магмостойчивых материалов. В текущей версии гораздо удобнее привязывать склады к мастерским. Однако это остается полезным для понимания того, почему ваш инкрустатор решил украсить пару крестьянских гробов из соседней мастерской каменщика, вместо того, чтобы украшать кровати со склада фурнитуры.
Понимание алгоритма поиска пути поможет вам должным образом спроектировать крепость. Для крепости важно быть отрытой настолько, насколько возможно, т.к. увеличение числа проходов делает пути короче, снижая затраты на их поиск, и помогает избежать побочного эффекта от использования Манхеттенского расстояния, когда Урист решает взять предмет из смежной комнаты, несмотря на то, что для этого ему придется обойти полкрепости, вместо того, чтобы взять такой же на другом конце комнаты (потому что без учета препятствий предмет в соседней комнате ближе).
С планированием безопасности несколько иначе: враждебные существа и дварфы, бегающие по делам, видят карту целиком, и с помощью алгоритма А* всегда найдут самый короткий маршрут. Поэтому путь каравана торговцев, направляющегося к торговой площади, отличается от гоблинской осады, ищущей кратчайший путь в крепость. На скриншоте справа продемонстрирован хитрый эксплоит, основанный на таком поведении: караваны всегда выберут петляющий верхний коридор, потому что в нем находится торговая площадь, тогда как вражеский отряд предпочтет более короткий нижний коридор, усеянный ловушками.
Выполняем вычисление
Если DF использует алгоритм A*, то для каждой клетки карты, обрабатываемой алгоритмом, рассчитывается стоимость пути через нее, получающуюся из информации о том, насколько эта клетка близка к конечной цели (используются эвристические функции, вроде метода Манхеттена) и ее значении траффика. Процесс поиска пути должен выглядеть примерно так:
- Сначала мы проверяем все соседние точке А клетки и рассчитываем их значения.
- Затем последовательно проверяем все свободные клетки, пока не достигнем точки B.
- Выбираем те из клеток, соединяющих А и В, которые имеют наименьшую стоимость.
- Теперь А может следовать к точке В.
Бесцельно скитающиеся существа могут использовать этот метод в комбинации со случайными перемещениями. Для работ, которые требуют преследования движущегося существа алгоритм будет повторяться снова и снова (или будет использован другой алгоритм).
В дополнение, незначительные вариации:
- Дварфы могут помнить путь, который работал раньше, и проверят его, прежде чем искать новый.
- Недоступные предметы могут быть невидимы для дварфов, будучи помеченными как forbidden через некоторое время после того, как дварфы узнают, что он недоступен. Таким образом, этот предмет не будет учитываться при поиске пути.
Советы по оптимизации
- Ставьте маленькие склады вплотную к мастерским. Это значит, что Уристу МакКрафтеру не придется долго искать путь к своему камню (хотя это может привести и к тому, что он будет искать еще дольше).
- Держите носильщиков в местах, где часто нужно таскать вещи (особенно рядом со складами, шахтами, скотобойней и другими мастерскими, которые производят на выходе большое количество предметов).
- Старайтесь, чтобы входы и выходы из зон мастерских было легко найти.
- Размещение лестниц в комнатах, а не в центре зон, значительно уменьшает время поиска пути.
- Грамотная разметка зон передвижения значительно уменьшает время поиска пути. Назначьте углам комнат высокую цену, а центрам важных проходов и комнат со складами — низкую.
Односторонние пути
Прочее
При необходимости существа подобные дварфам могут проходить сквозь друг друга. Однако перемещение по занятым тайла таким образом происходит намного медленнее, и дварфы будут пытаться двигаться по пути так, чтобы избежать этого. Это вводит важный момент в проектирование крепости.
Если у вас есть длинный коридор шириной в 1 клетку, по которому уже движется дварф, другие дварфы, которым нужно перейти с одной стороны коридора на другую, попытаются избежать столкновения с этим дварфом, пройдя путь в другом месте. Если так получится, что коридор длинный и поблизости нет альтернативных маршрутов, это может привести к очень значительному увеличению нагрузки при поиске пути.
По этой причине лучше всего делать маршруты с интенсивным движением шириной не менее 2 клеток и избегать одиночных дверей и одиночных лестниц. Это гарантирует, что когда дварф попытается найти обход вокруг другого дварфа на своем пути, он сможет сделать это легко и без значительного изменения своего текущего пути.
"Path" на других языках
|
Примечания
- ↑ Манхеттенское расстояние — простая сумма разностей по координатам и для трехмерной системы вычисляется по формуле:
|XA - XB| + |YA - YB| + |ZA - ZB|