Как стать автором
Обновить

Покерная лаборатория закрывается, ловите исходники

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров15K

Я делал этот проект более полутора лет, сейчас отказываюсь от него. И, чтобы эти полтора года не были прожиты зря) открываю исходники. Java+Spring.

Принимайте проект «как есть», со всеми ad-hoc костылями, незаконченными исследованиями, TODOs, а также всевозможными KISS, DRY, и, как их… SOLID с GoF.

Предполагается, что вы знакомы с покером, имеете неплохие навыки программирования, поверхностно разбираетесь в теории игр.

Что представляет собой Продукт

Это конструктор покерных ботов. Что-то вроде no-code платформы. Вы собираете стратегию как пазл из кусочков. Всего пазлов около 3500. Пазлы «двойные» – вы можете настроить частоты как по типам действий, так и размерам ставок.

Срины с фронта
Так можно задать вручную частоты типов действий для первого слова на префлопе на 6-макс столе. Синий - FOLD, зелёный - CHECK/CALL, красный - ALLIN, желтый - BET/RAISE
Так можно задать вручную частоты типов действий для первого слова на префлопе на 6-макс столе. Синий - FOLD, зелёный - CHECK/CALL, красный - ALLIN, желтый - BET/RAISE
Так задаются частоты по размерам ставок для той же ситуации на префлопе
Так задаются частоты по размерам ставок для той же ситуации на префлопе
Аналогично и для постлопа. Так задаются частоты для флопа, в ситуации «на двоих», когда на руках две оверкарты, и при этом на столе лежит ничего не значащая пара
Аналогично и для постлопа. Так задаются частоты для флопа, в ситуации «на двоих», когда на руках две оверкарты, и при этом на столе лежит ничего не значащая пара

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

Вот карточка статистик первой попавшейся модели
Фича с типом стритовости руки имеет наибольший вес
Фича с типом стритовости руки имеет наибольший вес

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

Что представляет собой Приложение

Технически, это Java+Spring приложение, с одним GraphQL контроллером. Через контроллер создаются датасеты и боты, конфигурируются стратегии ботов, запрашиваются подсказки.

Ключевые компоненты

Класс HoldemHandStrengthCalculator умеет считать винрейты для заданных ренжей игроков.

Пакет engine содержит абстракции покерной раздачи, игрока. Особое внимание на класс PokerEngine – это конечно-автоматная логика определения ситуации в покерной раздаче.

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

Пакет spark, а, конкретно, PipelineUtils, умеет строить ML модели – деревья принятия решений.

Инстансы класса Solution и есть стратегия бота, оформленная в виде справочника с ключами в виде спота и значениями типа Advisor. Spot – это, своего рода, расширение покерной ситуации, в которую добавлены сведения о руке героя или текущем стеке. Advisor – это интерфейс для пазлов, принимающих решение в конкретном споте.

Важный сервис – selfplay. Он предоставляет возможность сыграть созданными стратегиями между собой и выгрузить текстовые хенд-хистори в clickhouse, откуда потом они могут быть импортированы в сторонние средства анализа игры.

 Всем удачи!

Теги:
Хабы:
+20
Комментарии19

Публикации

Работа

Data Scientist
45 вакансий
Java разработчик
176 вакансий

Ближайшие события