методы для ИИ для сильно стесненной пошаговой тактики

Я пытаюсь написать ИИ для игры в тактику в духе Final Fantasy Tactics или Vandal Hearts. Я никак не могу изменить правила игры, только обновить AI. У меня есть опыт программирования AI для классических настольных игр (в основном минимакс и его варианты), но я думаю, что фактор ветвления слишком велик, чтобы подход был разумным здесь. Я опишу игру и некоторые текущие недостатки AI, которые я хотел бы исправить. Я хотел бы услышать идеи применимых методов. Я достаточно приличный программист, поэтому мне нужны только идеи, а не реализация (хотя это всегда ценится). Я бы предпочел не тратить усилия на то, чтобы преследовать (слишком много) тупиков, так что, хотя спекуляции и мозговой штурм являются хорошими и, вероятно, полезными, я бы предпочел услышать от кого-то, кто действительно сталкивался с этим решением проблемы.

Для тех, кто это знает, игра - мини-игра наземного сражения в пиратах Сида Мейера! (2004), и вы можете пропустить /пропустить следующие два абзаца. Для тех, кто этого не делает, вкратце, как это работает. Бой пошатнулся и происходит на сетке 16x16. Существует три вида рельефа: ясный (без помех), лес (препятствует движению, дальние атаки и прицел) и скала (непроходимая, но не мешает атакам или зрению). Карта генерируется случайным образом с примерно равным количеством каждого типа местности. Потому что есть много камней и лесной плитки, движение, как правило, очень тесно. Это так важно. Местность не плоская; более высокая местность дает небольшие бонусы. Местность известна обеим сторонам. Игрок всегда атакующий, а ИИ всегда защитник, поэтому совершенно очевидно, что ИИ настраивает оборонительную позицию и просто ждет. Игрок выигрывает, убивая всех защитников или получая подразделение к городским воротам (плитка на другой стороне карты).

С каждой стороны очень мало единиц, обычно 4-8. Из-за этого крайне важно не наносить урон, не получая от этого никакого преимущества. Единицы могут принимать несколько действий за ход. Все устройства с одной стороны перемещаются перед любыми устройствами с другой стороны. Порядок исполнения важен, и чередование действий между подразделениями часто полезно. У единиц есть атаки ближнего и дальнего боя. Атаки ближнего боя сильно различаются по силе; атаки дальнего боя имеют одинаковую силу, но варьируются в диапазоне.

Основные проблемы, с которыми я сталкиваюсь, следующие:

  • Множество полезных комбинаций комбинаций начинается с «бесполезного» движения, которое не получает немедленного преимущества или даже не имеет преимуществ, чтобы в будущем создать мощную фланковую атаку. И, поскольку игровые подразделения сильнее и имеют более длинный диапазон, AI почти всегда должен иметь некоторые потери, прежде чем они смогут начать получать убийства. ИИ должен быть в состоянии смотреть вперед, чтобы различать жертвенные действия, которые обеспечивают будущую выгоду, и те, которые этого не делают.
  • Поскольку местность настолько ограничена, большая часть тактики сводится к достижению хорошего позиционирования с несколькими подразделениями, которые работают вместе, чтобы защитить область. Например, два защитника часто могут доминировать в узком проходе, располагая себя так, чтобы вражеский юнит, пытающийся пройти, должен был подвергнуться фланговой атаке. Но один защитник в одном и том же проходе был бы бесполезен, и три юнита могли защищать чуть больший проход. И т. Д. ИИ должен быть в состоянии выяснить, где игрок должен идти, чтобы добраться до городских ворот и как лучше всего расположить его несколько единиц, чтобы покрывать подходы, смещать, раскалывать или комбинировать их соответственно с движением игрока.
  • Поскольку фланговые атаки чрезвычайно смертельны (а инженерные фланговые атаки являются ключевыми для стратегии игрока), ИИ должен быть компетентен в перемещении своих подразделений, чтобы они охватывали фланги друг друга, если жертва подразделения не принесет существенной пользы. Они также должны иметь возможность нападать на фланговых атак на игроков, например, угрожая подразделением из двух разных направлений, так что ответ на одну угрозу предоставляет фланг другому.
  • AI должен атаковать, если это возможно, но иногда нет хороших способов приблизиться к позиции игрока. В этом случае ИИ должен уметь распознавать это и настраивать собственную защитную позицию. Но ИИ не должен быть уязвим для тривиального эксплойта, где игрок неоднократно открывает и закрывает дыру в его защите и стреляет в ИИ, когда он приближается и отступает. То есть, ИИ должен в идеале осознать, что игрок способен устанавливать прочную защиту области, даже если защита в настоящее время не установлена. (Я полагаю, что если бы существовал хороший алгоритм выделения единиц, как это необходимо для второй точки маркера, ИИ мог запустить его на игровых устройствах, чтобы увидеть, где они могут защищаться.)
  • Поскольку важно выбрать хороший порядок действий и чередовать действия между блоками, это не так просто, как просто найти лучший ход для каждой единицы по очереди.

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

Итак, есть ли у кого-нибудь конкретные идеи для техник, которые могут помочь усовершенствовать этот ИИ?

