Online poker bot software | for Texas Holdem and Omaha

Online poker bot software | for Texas Holdem and Omaha Конструкторы

Что есть покер?

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

Всего в покере десять комбинаций: Роял-флеш, Стрит-флеш, Каре, Фулл-хаус, Флеш, Стрит, Сет/Трипс/Тройка, Две пары, Одна пара, Старшая карта.Существует много разных видов покера. Здесь мы будем рассматривать Texas Holdem No Limit Poker, он же турнирный покер.

Основы покерной математики

Online poker bot software | for Texas Holdem and Omaha

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

Смотрите про коптеры:  Некроиды недооценены  — Игры от Paradox на DTF

Для определения прибыльности того или иного действия используем понятие математического ожидания в денежном эквиваленте, или EV (англ. — Expected Value). Оно определяется как сумма всех возможных исходов события выраженных в деньгах умноженных на вероятность этого события:

EV = X1($)*PX1 X2($)*PX2 … Xn($)*PXn.

Для примера возьмем ситуацию: игра в безлимитный холдем с блайндами $1/$2, у нас в руках QOnline poker bot software | for Texas Holdem and OmahaOnline poker bot software | for Texas Holdem and OmahaOnline poker bot software | for Texas Holdem and OmahaOnline poker bot software | for Texas Holdem and Omaha

EVфолда всегда равно нулю.

Для расчета EVуравн примем допущения: если на флопе будет А или К, то мы сразу играем чек/фолд; если нет, то мы играем чек, оппонент ставит (пусть будет $25), мы делаем повышение и оппонент сбрасывается. Получаем два события и вероятность выхода А или К на флоп — 32%.

EVуравн = (40$ — 12$ 25$)*0,68 (-12$)*0,32 = 32,2$.

Что говорят люди?

Тема ПБ волнует многих. Её обсуждают практически на всех сайтах, форумах и блогах. Поэтому, в существовании ботов сложно сомневаться. Пессимизма прибавляет тот факт, что их создателями могут являться профессиональные хакеры, имеющие солидные познания в покере Техасский Холдем.

Стоимость покер ботов приличная, поэтому существует огромный риск потерять вложенные деньги. Так почему же сами создатели не пользуются покерными ботами, если они такие прибыльные? Здесь можно дать массу ответов, но наиболее близок к истине следующий: покерные румы ведут борьбу с ботами и накладывают жёсткие санкции на тех, кто их использует.

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

Monica

Архитектура
Архитектура

Monica.client

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

Scan Engine – Блок который парсит в рантайме экран каждые 0.1 сек. По косвенным признакам понимает когда у него решение, сравнивает по заранее нарезанным координатам картинки,  по алфавиту(который набивается для каждого рума отдельно, человеком) определяет имена деньги ставки и всю необходимую инфу.

Keyboard API mouse API – для ввода данных используется аппаратный эмулятор(там есть и клавиатура и мышь), работает через длл(написана на C ), имеет строгое API, оттестирован, работает мгновенно. На данный момент боты с такой технологией уже не создаются, мы перешли на новое поколение ввода информации, но старые продолжают работать без банов. Новое решение позволяет больше не устанавливать никаких программ на компьютере где находится PokerRoom.

API мыши и клавиатуры есть и программные тупо по winAPI. (не используются нигде только, если не ошибаюсь одна функция есть в 888).

Monica.proxy

Это основной блок системы. По сути является прокси-сервером, который обеспечивает взаимодействия клиента и AI. В основном весь проект написан на C#, есть немного С в ядре. Прокси осуществляет взаимодействие со всеми участниками процесса кроме покер рума(далее ПР).

Client API – фактически это набор контроллеров, в который на вход подаётся (JSON или XML) из нашего протокола. Мы передаем с клиента название функции, которая должна дать ответ и параметры. В момент обработки запроса, если все удачно произошло, вызывается нужная функция на сервере, а там уже происходит выполнение той или иной команды. Грубо говоря(RPC).

