Я делал этот проект более полутора лет, сейчас отказываюсь от него. И, чтобы эти полтора года не были прожиты зря) открываю исходники. Java+Spring.
Принимайте проект «как есть», со всеми ad-hoc костылями, незаконченными исследованиями, TODOs, а также всевозможными KISS, DRY, и, как их… SOLID с GoF.
Предполагается, что вы знакомы с покером, имеете неплохие навыки программирования, поверхностно разбираетесь в теории игр.
Что представляет собой Продукт
Это конструктор покерных ботов. Что-то вроде no-code платформы. Вы собираете стратегию как пазл из кусочков. Всего пазлов около 3500. Пазлы «двойные» – вы можете настроить частоты как по типам действий, так и размерам ставок.
Срины с фронта



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

Третьим типом пазлов является игра по контрстратегии. Мне не удалось до конца отточить контрстратегию, поэтому вариант пока не поддержан. Построение контрстратегии является крайне сложным с точки кодинга и очень затратно с точки зрения вычислений. В последнее время я работал над классом GameTreeGenerator, который строит покерное дерево исходя из собранной статистики на оппонента. Требует существенных доработок.
Что представляет собой Приложение
Технически, это Java+Spring приложение, с одним GraphQL контроллером. Через контроллер создаются датасеты и боты, конфигурируются стратегии ботов, запрашиваются подсказки.
Ключевые компоненты
Класс HoldemHandStrengthCalculator умеет считать винрейты для заданных ренжей игроков.
Пакет engine содержит абстракции покерной раздачи, игрока. Особое внимание на класс PokerEngine – это конечно-автоматная логика определения ситуации в покерной раздаче.
Пакет holding содержит описатели руки героя. Описатели рассчитываются в HoldingEvaluator. Описатели являются ключевыми факторами принятия решения в раздаче и формируют существенную часть в общем наборе фичей.
Пакет spark, а, конкретно, PipelineUtils, умеет строить ML модели – деревья принятия решений.
Инстансы класса Solution и есть стратегия бота, оформленная в виде справочника с ключами в виде спота и значениями типа Advisor. Spot – это, своего рода, расширение покерной ситуации, в которую добавлены сведения о руке героя или текущем стеке. Advisor – это интерфейс для пазлов, принимающих решение в конкретном споте.
Важный сервис – selfplay. Он предоставляет возможность сыграть созданными стратегиями между собой и выгрузить текстовые хенд-хистори в clickhouse, откуда потом они могут быть импортированы в сторонние средства анализа игры.
Всем удачи!