Материалы к соревнованию Sberbank Holdem Challenge http://sberbank.ai
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
PyPokerEngine
examples
images/python
scripts
.gitignore
GUIDE_CPP.md
README.md
RULES.md
SUBMISSION.md
Tutorial_TournamentData.ipynb
example_game_replay.json
simulator_stdin_example.jsonlines

README.md

Sberbank Holdem Challenge

Описание игры

Игра, в которую необходимо будет играть ботам — наиболее популярная разновидность покера, Безлимитный Техасский Холдем (No-limit Texas Hold’em).

Участникам предстоит реализовать агента, который будет играть в покер. Из агентов участников будут формироваться игры и турниры, по итогам которых будут определяться лучшие стратегии.

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

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

Программирование стратегий

Документация по подготовке ботов к отправке в систему

Симуляция игры в покер происходит при помощи библиотеки PyPokerEngine.

Пример простого бота на языке Python, который каждый раз совершает операцию CALL:

from pypokerengine.players import BasePokerPlayer

class FishPlayer(BasePokerPlayer):

    def declare_action(self, valid_actions, hole_card, round_state):
        call_action_info = valid_actions[1]
        action, amount = call_action_info["action"], call_action_info["amount"]
        return action, amount

    def receive_game_start_message(self, game_info):
        pass

    def receive_round_start_message(self, round_count, hole_card, seats):
        pass

    def receive_street_start_message(self, street, round_state):
        pass

    def receive_game_update_message(self, action, round_state):
        pass

    def receive_round_result_message(self, winners, hand_info, round_state):
        pass

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

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

Отборочный этап хакатона

Для участия в отборочном этапе хакатона, необходимо реализовать и отправить в тестирующую систему архив с кодом своей стратегии. Информация о формате отправки будет доступна 1 сентября.

Ежедневно в 00:00 MSK проводится турнир между всеми отправленными в систему ботами. Если участник отправил несколько агентов, то учитывается только его последнее решение.

Во время турнира каждый бот играет 30 игр со случайными соперниками — ботами других участников. Таблица результатов строится по убыванию средней суммы оставшихся фишек у бота по итогам всех игр за турнир.

В турнирной игре принимают участие ровно 9 ботов. Максимальное число раундов — 50. В начале игры каждый бот получает 1500 фишек, размер малого блайнда — 15.

Это соответствует следующим параметрам раунда в PyPokerEngine:

config = setup_config(max_round=50, initial_stack=1500, small_blind_amount=15)

Анализ реплеев игр

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

Пример файла с реплеем игры: example_game_replay.json.

Реплеи игры записываются в виде JSON-объекта с полями:

  • rule: параметры игры
  • seats: информация о ботах, в частности для каждого бота указано его имя name — это имя соответствует участнику, отправившему бота
  • rounds: список всех раундов с указанием действий, совершенных ботами

Подходы к созданию стратегий

Существует несколько подходов в разработке стратегий для покерных роботов.

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

Более эффективной является эксплуатационная стратегия, которая разделяет оппонентов на кластеры и против каждого кластера реализуется контр-стратегия. Большинство хороших игроков в покер используют именно такой подход. Но, в отличие от человека, у компьютера есть преимущество в том, что он может перебрать огромное кол-во исходов игры и при правильном прогнозировании поведения соперников принять максимально выгодное решение с точки зрения математического ожидания. Для прогнозирования поведения оппонентов в таком случае может хорошо помочь сбор статистики игр в прошлых матчах и реализация алгоритмов машинного обучения. Правда, перебрать все возможные исходы событий в большинстве игровых ситуаций не получится даже у мощных компьютеров, поэтому нужно использовать алгоритмы оптимизации, к примеру Monte Carlo Tree Search.

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

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