ORM – основная база где хранится вся история действий клиента который был подсоединен 

к серверу использует MySQL. Сама ORM Devexpress. Используем DTO(DAL) подход. База с PostgreSQL пополняется сторонними программами, такими как PT4 и HoldemManager. Из неё просто тянем процедурами конкретные параметры. Вообще база postgresql становится архаизмом, так как изначально бот играл сессии только располагав столы стопкой, что не позволяло видеть рантайм картину за всеми столами одновременно. Сейчас у нас разрабатывается отдельный модуль мониторинга, который закроет эту задачу.

Monica.reader

Алгоритм моделирования

  1. Раздать случайные карты игрокам;
  2. Положить случайные карты на стол (если на столе еще не пять карт);
  3. Сравнить свою комбинацию с комбинациями других игроков;
  4. Если наша комбинация лучшая, то прибавляем к количеству выигранных раундов 1/<количество игроков с такой же комбинацией>;
  5. Повторяем шаги 1-4 нужное количество раз;
  6. Вероятность выигрыша равна <кол-во выигрышных раундов>/<общее кол-во раундов>. К коду я приложил unit-тесты, так что можно сразу проверить работоспособность всех методов.

Вирусы

Бесплатные или стоящие очень дешево программы, которые гордо называются покер ботами. Это по сути своей вирусы, которые могут не просто причинить вред вашему компьютеру, но и украсть ценную информацию на нем хранящуюся. Степень убытков зависит исключительно от фантазии создателя.

Дорогие покер боты

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

История развития игровых ботов

Наибольшую известность среди покерного сообщества снискали следующие боты: Полярис, Клаудико, Векс Бот, Нео Покер Бот, Тартаниан7, Цефей и Libratus. Теперь скажем пару слов о некоторых из популярных ПБ.

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

В 2023 году вышел еще один бот – Цефей. Разработчики так прокомментировали дебют программы: «Вам не превзойти Цефей, даже если вы играете покер ежедневно по 12 часов на протяжении всей жизни». Однако, группа хорошо подготовленных покеристов легко справилась с данной программой.

Еще одна новинка – Тартаниан7. Покер робот должен был стать лучшим в безлимитном холдеме, но пока большими успехами похвастаться не может. Недавно состоялся показательный турнир, в котором Тарантиан7 играл против профессиональных покеристов. Итог – победа профессионалов. Что еще раз доказывает бесперспективность приобретения ботов.

Как обнаружить и обыграть бота?

Обнаружить покерного бота можно с помощью следующих признаков:

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

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

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

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

Кодируем расчет вероятности

На данный момент можно найти множество библиотек для расчета вероятности выигрыша. Есть как бесплатные, так и платные версии. А мы изобретем свой велосипед. Почему? Чтобы разобраться в этом вопросе детальнее и из-за желания сделать полностью своего бота.

Замечания по кодированию карт:

Всего 52 карты = 4 масти x 13 карт каждой масти. Масть текущей карты = <порядковый номер карты>/4 (/ — целочисленное деление).

Достоинство текущей карты = <порядковый номер карты> (% остаток от деления). Собственно, у нас должно быть 10 функций по определению комбинации. Назовем их так:

isHighCard, isOnePair, isTwoPair, isSet, isStraight, isFlush, isFullHouse, isQuads, isStraightFlush, isRoyalFlush.

Объединяет эти функции следующее — на входе подается набор карт, а на выходе — число от -1 до 12, где -1 — комбинация не найдена, от 0 до 12 — старшая карта в комбинации. 0 это двойка, 1 — тройка, и так до 12 — туз. Масть не важна. Набор карт может быть любой длины — от 1 до 7.

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

Чтобы оптимизировать определение комбинаций, мы сделаем следующее:

  1. Упорядочим комбинации по убыванию достоинства карт;
  2. Разделим входной массив карт на три: массив с достоинствами карт, массив с мастями карт и массив с количеством карт каждой масти.

