Как смоделировать бой между двумя игроками? - PullRequest
1 голос
/ 26 марта 2011

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

Алгоритм:

  • Построить игровое дерево из всех возможных ходов для обоих игроков
    • gameДерево, вероятно, будет иметь ограниченную глубину
    • Каждый уровень будет принадлежать другому игроку
  • Использовать некоторые эвристики на листовых узлах, чтобы выяснить вероятность выигрыша для игрока, который должен сделатьдвигаться
  • распространять вероятности вверх (как это делает минимаксный алгоритм)
  • выбрать движение с наибольшей вероятностью
  • продолжить в начале этого алгоритма

Итак, в основном это минимаксный алгоритм.У меня есть несколько вопросов:

  1. Как принять во внимание фактор удачи?
  2. Когда я делаю один ход, мне нужно снова запускать весь алгоритм?(построение дерева с глубиной +1 и новым корневым узлом, вычисление новых вероятностей ...)
  3. Любая другая идея для симуляции битвы?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 марта 2011

Вам следует заглянуть в поиск по дереву Монте-Карло, он звучит так, как будто отлично вписывается в вашу проблему.

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

MCTS также является лучшим в настоящее время методом в GO игры, и в настоящее время лучше всего играет в игры с неизвестными правилами. Для дополнительного эффекта вы можете использовать агентов конечного автомата вместо случайных игроков, чтобы сделать вероятность более точной. Кроме того, вы можете уменьшить коэффициент ветвления с помощью решателя, который пропускает определенные ветви, используя эвристику, полученную из машинного обучения. (Но это то, что вы бы сделали последним, чтобы увеличить скорость техники)

Если вы можете использовать MinMax, вы можете делать MCTS без особых проблем :) А MCTS может играть в гораздо более сложные игры, чем MinMax, из-за его значительно уменьшенной сложности по сравнению. (Хорошо, если вы намерены постоянно расширять правила игры)

Посмотрите здесь, если вам интересно:

http://www.aaai.org/Papers/AIIDE/2008/AIIDE08-036.pdf

И да, вы должны делать это на каждом ходу для каждого игрока. Таким образом, и MinMax, и MCTS будут работать медленно; все методы дерева игр медленные

С MinMax вы можете сохранить часть своего дерева; переместитесь в ветку, которая является вашим новым состоянием, и удалите ее родителя и поддеревья, которые связаны с ним Затем разверните еще одну глубину в оставшемся поддереве. Но это предположение; У меня никогда не было времени, чтобы сделать это раньше :) (однако вы будете сохранять ошибки в своих расчетах вероятности)

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

2 голосов
/ 27 марта 2011

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

  1. В первой игре у каждого игрока есть 2 действия: огонь из ружья и удар мечом .В этой игре каждый шаг не влияет на другие шаги, поэтому создание дерева ходов здесь не имеет никакого смысла.Каждый игрок просто должен выбрать оружие и продолжать стрелять / ударять и кричать ' со щитом или на нем! ' до смерти или победы.
  2. Вторая игра также имеет третье действие - украсть щит противника .В этом случае перемещать дерево будет иметь больше смысла, поскольку совершенно очевидно, что если вы все равно решили украсть вражеский щит, то будет разумнее украсть его, прежде чем ударить мечом.

То, нужно ли вам это дерево ходов или нет, сильно зависит от ваших правил игры.

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

Требуется или нет пересчет всего дерева после каждого узла, зависит от того, сможете ли вы предсказать результат выбранного действия со 100%.Например, в шахматах вы можете предсказать, что если вы решили переместить пешку, то эта пешка обязательно переместится туда, куда вы решили.Это позволяет вам на каждом шаге брать выбранную ветку в дереве ходов и вычислять еще один ход для каждого сценария в нем вместо того, чтобы пересчитать полное дерево из ничего.Но это не применимо, если игрок может решить стрелять из пистолета, но из-за того, что ему не повезло, он выстрелит себе в ногу.

1 голос
/ 26 марта 2011

То, что вы просите, очень "обширно" ... но было сделано многими разработчиками.

Я бы посоветовал вам начать читать книгу об игровом дизайне, например: http://www.amazon.com/Game-Design-Practice-Wordware-Developers/dp/1556229127/ref=cm_cr_pr_product_top

... а также поискать в www.CodeProject.com и www.codeplex.com примеры реализации игр.

Удачи,

...