divs31, Извини, есть вопрос к расчетам, точнее к методике.
Вот у тебя есть какой-то расклад.
Назовем их (А):
--
АсТс9s
6h6c
и (В):
--
АсТс
6h6c9s
Ты формируешь последовательно игру на каждом подъеме отдельно (например приходит 3 карты, как-то их кладешь, потом еще 3 карты, их кладешь и так до конца)
или берешь 4*3 = 12 карт сразу и пытаешься их положить на линии?
Я пытался реализовать оба варианта.
Если используешь первый способ: как ты узнаешь лучших ход на каждом подъёме? Тоже Монте-Карло?
Jak, у меня есть так называемое "быстрое решение", т.е. оценка руки вот таким способом
Jak @ 20.04.26или берешь 4*3 = 12 карт сразу и пытаешься их положить на линии?
Основное решение - это берем все возможные расклады и для каждого считаем скажем 10000 раз. 10000 колод для всех одинаковые, дальше ход переходит к следующему игроку, ему сдаются на фронт карты, он их раскладывает по всем возможным комбинациям, оценивает быстрым решением, выбирает лучшее, ход переходит к следующему и так до конца. Не обязательно считать все расклады 10000 раз. Они все считаются параллельно и те расклады кто "сильно" отстают выкидываются.
divs31 @ 20.04.26Galax, Так мне надо не ранг 7 карт определить, а силу руки в конкретной ситуации, здесь нельзя переставлять карты произвольно. Переставлять только можно 2 в руке и 3 на флопе, порядок остальных важен. И мне не только надо определить скажем флеш у меня но и знать спарена ли доска, стритовая она пришел ли флеш с флопа, терна или на ривере и прочее, это важно для принятия решения. И всего таких ситуаций 10**9, поэтому запихать в 130Мб не получится.
Возможно ты не до конца понял как это работает.
Вот есть у нас 7 карт (5 на столе и 2 в руках). Мы вводим в массив эти 7 карт и получаем на выходе какое-то число, которое соответствует этим 7 карт. И предварительно мы расчитали всю нужную нам инфу, что делать с этими 7 картами.
По умолчанию там находится такая инфа - определяется какие лучшие 5 карт можно выбрать из этих 7 и определяется ранг такой комбинации. Повторюсь - никаких дополнительных рассчетов не нужно делать, там есть сразу наша комбинация по правилам холдема. У оппа тоже есть 7 карт (свои 2 в руке и общие 5 карт борда) и для него тоже сразу определяется лучшая комбинация (ранг его карт). Далее просто сравниваются эти два ранга - у кого больше, тот и выиграл.
Но ничего нам не мешает сделать предварительные расчеты для этих 7 карт и сохранить нужную инфу в этом массиве (одна ячейка 32 бита). Если нам нужно больше места чем 32 бита, то можно пойти еще дальше.
В этих конечных ячейках (где был раньше 32-битовый ранг карт) можно хранить индекс для другого массива (индекс, который соответствует 7 картам). А этот другой массив может хранить инфу любого размера, хоть какой-структуры.
Допустим нам нужно 8 байт для хранения такой инфы, тогда этот другой массив будет длиной не 130мб, а в два раза больше.
Что все равно намного меньше, чем 20 гб и нахождение этого индекса будет очень быстрым - 7 обращений в массив и 7 операций сложения).
Кроме этого в этом оригинальном массиве HR7, в узлах которые соответствуют 5 картам и 6 картам, тоже можно хранить инфу.
Т.е для флопа и терна можно тоже предварительно сделать расчеты и хранить их в этом массиве.
Когда мы попадаем в узел, который соответствует 5 картам, то следующие 52 ячейки содержат адреса соответствующие карте, которая придет 6-ой. Т.е. со смещением от 1 до 52 от этого адресса есть ссылки куда прыгать дальше. А вот в адрессе со смещением 0 - пока ничего нет. Поэтому в эту ячейку можно сохранить нужную инфу, которая относится к этим 5-ти картам.
Короче, это крутая идея как сжать огромный 7-ми мерный массив в одномерный массив разумного размера. А инфу можно там хранить любую. И доступ к этой инфе делается максимально быстро.
200К расчетов практически не изменили картины. точность +-0.03 AT или A9 на middle практически равны
divs31 @ 20.04.26ему сдаются на фронт карты, он их раскладывает по всем возможным комбинациям, оценивает быстрым решением, выбирает лучшее
Интересно как он "оценивает быстрым решением" если например всего 5+2=7 карт на линиях?
divs31 @ 19.04.26И тот же Gipsy по моему калькулятору учился
И Gipsy учился по калькулятору, который для оценки хода берет только, пусть даже не 10к, а 100к колод?
Это просто <0,0002% от всех вариантов. Даже если не будем играть за оппов, это примерно С(47,12)~5*10^10.
И еще каждый вариант можно положить от 6 до 9 разных случаев.
Аналогия из холдема. Мы имеем двух игроков. До флопа пошли в оллин. Вскрылись. У одно АКs, у другого 72о.
Вопрос: каковы шансы на победу первого? Каково его EV?
Сколько имеем вариантов флопов до ривера? С(48,5)=1712304. А с учетом, если нет флеш-дро, даже меньше.
Но пусть!
Мы возьмем 0,0002% флопов. Это ровно 3 раза. И на флоп 2 раза приходит 2!!!
Мы делаем вывод - 72о старше! EV AKs=33%. И говорим Gipsy: до флопа АКs - гавно, а вот 72о - крутяк!
divs31 @ 18.04.26я думаю что написал первый хороший калькулятор по китайскому покеру, если не в мире, то во всяком случае в России)). По нему обучались многие наши ведущие игроки за плату.
Galax, Да понял я как ты хранишь, только разница в том, что у тебя 30 млн ситуаций, а у меня 1 млрд. Ты какие-то ситуации воспринимаешь как одна и та же, а у меня они разные. Например рука AsKd стол 6d7d5sJhTh и такая же рука со столом 6d7c5sJhTh у тебя в одну ячейку попадет?
divs31, Да, для обычного холдема - это один и тот же ранг карт.
Я понял о чем ты. Типа в первом раскладе на флопе есть флеш-дро, а во втором - нет.
Не знаю правда, что с этой инфой делать, но не суть.
В принципе, можно составлять массив по своим правилам и эти две ситуации считать разными и далее ссылаться на разные ячейки памяти. Это довольно геморройно и финальный массив выйдет намного больше, но сжатие думаю будет все равно приличное. Но это если очень хочется заморочится. А если у тебя все нормально работает и держать 20 гб оперативки - это не проблема, то тогда игра не стоит свеч.
Вот для китайского покера ничего такого не нужно. И массив с 30мб со всем прекрасно справляется.
Jak @ 20.04.26Аналогия из холдема.
Никакой аналогии близко нет.
У нас есть миллиард пылинок. чтобы вычислить средний вес пылинки не надо взвешивать весь миллиард или близкое по порядку число. Достаточно взвесить 1000 вычисляя при этом дисперсию. Если дисперсия низкая(все пылинки примерно одинакового веса) то тысячи хватит за глаза.
а теперь у нас есть 1000 булыжников совершенно разного размера и ты высмеивая мой метод говоришь берем один булыжник это даже больше в пропорции чем в первом случае и вот он "средний вес" - ха-ха-ха. Дисперсия у тебя какая, когда ты взял три случая на флопе?
Про 5*10^10 это только про кол-во колод для одного игрока, если других не рассматривать.
А ведь еще и каждую колоду можно разложить до конца еще примерно 720к вариантами.
На первом подъеме положить из трех карт 2 девятью способами, потом взять другие 2 карты, потом остальные. Итого только тут 27 вариантов. Их надо как-то оценить и выбрать лучший.
А чтобы оценить, надо после каждого варианта спуститься на уровень ниже и это проделать еще три!!! раза!!!
Почему он решил, что "вот этот ход" - самый лучший?
И еще солвер успевает посчитать роялти оппонентов?
Миллиард пылинок имеет примерно одинаковые пылинки.
Возможно для некоторой точности не надо все взвешивать.
Но в китае пылинки размерами от молекулы до кирпича.
Очень легко положить скуп себе, а можно собрать фанту.
Вот и выходит, что имеем миллиард*миллиардов пылинок/кирпичей. Три больших куба, километр на километр на километр.
И те пылинки, которые ты возьмешь и взвесишь будут совсем разные. И их вес не обязательно будет равен весу для оценки веса всего куба.
Jak @ 20.04.26Писать-то я писал, потому и спрашиваю, потому что этот метод барахло.
Jak @ 20.04.26
Ты формируешь последовательно игру на каждом подъеме отдельно (например приходит 3 карты, как-то их кладешь, потом еще 3 карты, их кладешь и так до конца)
или берешь 4*3 = 12 карт сразу и пытаешься их положить на линии?
Я пытался реализовать оба варианта.
Теперь ты берешь первый вариант и используешь второй в качестве "быстрого решения". Потом берешь рассматриваешь те "быстрые решения", которые сильно расходятся с первым вариантом- "медленным" и правишь их так, чтобы это расхождение снизить, потом снова пересчитываешь и так несколько итераций - солвер готов! ))
Jak, так я же не зря приводил дисперсию
Jak, Справедливости ради, хочу стать на защиту нашего коллеги.
10К вариантов расчета вполне достаточно чаще всего. Если вы делаете несколько раз такие расчеты по 10К и каждый раз результаты выходят одни и теже (с отклонением в 0.1 куша от среднего), то можно считать что погрешность таких вычислений 0.1 куша и она нас устраивает.
Вот если бы результаты каждый раз были рандомными и гуляли туда-сюда на 1 куш и более, то тогда можно было бы говорить, что результат не релевантный.
В своем алгоритме я задаю к-во итераций в основном цикле и к-во итераций, которые делаю в каждом внутреннем цикле (когда нужно быстро выбрать наиболее вероятный расклад пришедших карт во внутренних циклах).
Обычно хватает таких параметров 2000 на 200.
Если есть очень близкие по ЕВ лучшие варианты, то тогда пересчитаю еще раз с параметрами 5000 - 500 или 10 000 - 1000.
Это займет больше времени, но результат будет более точным и погрешность не будет больше 0.1 куша.
Можно было бы дальше работать над распараллеливанием, покупать более мощные компы и т.д. Но я перестал этим заниматься и в будущем не собираюсь.
Врать не буду.
Моя прога не может точно посчитать стартер с учетом роялти оппов.
Но для 2-х и 3-х игроков если у оппов есть по 9 карт и у меня есть 7 карт + 1 в сбросе, мне дали второй подъем.
С этого момента я могу абсолютно точно! с учетом всех вариантов оппов и моих посчитать роялти для любого хода.
Считаю ВСЕ возможные варианты оппов и свои, сравниваю их и считаю роялти. Причем свои и варианты оппов меняются в зависимости от хода других.
Мои данные совпадают с солвером Олега. Совпадают не только по месту хода в списке, а по кушам.
Jak @ 20.04.26И еще солвер успевает посчитать роялти оппонентов?
Ну если ты все равно раскладываешь до конца, то это не трудно. Но вообще вычислительные мощности надо серьезные. Потому что "быстрое решение" не такое уж и быстрое)) Для игры в реальном времени, сначала использовали 2 компа, потом 4 сначала с 8-ядерными процами, потом 16
Galax, Так мне надо не ранг 7 карт определить, а силу руки в конкретной ситуации, здесь нельзя переставлять карты произвольно. Переставлять только можно 2 в руке и 3 на флопе, порядок остальных важен. И мне не только надо определить скажем флеш у меня но и знать спарена ли доска, стритовая она пришел ли флеш с флопа, терна или на ривере и прочее, это важно для принятия решения. И всего таких ситуаций 10**9, поэтому запихать в 130Мб не получится.