Эти действия будет выполнять функция sortHand. Входной параметр — массив hand, в котором хранится список карт. Выходные параметры — массивы card (достоинства карт), suite (масти карт), suiteCount (количество карт каждой масти). В первой части функции происходит простая сортировка заменой (можно заменить ее на быструю сортировку).

Тут есть маленький нюанс — сортируются не сами карты, а их достоинства. Чтобы узнать достоинство карты, нужно узнать остаток от деления на 13. Дальше, если достоинства карт одинаковы, то проверяем, чтобы карты с большим порядковым номером (карты, у которых номер масти больше) были «левее» карт с меньшим номером.

Легальность софта

Давайте перенесёмся в прошлое, и представим себе Дикий Запад середины 19-го века. Каждая игровая комната – отдельный штат во главе с шерифом. Покерные боты в данном случае, как грабители – борьба с ними ведётся, но не так эффективно, как хотелось бы жителям.

Математическая сторона принятия решений в покере

Формула принятия решений в покере чрезвычайно проста: p*pot = win, где p — вероятность выигрыша с текущими картами (на руках и на столе), pot — размер банка на момент принятия решения, win — выигрыш, который мы получим, если будем разыгрывать множество партий с этими картами.

Если win < bet_cur, то Fold

Если bet_cur SB > win >= bet_cur, то Call (или Check)

Если win >= bet_cur SB, то Raise (или Bet)

bet_cur — это все деньги, которые мы положили в банк за текущую игру (НЕ только за один круг торговли), плюс те деньги, которые нужно сейчас поставить.Пояснения к bet_cur:

Если на первом круге торговли мы поставили всего $10, а на втором круге мы должны поставить $5, и в этот момент мы принимаем решение, то bet_cur равно $15 (10 5). SB (Small Blind) — размер малого блайнда «(первая ставка вслепую — прим. ред.)». Это значение прибавляется к bet_cur во втором условии, так как мы можем увеличивать ставку только на число, кратное малому блайнду.

Следовательно, если win > bet_cur, но при этом win < bet_cur SB, то увеличивать ставку нам не выгодно, так как пришлось выставить bet_cur SB. BB (Big Blind) – размер большого блайнда.Стоит также добавить, что эта формула может использоваться только в компьютерной игре — в жизни за столом вряд ли будет возможность самому вычислять вероятность выигрыша и все это считать.

Название карт в покере

Карта записывается двумя латинскими символами. Первый символ — достоинство карты, второй — масть. Карты от 2 до 9 так и записываются. T — десять (хотя иногда и просто 10), J — валет, Q — дама, K — король, A — туз. Трефы — c, пики — s, бубны — d, червы — h.

Как видно из кода, сначала функция складывает карты на руках и карты на столе в один массив, потом сортирует его, а далее по порядку определяет комбинации.

Определение идет от сильнейшей комбинации (флеш-рояль) к слабейшей (старшая карта). Чтобы комбинации отличались друг от друга, они имеют область действия — набор значений карт, находящихся в этой комбинации. Так, комбинации High card (старшая карта) соответствуют значения от 0 до 12, где 0 — это High card со старшей «двойкой», а 12 — со старшим тузом. А комбинации «пара» соответствуют значения от 13 до 25, где 13 — «пара» со старшей «двойкой», а 25 — со старшим тузом.

И, наконец, сделаем функцию для опреде ления вероятности выигрыша (getProbabilityOfWin). Параметры этой функции следующие: свои карты, карты на столе (если есть) и количество игроков. Далее все просто — раздаем случайные карты остальным игрокам, выкладываем карты на стол (если их еще нет или не хватает) и проверяем комбинации.

Маленькое замечание по моделированию: карты игрокам лучше выдавать случайно, а не мешать колоду, а потом выдавать, так как в первом случае будет быстрее.

