Как запустить MCTS в сильно недетерминированной системе?

Я пытаюсь реализовать алгоритм MCTS для ИИ небольшой игры. Игра представляет собой rpg-симулятор. ИИ должен решать, какие ходы играть в бою. Это пошаговая битва (стиль FF6-7). Движение не задействовано.

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

Игры заканчиваются, когда у одной из сторон нет живых юнитов (4 на 4). Это может занять любое количество ходов (также может никогда не заканчиваться). В вычислении урона и обработке умений много элемента ГСЧ (атаки могут попасть/промахнуться, нанести критический удар или нет, происходит множество проков, которые могут «срабатывать» или нет, баффы могут иметь процентное значение, чтобы произойти и т. д. ..). У юнитов есть около 6 навыков, чтобы дать представление о факторе ветвления.

Я создал предварительную версию MCTS, которая пока дает плохие результаты. У меня проблемы с несколькими вещами:

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

Некоторые предлагают определить информацию об игре и запустить для нее дерево MCTS, повторить процесс N раз, чтобы охватить широкий диапазон возможных состояний игры, и использовать эту информацию для принятия окончательного решения. В конце концов, время вычислений умножается на огромный коэффициент, поскольку нам приходится вычислять дерево MCTS N раз вместо одного. Я не могу полагаться на это, так как в ходе боя у меня есть тысячи элементов ГСЧ: дерево 2 ^ 1000 MCTS для вычисления, где я уже борюсь с одним, не вариант :)

У меня была идея добавить X детей для одного и того же хода, но, похоже, это тоже не приводит к хорошему ответу. Он немного сглаживает кривую ГСЧ, но может сдвигать ее в противоположном направлении, если значение X слишком велико или мало по сравнению с процентным соотношением конкретного ГСЧ. И поскольку я получил несколько ходов RNG par (изменение удара, шанс критического удара, процент срабатывания чего-либо и т. д.), я не могу найти приличное значение X, которое удовлетворяло бы всем случаям. Скорее плохая повязка, чем что-либо еще.

Аналогичным образом добавление 1 узла на кортеж RNG {попадание или промах, крит или нет, proc1 или нет, proc2 или нет и т. д.} для каждого хода должно охватывать все возможные ситуации, но имеет некоторые серьезные недостатки: только с 5 механизмами RNG это означает 2 ^ 5 узлов для рассмотрения для каждого хода, это слишком много для вычислений. Если нам удастся создать их все, мы можем присвоить им вероятность (связанную с вероятностью каждого элемента ГСЧ в кортеже узла) и использовать эту вероятность на этапе выбора. Это должно работать в целом, но очень тяжело для процессора :/

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

Есть ли у вас идеи, как подойти к этой проблеме?

Некоторые другие аспекты алгоритма ускользают от меня:

Я не могу выполнить полное воспроизведение до конечного состояния, потому что A) это займет много моего вычислительного времени и B) некоторые битвы могут никогда не закончиться (по замыслу). У меня есть 2 решения (которые я могу комбинировать): - Сделать случайное воспроизведение на X ходов - Использовать функцию оценки, чтобы попытаться оценить ситуацию.

Даже если я рассматриваю только очки здоровья для оценки, я не могу найти хорошую функцию оценки, которая возвращала бы надежное значение для данной ситуации (от 1 до 4 единиц для игрока и то же самое для монстров; я знаю их текущий хп/ максимальное значение). Что меня беспокоит, так это то, что бои могут сильно различаться по продолжительности / неравенству сил. Это означает, что иногда изменение ХП на 0,01% имеет значение (например, для долгой игры против босса), а иногда просто незначительное (когда игрок фармит низкоуровневую зону по сравнению с ним).

Разница в силе и HP между боями означает, что мой параметр Biais в процессе выбора UCB трудно исправить. в настоящее время я использую что-то очень низкое, например 0,03. Все, что > 0,1, и коэффициент исследования настолько высок, что мое дерево строится в глубину:/

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

