Эта статья является продолжением вот этого хабратопика. В этой части создания покерного бота мы поговорим об алгоритме принятия решений. В основном речь пойдет о стратегиях которые можно успешно применять и получать какой-то доход. Нужно понимать, что стандартные алгоритмы могут работать в плюс только на небольших лимитах, где встречается много игроков с очень неоптимальной игрой, которые готовы отдавать нам много денег. Для дальнейшего усовершенствования нужно вводить дополнительные элементы, которые принимают во внимание игроки более высоких лимитов используя статистику игроков.
Основы покерной математики
Покер во многом игра математическая. Особенно большую часть математика занимает в играх онлайн, потому что мы не видим оппонента, не можем использовать так называемые «телзы» — подсказки которые дает нам поведение игрока. Все наши решения основываются на предполагаемом диапазоне карт соперника и как стоит наша рука против этого диапазона.
Для определения прибыльности того или иного действия используем понятие математического ожидания в денежном эквиваленте, или EV (англ. — Expected Value). Оно определяется как сумма всех возможных исходов события выраженных в деньгах умноженных на вероятность этого события:
EV = X1($)*PX1 + X2($)*PX2 +… + Xn($)*PXn.
Для примера возьмем ситуацию: игра в безлимитный холдем с блайндами $1/$2, у нас в руках QQ и 200$ в стеке, у оппонента AK и 200$. Допустим на префлопе происходят такие действия: вы на малом блайнде (все до вас сбросились) повысили до $8, оппонент на большом блайнде еще повышает до $20. У нас есть 3 возможных действия: сброситься (фолд), уравнять (колл), повысить ставку (рейз). Для простоты расчетов примем что следующее повышение мы будем делать на весь стек, так называемый пуш. Рассчитаем EV каждого из действий.
EVфолда всегда равно нулю.
Для расчета EVуравн примем допущения: если на флопе будет А или К, то мы сразу играем чек/фолд; если нет, то мы играем чек, оппонент ставит (пусть будет $25), мы делаем повышение и оппонент сбрасывается. Получаем два события и вероятность выхода А или К на флоп — 32%.
EVуравн = (40$ — 12$ + 25$)*0,68 + (-12$)*0,32 = 32,2$.
Для расчета EV пуша примем что оппонент всегда готов играть на стек. Чтобы определить вероятности исхода каждого из событий, используем замечательную программу PokerStove (скачать можно здесь). Принцип ее работы довольно прост: учитывая заданные карты (конкретные или диапазоны карт) оппонентов, программа случайным образом раздает недостающие карты доски большое количество раз, и таким образом статистически получаются вероятности победы/ничьей для каждого оппонента в процентах. В нашем случае вероятность выигрыша QQ — 53,786% и 46,214% у AK. Получаем расчет EV:
EVпуша = 208$*0,53786 + (-192$)*0,46214 = 28,9$.
В итоге у нас положительное EV и для колла, и для пуша. Причем колл выгоднее, потому что в среднем будет приносить нам каждый раз 32,2$. Мы получили довольно упрощенный расчет на основе того что знали карты оппонента. В реальной игре мы не будем видеть карты оппонента и он может быть не один, что усложняет расчет EV. Для действий оппонентов в полном расчет будут учитываться три действия: фолд, колл, рейз; причем для каждой улицы. Поэтому количество слагаемых в расчете сильно увеличится. К тому же мы не сможем точно определить вероятность действий оппонента (как часто он будет рейзить, коллировать), но в любом случае EV — это общий параметр для определения выгодности того или иного действия.
Для простого алгоритма игры на микролимитах достаточно четко определить правила с какими картами стоит играть, а с какими нет. Сначала мы рассмотрим простейшие стратегии, которые могут быть достаточно легко алгоритмизированы, а затем порассуждаем как можно усовершенствовать принятие решений ботом с помощью дополнительных параметров и нестандартных приемов.
Стратегия коротких стеков
Одна из базовых стратегий – стратегия коротких стеков (Short Stack Strategy — SSS). Основные ее плюсы в том, что она достаточно простая, в основном представляет из себя точный алгоритм действий на каждый из вариантов розыгрыша; главный минус – маленький выигрыш. Вообще для определения прибыльности игры в покере применяется понятие винрейта, который измеряется в «ББ/100 рук» — количестве выигранных больших блайндов за 100 рук. Так для стандартной SSS средний винрейт составляет 2 ББ/100, хотя профессионалы этой стратегии используя дополнительные приемы могут доводить прибыль до 5 ББ/100 и больше. Не так давно в руме Pokerstars были выявлены аккаунты на которых играли боты и они использовали именно стратегию коротких стеков, подробности можно почитать здесь. Вообще выявить ботов довольно сложно, нужно иметь на них очень большую историю рук чтобы как-то доказать шаблонность их действий, поэтому неизвестно как много ботов играет сейчас в интернете.
Вкратце рассмотрим саму стратегию, подробное ее описание всегда можно найти на покерных сайтах. Само ее название происходит от того что в игру нужно входить с коротким стеком. Стандартной закупкой безлимитного холдема для считается 100 ББ, для SSS в игру нужно входить с 20 ББ. Причем если в стеке становится больше 30 ББ нужно выходить со стола, потому что стратегия становится неприбыльной; и если стек падает до 15 ББ нужно докупиться опять до 20 ББ. Маленький стек приводит к тому что часто игра заканчивается уже на флопе или максимум на терне, потому что после рейза на префлопе у нас остается только олл-ин или фолд на флопе. Поэтому стратегия очень простая и не нужно учитывать всех возможных вариантов развития действий на постфлопе.
Сама стратегия применяется за длинными (full ring) столами (9-10 человек), чем меньше людей за столом тем хуже для короткого стека, причем не выгодно играть против других шортстеков. Поэтому при выборе столов нужно смотреть на столы как минимум с 6-7 игроками с полным стеком.
Начало нашей стратегии — чарт стартовых рук (описания с какими руками стоит вступать в игру на префлопе, когда мы видим только две карты у нас в руках). Получаем точную таблицу действий на префлопе:
Где s — одномастные карты (suited), если буквы «s» нету, то подразумеваются карты и одномастные, и разномастные. Например, диапазон «77+, AJ+, ATs, KQs» включает — «AA, KK, QQ, JJ, TT, 99, 88, 77, AKs, AKo, AQs, AQo, AJs, AJo, ATs, KQs».
Давайте определимся с размерами ставок: мы повышаем на 4 ББ + 1 ББ на каждого лимпера (лимп – вход в игру на префлопе коллом). Например, при ББ = 0.1$ и двух лимперах перед нами мы, если хотим войти в игру рейзом, должны поставить 4*0.1$ + 2*0.1$ = 0.6$. Если до нас уже был рейз и мы хотим сделать ререйз, то его размер должен быть в 3 раза больше рейза + 1 рейз на каждого уравнявшего этот рейз. Например, при повышении на 0.4$ нам нужно ставить 1.2$. Еще есть правило: если размер нашей ставки составляет больше половины нашего стека, то нужно сразу идти ва-банк.
Мы разобрали действия на префлопе, теперь давайте определимся что мы должны делать с 3-мя открытыми картами на столе. Нужно продолжать ставить и играть при необходимости на стек с готовой рукой (топ-пара и лучше) и сильными дро-руками (когда не хватает одной карты до флеша или стрита). Также необходимо использовать продолженную ставку, но об этом приеме в последней части статьи.
В последнее время есть тенденция борьбы покер-румов с короткими стеками. На Full Tilt минимальный вход в игру составляет 35 ББ на стандартных столах и есть небольшое количество столов где можно играть с 20 ББ в стеке, где часто не выгодно играть по стратегии SSS из-за большого количество шортстеков за столами. Pokerstars разделили свои столы по минимуму-максимуму закупки на 20-50 ББ, 50-100 ББ. Но все равно во всех румах есть столы для игры с коротким стеком, а в более мелких покер-румах вообще нет таких ограничений, где можно успешно пользоваться этой стратегией.
Independent chip model (ICM)
ICM – это математическая модель которая применяется в играх Sit-n-go (СНГ) и успешно применяется в поздней стадии этих турниров, так называемый пуш-фолд. Обычно эта стадия наступает когда в стеке становится меньше 10 ББ и нет смыла вступать в игру рейзом или коллом, а есть только два варианта розыгрыша: пуш или фолд. В турнирах кроме EV (или chipEV, cEV) необходимо ввести понятие $EV – денежная стоимость EV (сколько стоят фишки в призовых деньгах), потому что в турнирах они не совпадают. Довольно четко это видно в начальной стадии, когда удвоение фишек (EV) никак не приведет к удвоению $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 на позиции малого блайнда с AT в руках, игрок А сбрасывает. Посчитаем какой ход выгоднее: пуш или фолд.
При фолде ничего не меняется и игрок B имеет все те же $EVфолд = $3,30.
При пуше есть три варианта:
- 1. Игрок C примет нашу ставку и проиграет. Допустим он будет коллировать с диапазоном: 88+, A9s+, AТo, KTs+, KQo (10% спектра), тогда проиграет он в 42% случаев. Вероятность такого исхода — 10%*42% = 4,2%, а $EVB после него составит $4.
- 2. Игрок С примет нашу ставку и выиграет. Вероятность этого исхода 10%*58% = 5,8%, а $EVB = $2.47.
- 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. Чем меньше блайндов в стеке, тем шире диапазон. Готовые таблицы стадии пуш-фолд можно найти и использовать на многих покерных сайтах, можно их принять за диапазоны среднестатистического игрока. А если хорошо поработать с этими диапазонами, то можно получить достаточно плюсового бота.
Совершенствование алгоритмов
Базовые алгоритмы — это основа для улучшенной стратегии, будет очень полезно разнообразить игру бота приемами, которые часто используют другие игроки и позволяют запутать соперника своими действиями. В целом поговорим о блефе, а точнее частных его случаях.
Продолженная ставка — ставка на следующей улице при проявлении агрессии на предыдущих (рейз, ререйз). Очень популярный прием, часто применяется на флопе если на префлопе мы повышаем хорошей картой (например АК), но не попали в доску и все равно делаем ставку, показывая что у нас хорошая карта (скажем высокая пара). Для бота, чтобы его игра не была слишком читаема, можно ввести продолженную ставку в 70-80% случаев. Размер ставки нужно выбирать таким же как и ставку с картами в руках, чтобы нельзя было определить блеф. Для продвинутой продолженной ставки можно выбирать подходящие для нее флопы. Т.к. цель этого приема — заставить сброситься оппонента, то нам нужно выбирать флопы в которые оппонент вероятнее не попал. Обычно это нескоординированный разномастный флоп, лучше с одной высокой картой (чтобы оппонент не хотел продолжать игру, если у него пара ниже), например A27, K35.
Агрессивный розыгрыш дро — вариант полу-блефа, когда мы можем получить комбинацию монстр на следующих улицах. Имеет смысл для двухстороннего стрит-дро (у нас QJ, на столе KT4 — туз и 9-ка дают нам стрит), флеш-дро (у нас AhTh, на столе 9h5h3c — любая чирва дает нам натсовый флеш) и любых монстр-дро. Прием выполняется в расчете на то что оппонент сбросится и даже при продолжении борьбы у нас есть шанс получить лучшую руку. При чем наш монстр будет замаскирован, потому что мы проявляли агрессию, когда еще не было возможности флеша или стрита. При программировании бота можно использовать этот прием, скажем, в 60-70% случаев.
Маскировка — здесь хотелось бы упомянуть о том как можно попытаться замаскировать поведение нашего бота. Определить программу по достаточной истории рук не так сложно — шаблонные действия на префлопе и постфлопе будут ее выдавать. Чтобы избежать этого можно ввести элемент случайности в выбор разыгрываемых карт. Например, если у нас в диапазоне есть розыгрыш пар JJ+, то можно играть валеты в 80% и, например, десятки в 20% случаев. Или варьировать варианты колла и рейза, скажем 50/50. Еще полезно иногда разыгрывать вообще случайные карты (как это бывает часто у людей), тогда нельзя будет выделить точный диапазон разыгрываемых карт и определить шаблонность действий.
Заключение
Мы рассмотрели с вами стратегию коротких стеков и ICM, потому что они довольно простые для описания. Есть более общая стратегия больших стеков для безлимитного холдема, но она включает гораздо больше ньюансов, потому что игра продолжается на терне и на ривере в отличие от ССС, и описание ее займет не одну статью. То же можно сказать и про лимитный холдем — стратегию игры не получится описать вкратце, но он даже больше подходит для алгоритмизации, потому что в нем большее (чем в безлимитном холдеме) значение играет математика. Поэтому при должном знании стратегии в лимитный холдем можно довольно успешно применять ее для составления алгоритма.
И все же не забывайте, что использование ботов и любых подобных программ, которые дают преимущество над другими игроками запрещено в любых покер-румах, поэтому не принимайте эту статью как руководство к действию.
Статья Pokeroff.ru специально для Хабрахабра