Насколько реально найти работающий экземпляр покерного бота?

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

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

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

Вот тут-то и возникает нестыковка: все эти люди трудятся не ради того, чтобы вы в итоге могли заниматься мелким надувательством, обманывая казино. Согласны?

О законности создания покер-ботов

По законам РФ и других государств создание и использование покер-ботов (и ботов для других игр) не запрещено. А по правилам всех известных мне покер-румов — запрещено.Что это значит? Если ты попался на использовании бота, то самое страшное, что тебе грозит — это бан аккаунта и списание с него всех средств. Все.

Объяснение формулы

Из этой формулы мы получаем математическое ожидание выигрыша (в нашей формуле это win). Иначе говоря, разыгрывая много раз игру с такой вероятностью (с такими же картами у нас на руках и на столе) и таким банком, мы получим такой выигрыш. Следовательно, чтобы оставаться в плюсе, мы должны ставить не больше этого выигрыша (на рисунке это bet1).

Если поставим больше, то окажемся в минусе — выиграем меньше, чем будем ставить (на рисунке это bet2). Стоит сделать замечание к формуле — так как покер-румы берут комиссию с каждого банка, то нужно размер банка уменьшить на величину этой комиссии. Формула с комиссией будет такова:

p*pot*0,91 = win

Очень дорогие конструкторы

Они уже могут применить за игровым столом базовую стратегию и сыграть «в ноль» или даже в минимальный плюс. Поведения за игровым столом может быть изменено путем внесения изменений на каком-то из языков программирования или при помощи специальных скриптов.

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

Они мгновенно приспособятся к стилю игры покерного робота и камня на камне не оставят от вложенного стека (или даже банкролла). Да и расширение возможностей таких программ – довольно хлопотное дело.

Даже добавление пары-тройки новых параметров, которые бы усилили их игру будет стоить очень многих усилий – как финансовых, так и временных. В итоге становится понятно, что цель не оправдает вложенные в это средства. А заниматься невыгодными проектами никакой здравомыслящий бизнесмен не будет.

Покерная программа deepstack обыгрывает профессионалов один на один

Дерево решений программы DeepStack в хедс-апе (игре один на один) безлимитного холдема на префлопе и флопе

Пионер современной теории игр Джон фон Нейман говорил: «Реальная жизнь вся состоит из блефа, из маленьких приёмов обмана, из размышлений о том, каких действий ожидает от тебя другой человек. Вот что представляет игра в моей теории» (цитата из 13-й серии документального сериала «Возвышение человечества»).

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

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

Учёные давно пытаются разработать программу, которая бы могла обыгрывать человека в безлимитном Texas Holdem. В отличии от других применений слабого ИИ, здесь успешная разработка окупится мгновенно, потому что ежедневно в онлайновых покер-румах разыгрывают банки на миллиарды долларов.

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

Раньше ИИ добивался некоторого успеха только при игре в лимитный холдем, самый примитивный вариант игры с ограниченным шагом повышения ставок. В лимитном варианте у игрока есть всего лишь 1014 вариантов развития. Для сравнения, в безлимитном холдеме таких вариантов уже 10160. Кстати, в игре го вариантов развития 10170, но там игра с полной информацией, то есть принципиально более простая задача.

Игры с неполной информацией требуют совершенно более сложного уровня рекурсивного мышления, чем игры с полной информацией. Здесь правильное действие ИИ зависит в том числе от информации, которую ИИ получил от действий оппонента. Но информация, которую выдал оппонент, в свою очередь, является производной функцией от предыдущих действий ИИ и той информации, которую ИИ своими действиями выдал оппоненту. Это и есть рекурсивное мышление, с которым имеет дело программа DeepStack. И справляется она очень неплохо, судя по результатам игр с профессионалами (см. таблицу).

Результаты программы в хедс-апах с профессиональными игроками