Любая помощь приветствуется :)




Ответы (1)


Я думаю, что этот вопрос слишком широк для StackOverflow, но я дам вам несколько соображений:

  1. Использование стохастика или вероятности в поиске по дереву обычно называется поиском по ожиданию. Вы можете найти хорошее резюме и псевдокод для аппроксимации Expectimax с поиском по дереву Монте-Карло в главу 4, но я бы рекомендовал использовать обычный поиск по минимаксному дереву с расширением expectimax. Есть несколько модификаций, таких как Star1, Star2 и Star2.5, для лучшего времени выполнения (аналогично альфа-бета обрезка).

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

  2. 2 ^ 5 узлов за ход — это много, но не невозможно, особенно для небольшого количества ходов и неглубокого поиска. Даже поиск на 1-3 глубины должен дать вам какие-то результаты. В моем ИИ тетриса нужно рассмотреть около 30 различных возможных ходов, и я вычисляю результат трех следующих фигур (для каждой из возможных), чтобы выбрать свой ход. Это делается за 2 секунды. Я уверен, что у вас есть гораздо больше времени для расчетов, так как вы ждете ввода пользователя.

  3. Если вы знаете, какой ход игрока очевиден, разве он не должен быть очевиден и для вашего ИИ?

  4. Вам не нужно учитывать одно значение (hp), вы можете иметь несколько факторов, взвешенных по-разному, для расчета ожидаемого значения. Если я вернусь к своему ИИ тетриса, то у меня есть 7 факторов (неровность, самая высокая фигура, количество отверстий и т. д.), которые рассчитываются, взвешиваются и складываются вместе. Чтобы получить веса, вы можете использовать разные методы, я использовал генетический алгоритм, чтобы найти комбинацию весов, которая привела к очистке большинства строк.

person Sven    schedule 20.10.2015
comment
Спасибо за ответ! 1) Я пытался использовать логику expectimax, но количество RNG elt слишком велико для этого. У меня есть по крайней мере дюжина различных механизмов ГСЧ, и некоторые из них имеют большой диапазон значений. Я также буду добавлять больше по ходу игры. Таким образом, окончательное число RNG elt сделает мой номер узла Chance неконтролируемым. 2) у меня есть 1,5 секунды, чтобы вычислить ИИ - person mydi; 20.10.2015
comment
3) AI знает mvoe игрока, потому что игрок настроил свою собственную логику AI (небольшое количество операторов if/else). Я могу использовать его для сокращения вычислений, но это все. 4) я пробовал огромную функцию eval, и она была слишком сложной для управления. Пока я хотел бы найти что-то приличное только с Hp и улучшить его позже, если это необходимо. - person mydi; 20.10.2015
comment
Не могли бы вы рассказать немного о том, какой механизм ГСЧ вы используете? Что означает иметь большой диапазон значений? Например, вы имеете в виду, например, количество HP, наносимого атакой? В этом случае вы, вероятно, могли бы вычислить среднее значение вместо того, чтобы разветвлять дерево для каждого возможного числа. - person Sven; 20.10.2015
comment
Базовый урон оружия (не окончательный урон) находится между X-Y. Я мог бы усреднить это, но я потерял бы точность, так как мой ИИ был бы слеп к худшему/лучшему случаю. Другой фактор ГСЧ включает в себя: шанс попадания (да/нет), шанс критического удара (да/нет), шанс срабатывания (оглушение, молчание, замешательство...) [да/нет], шанс блока (да/нет), критический блок ( д, п), шанс сыграть дважды в этом ходу (д/н), шанс уклониться (д/н), шанс контратаковать при попадании (д/н), шанс отразить урон (д/н), шанс отразить заклинание (т/н)... И некоторые другие. Я добавлю больше, как я иду. Даже если я рассматриваю только двоичные (y/n), это все еще ***загрузка случайного узла 2 ^ X для создания:/ - person mydi; 20.10.2015