Обновление: я нашел связанный с этим вопрос в Stackoverflow: https: //stackoverflow.com/questions/3133273/ai-for-a-final-fantasy-tactics-like-game . Выбранный ответ дает достойный подход к выбору альтернативных действий, но, похоже, способность заглядывать в будущее и обнаруживать полезные жертвы от расточительных. Он также фокусируется на едином блоке за раз, и неясно, как его можно расширить для поддержки сотрудничества между подразделениями в защите или нападении.

5 голосов | спросил Adam M. 21 MaramFri, 21 Mar 2014 02:08:35 +04002014-03-21T02:08:35+04:0002 2014, 02:08:35

4 ответа


4

Вот как я хотел бы подойти к этому:

Я бы начал с выполнения анализа местности (pdf) и создание набора карт влияния на основе различных атрибутов ( карты конфликтов, карты ресурсов и т. д. ). Возможно, вы захотите объединить карты влияния вместе со связанными весами. Вероятно, вы обновите некоторые из них в начале каждого хода.

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

На высокоуровневом уровне вы можете использовать Utility- Основанной на системе , которая будет поддерживать состояние игры (включая анализ) и принять решение. Или у вас есть подготовленная нейронная сеть , которая принимает ту же информацию и выводит решение.

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

ответил pek 22 MarpmSat, 22 Mar 2014 22:00:04 +04002014-03-22T22:00:04+04:0010 2014, 22:00:04
1

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

Тогда. То, что я сделал бы, это реализовать контрольный список /наблюдение за чередой. Каждый блок ИИ, каждый оборот, будет:

  1. Сканирование карты на выгодные позиции (высокие площадки, узкие места и т. д.) либо в пределах диапазона, либо в глобальном масштабе, в зависимости от того, насколько вы умны /быстры, как вы хотите.
  2. Вычислите количество минимальных оборотов, необходимых для достижения этого места, и сравните это число с количеством поворотов, которые игрок должен будет использовать, чтобы добраться туда.
  3. Если ИИ должен решить двигаться, сканируйте ближайшее окружение. Если препятствия местности являются чисто статическими (горы, лес и т. Д.), То найдите самый быстрый маршрут. Если препятствия являются динамическими (другие ИИ или (я думаю)), проверьте, находится ли ИИ в пути, и если да, определите, собирается ли он двигаться. Если он движется в ближайшее время, подождите, иначе, обойдите.
  4. Для того, чтобы двигаться как команда, я бы использовал класс squad для класса /массива. Назначьте один отряд на фронт; если другой доступен, назначьте его сзади; если доступно другое, назначьте его стороне, ближайшей к ближайшему враждебному.

  5. Если для доступа к воротам отправлено одно устройство, отправьте один блок (или два, если вы хотите поразить игрока) из самого большого отряда.

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

ответил igrad 21 MaramFri, 21 Mar 2014 02:40:41 +04002014-03-21T02:40:41+04:0002 2014, 02:40:41
0

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

В моих собственных проектах в настоящее время я использую очень простой подход для определения ИИ:

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

Затем я повторяю каждую единицу. Для каждого подразделения я сопоставляю его возможные действия (включая пребывание на месте). Каждому ходу назначается утилита, в зависимости от ряда факторов (преимущества местности, могу ли я атаковать отсюда, стоимость перемещения туда, близость к врагу и т. Д.). Утилита местоположения также может быть задана путем факторинга, в котором «хорошие» местоположения находятся в пределах от него (например, или # 2 от igrad выше). Затем я сортирую по утилите и выбираю лучший ход (или случайным образом из числа лучших, в зависимости от уровня сложности).

Хитрость эффективного ИИ - это правильные константы полезности. Это очень зависит от этого, но когда он нажимает, он дает довольно эффективный ИИ - хотя и не очень креативный.

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

Два простых добавленных уточнения, которые я рассматриваю:

  • Сделайте два прохода над планированием устройства, чтобы избежать ситуации, когда устройство входит в предполагаемый путь другого устройства, тем самым блокируя его от взаимодействия.
  • Реализовать базовый стратегический уровень, который «заставляет» определенное движение основываться на стратегическом плане (например, обход слева /справа, двойная обтекаемость и т. д.). Разумеется, выбор стратегии будет ограничен территорией. По существу, стратегия будет влиять на функции полезности при работе с соответствующим сектором поля битвы (например, обходное право сделает все юниты на правом фланге приоритетными для быстрого продвижения в начале).
ответил Michael A. 20 PM00000010000004331 2014, 13:12:43
0

Очень сложный вопрос, но вот мои 2 цента.

Судя по вашему объяснению, в этой игре есть несколько широких движений, которые обычно желательны, такие как «взять верхнюю позицию» или «защитить фланги». Я думаю, что эта игра требует больше для части Artificial в термине «Искусственный интеллект».

Возможно, вы могли бы реализовать библиотеку движения, чтобы игрок делал такие движения более автоматическим способом (возможно, используя какую-то систему правил), а затем пусть minmax действует, когда нет очевидной оптимальной стратегии.

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

ответил angarg12 20 PM00000020000005031 2014, 14:54:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132