Архитектура программы DeepStack показана на иллюстрации. Программа переоценивает свои действия на каждом этапе, когда от неё требуется принятие решения. Для расчёта вэлью каждой ставки используется дерево предвидения (lookahead tree), значения для подветок которого вычисляются с использованием нейросети, заранее обученной на случайных игровых ситуациях.

Структура нейросети демонстрирует, что на входе подаётся размер банка, открытые карты и диапазоны игроков (возможные комбинации, с которыми игрок мог войти в игру таким образом, каким он в неё вошёл (колл, рейз, 3-бет и т.д.), вероятность каждой комбинации). Нейросеть состоит из семи полностью соединённых скрытых слоёв. Выходные значения затем обрабатываются другой нейросетью, которая проверяет, что действия удовлетворяют ограничению на нулевую сумму.

Особенностью программы является то, что она активно сопротивляется анализу своей стратегии со стороны оппонента. Другими словами, программа использует равновесие Нэша — ключевое понятие теории игр. Под равновесием Нэша подразумевается набор стратегий, котором ни один участник не может увеличить выигрыш, изменив свою стратегию, если другие участники своих стратегий не меняют. С точки зрения антагонистической игры в покер основной задачей DeepStack является поиск равновесия Нэша, то есть минимизация возможности эксплуатации своей стратегии другим игроком для получения им прибыли. Абсолютно все разработанные до сегодняшнего дня покерные программы легко эксплуатировались после прощупывания их стратегии с помощью техники LBR (local best-response) — см. недавний обзор самых современных ботов для покера.

Так вот, DeepStack совершенно не эксплуатируется с помощью LBR. Вкупе с реальными результатами, которые показал бот в игре с профессионалами, остаётся только один вопрос: зачем разработчики опубликовали информацию об этой архитектуре в открытом доступе?

Научная работа опубликована 6 января 2023 года на сайте arXiv.org, где выкладываются статьи до выхода в официальном журнале.

Группой разработчиков руководит профессор информатики Майкл Боулинг из Университета Альберты (США).

Кафедра покерных ботов в Университете Альберты (Computer Poker Research Group) создана ещё в 90-е годы, первым созданным здесь ботом был Loki в 1997 году. Потом были Poki (1999), PsOpti/Sparbot (2002), Vexbot (2003), Hyperborean (2006), Polaris (2007), Hyperborean No-Limit (2007), Hyperborean Ring (2009), Cepheus (2023) и, наконец, венец творения — DeepStack.

В ближайшее время программу DeepStack проверят в играх с более опытными профессионалами, которые гораздо выше уровнем, чем ребята из таблицы в начале статьи. Начиная с этих выходных программа будет играть на турнире в питтсбургском казино, куда ожидается приезд нескольких профессионалов мирового класса. За 20 дней DeepStack должна сыграть около 120 000 рук. Это достаточно много, чтобы довольно точно оценить качество программы.

На данный момент DeepStack сыграл 44 852 руки против профессионалов добровольцев, отобранных Международной федерацией покера. Игроки получали денежные призы за хорошую игру (первый приз $5000 CAD), так что люди играли в полную силу. Тем не менее, программа в хорошем плюсе.

Примечание о теории вероятности

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

Принятие решений в покере

Как правило, во время каждого хода игрок может принять три решения: Fold, Call, Raise. Есть еще All-in — когда денег для продолжения игры нет, и придется поставить все. Существует множество алгоритмов принятия решений: DIVAT анализ, дерево решений, различные эмпирические алгоритмы (кстати, большинство из этих алгоритмов используют вероятность выигрыша). Мы будем использовать в принятии решений беспристрастную математику, а точнее — теорию вероятности.

Простая схема покер-бота

Из каких блоков будет состоять наш робот? Рассмотрим по пунктам:

  • Logic — Блок логики принятия решений (Fold, Call, Raise)
  • Negotiator — Блок взаимодействия с программой для игры в покер;
  • Statistics — Блок обработки и накопления статистики по игрокам.

Из Negotiator в Logic поступает информация о текущих действиях на столе. Из Logic в Negotiator — информация о своих действиях, которые нужно совершить (сделать Fold, Call или Raise). Из Negotiator в Statistics — информация о действиях игрока за столом для последующей обработки и хранения. Из Statistics в Logic — информация о статистических данных игроков.

Реальные покер боты, которые работают

Первым покерным роботом можно считать проект «Orac», которым занимался Майк Каро. Он представил свое детище в 1984 году на очередном турнире WSOP. При этом уже тогда многие специалисты удивились довольно высокому уровню игры машины.

Но самым известным проектом является, вероятно, Polaris от CPRG – «The University of Alberta Computer Poker Research Group». Программа способна показывать хорошие плюсовые результаты в хедз-апах по лимитированному Техасскому Холдему.

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

Совершенствование алгоритмов

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

Продолженная ставка — ставка на следующей улице при проявлении агрессии на предыдущих (рейз, ререйз). Очень популярный прием, часто применяется на флопе если на префлопе мы повышаем хорошей картой (например АК), но не попали в доску и все равно делаем ставку, показывая что у нас хорошая карта (скажем высокая пара).

Для бота, чтобы его игра не была слишком читаема, можно ввести продолженную ставку в 70-80% случаев. Размер ставки нужно выбирать таким же как и ставку с картами в руках, чтобы нельзя было определить блеф. Для продвинутой продолженной ставки можно выбирать подходящие для нее флопы. Т.к. цель этого приема — заставить сброситься оппонента, то нам нужно выбирать флопы в которые оппонент вероятнее не попал.

Агрессивный розыгрыш дро — вариант полу-блефа, когда мы можем получить комбинацию монстр на следующих улицах. Имеет смысл для двухстороннего стрит-дро (у нас QJ, на столе KT4 — туз и 9-ка дают нам стрит), флеш-дро (у нас AhTh, на столе 9h5h3c — любая чирва дает нам натсовый флеш) и любых монстр-дро.

Прием выполняется в расчете на то что оппонент сбросится и даже при продолжении борьбы у нас есть шанс получить лучшую руку. При чем наш монстр будет замаскирован, потому что мы проявляли агрессию, когда еще не было возможности флеша или стрита. При программировании бота можно использовать этот прием, скажем, в 60-70% случаев.

Маскировка — здесь хотелось бы упомянуть о том как можно попытаться замаскировать поведение нашего бота. Определить программу по достаточной истории рук не так сложно — шаблонные действия на префлопе и постфлопе будут ее выдавать. Чтобы избежать этого можно ввести элемент случайности в выбор разыгрываемых карт.

Например, если у нас в диапазоне есть розыгрыш пар JJ , то можно играть валеты в 80% и, например, десятки в 20% случаев. Или варьировать варианты колла и рейза, скажем 50/50. Еще полезно иногда разыгрывать вообще случайные карты (как это бывает часто у людей), тогда нельзя будет выделить точный диапазон разыгрываемых карт и определить шаблонность действий.

Функция определения силы комбинации

int getCombination(int[] hand, int[] board) {int[] allCard;if ((board == null) || (board.length == 0)) {allCard = new int[hand.length];System.arraycopy(hand,0,allCard,0,hand.length);} else {allCard = new int[hand.length board.length];System.arraycopy(hand,0,allCard,0,hand.length);System.arraycopy(board,0,allCard,hand.length,board.length);}int[] card = new int[allCard.length];int[] suite = new int[allCard.length];int[] suiteCount = new int[4];

sortHand(allCard, card, suite, suiteCount);if (isRoyalFlush(card, suite, suiteCount) != -1) {return 117;}int result = isStraightFlush(card, suite,suiteCount);if (result != -1) {return 104 result;}result = isQuads(card);if (result != -1)

{return 91 result;}result = isFullHouse(card);if (result != -1) {return 78 result;}result = isFlush(card, suite, suiteCount);if (result != -1) {return 65 result;}result = isStraight(card);if (result != -1)

{return 52 result;}result = isSet(card);if (result != -1) {return 39 result;}result = isTwoPair(card);if (result != -1) {return 26 result;}result = isOnePair(card);if (result != -1) {return 13 result;}return isHighCard(card);}

Далее сделаем функцию, которая возвращает абсолютную силу карточной комбинации (я назвал ее getCombination). Всего таких разных по силе комбинаций будет 118: девять комбинаций со старшими картами (по 13 старших карт в каждой комбинации), и одна комбинация без старшей карты (флеш-рояль, в котором старшая карта — всегда туз) — 9×13 1=118.

Хотя в комбинации «две пары» может быть только 12 старших карт (двойка в этой комбинации не может являться старшей), чтобы не нарушать порядок, мы это не учитываем. Эта функция нужна для последующего удобного сравнения комбинаций между собой — она возвращает число, и чем оно больше, тем сильнее комбинация.

Функция сортировки массива карт

void sortHand(int[] hand, int[] card,int[] suite, int[] suiteCount) {for (int i = 0; i < hand.length; i ) {for (int j = 0; j < hand.length – 1; j ) {int t;if (hand[j] % 13 < hand[j 1] % 13) {t = hand[j 1];

hand[j 1] = hand[j];hand[j] = t;}if ((hand[j] % 13 == hand[j 1] % 13) &&(hand[j] < hand[j 1])) {t = hand[j 1];hand[j 1] = hand[j];hand[j] = t;}}}for (int i = 0; i < hand.length; i ) {card[i] = hand[i] % 13;suite[i] = hand[i] / 13;suiteCount[suite[i]] ;}}

Рассмотрим алгоритмы определения комбинаций (код приводить не буду, так как он достаточно тривиален и его всегда можно найти на диске):

isHighCard

Возвращаем первую карту массива.

isOnePair

Ищем две одинаковые карты, идущие подряд, и возвращаем достоинство этих карт.

isTwoPair

Ищем две одинаковые карты, идущие подряд, ищем еще две одинаковых карты и из двух достоинств этих карт возвращаем максимальное.

isSet

Ищем три одинаковые карты, идущие подряд, и возвращаем достоинство этих карт.

isStraight

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

isFlush

Проверяем, чтобы было пять карт одной масти, и возвращаем достоинство старшей карты этой масти.

isFullHouse

Ищем три карты одного достоинства и еще две одинаковые карты. Возвращаем достоинство трех карт.

isQuads

Ищем две карты одного достоинства, идущие подряд. Возвращаем достоинство этих карт.

isStraightFlush

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

isRoyalFlush

Проверяем, чтобы в комбинации были Туз, Король, Дама, Валет, 10, 9 одной масти. Возвращаем 12 (порядковый номер достоинства туза).

Кстати, еще можно оптимизировать определение комбинации — совместить проверку нескольких комбинаций в одной функции (например, проверку на две пары и пару), изменить кодирование (представление) карт в программе, перенести эти функции на C и скомпилировать в native библиотеку и т.д.

Вывод

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

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

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

Заключение

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

Independent chip model (icm)

ICM – это математическая модель которая применяется в играх Sit-n-go (СНГ) и успешно применяется в поздней стадии этих турниров, так называемый пуш-фолд. Обычно эта стадия наступает когда в стеке становится меньше 10 ББ и нет смыла вступать в игру рейзом или коллом, а есть только два варианта розыгрыша: пуш или фолд.

В турнирах кроме EV (или chipEV, cEV) необходимо ввести понятие $EV – денежная стоимость EV (сколько стоят фишки в призовых деньгах), потому что в турнирах они не совпадают. Довольно четко это видно в начальной стадии, когда удвоение фишек (EV) никак не приведет к удвоению $EV.

Дальше небольшая врезка со скучной математикой ICM, кому не интересно, могут пропустить этот раздел.

В ICM для расчета $EV – ожидаемого дохода игрока с учетом текущего количества фишек, используется следующий способ: вычислятся вероятность с который игрок займет определенное место, потом каждая из вероятностей умножается на денежный эквивалент за это место и суммируется. Вероятность занять первое место определяется как соотношение кол-ва фишек игрока и всех фишек в турнире. Для наглядности будем использовать пример: в СНГ-турнире на 10 человек, стоимостью 10$ (распределение призов между первыми 3-мя местами: 5$, 3$, 2$) осталось 3 игрока со стеками: А=7500, B=4500, C=3000 (для простоты и наглядности расчетов не будем учитывать что блайнды уже поставлены и не находятся в стеках игроков). Таким образом вероятность занять первое место для игрока B:

PB1 = VB/(VALL) = 4500/(7500 4500 3000) = 30%.

Для определения вероятности игроком B занять 2-е место, нужно определить ее для случая, если выиграет игрок А (РА1 = 50%) и если выиграет игрок С (РС1 = 20%) и просуммировать их. При этом стек победителя не учитывается:

PB2 = PA1 * PB2,C3 PC1 * PB2,A3 =

= 0,5 * 4500 / (4500 3000) 0,2 * 4500 / (4500 7500) = 0,395 = 39,5%.

Получаем PB3 = 1 – PB1 – PB2 = 1 – 0,3 – 0,395 = 0,305 = 30,5%.

Итак $EVB = PB1 * V1$ PB2 * V2$ PB3 * V3$ =

= 0,3 * $5 0,395 * $3 0,305 * $2 = $3,30.

Теперь, когда мы знаем как рассчитывать $EV мы можем определять выгодность нашего хода. Уточним наш пример — игрок B на позиции малого блайнда с AOnline poker bot software | for Texas Holdem and OmahaTOnline poker bot software | for Texas Holdem and Omaha в руках, игрок А сбрасывает. Посчитаем какой ход выгоднее: пуш или фолд.

При фолде ничего не меняется и игрок B имеет все те же $EVфолд = $3,30.

При пуше есть три варианта:

  1. 1. Игрок C примет нашу ставку и проиграет. Допустим он будет коллировать с диапазоном: 88 , A9s , AТo, KTs , KQo (10% спектра), тогда проиграет он в 42% случаев. Вероятность такого исхода — 10%*42% = 4,2%, а $EVB после него составит $4.
  2. 2. Игрок С примет нашу ставку и выиграет. Вероятность этого исхода 10%*58% = 5,8%, а $EVB = $2.47.
  3. 3. Игрок С сбросится в 90% случаев и EVB останется равным $3,30.

Получаем итог $EVпуш с учетом всех возможных исходов:

$EVпуш = 0,042 * $4 0.058 *$2,47 0,9 * $3,295 = $3,28. Т.е. наша доля в турнире после этого пуша в итоге уменьшится, получается он невыгоден. На самом деле разница незначительная, поэтому можно назвать этот пуш пограничным, т.е. с лучшими руками нам это делать выгодно, а с худшими нет. В расчетах не учитывались блайнды, чтобы не путать лишними цифрами, а был понятен сам принцип расчета.

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

Например, для 9-10 ББ можно принять диапазон пуша из ранней позиции: 77 , AJs, AQo, KQs; а колла: TT , AQ. Чем меньше блайндов в стеке, тем шире диапазон. Готовые таблицы стадии пуш-фолд можно найти и использовать на многих покерных сайтах, можно их принять за диапазоны среднестатистического игрока. А если хорошо поработать с этими диапазонами, то можно получить достаточно плюсового бота.

Оцените статью
Радиокоптер.ру
Добавить комментарий