Ускорить расчет раскладов в покере... ID:23702 |
Вт, 6 апреля 2004 11:01 [#] [») |
|
|
Приветствую.
Это отчасти продолжение темы начатой мной еще на www.poker.ru
Нужна идея как ускорить расчет покерных раскладов с помощью таблиц. На данный момент считается все по формулам комбинатроники. Третий оптимизированный варинат считает обмен 5 карт на 1 боксе за 6 секунд (Первый варинат считал за 2 суток, второй за 2,5 минуты ). Это все на Athlon XP 2200+
Что хранить в таблицах? Делал прикидки, получается большой объем данных.
Жду.
|
|
|
Я использую такой алгоритм ID:23710 ответ на 23702 |
Пт, 9 апреля 2004 09:40 («] [#] [») |
|
|
Комбинации дилера считаются по комбинаторным формулам для начальной позиции и для некоторых критических вариантов обмена. Для комбинации Туз-Король учитывается 3-я карта. Для остальных комбинаций учитывается только один номинал - для пары это номинал пары, для 2-х пар номинал старшей пары и т.д. Все флеши считаются одинаковыми. Эти числа запоминаются и потом используются для сравнения с комбинациями игрока. Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам, так же как и комбинации дилера. Этот алгоритм в некоторых ситуациях дает значительную ошибку в оценке, но при выборе хода ошибки редки и все они недорогие.
Время оценки одной позиции 0,001c
Миллион раздач за 17 мин.
Для оценки игры типа "Обмен 1,2,5 за анте" (преимущество на 1-ом боксе около 3%, на втором около 5%)хватает выше крыши.
А потом, когда дело доходит до разработки выигрышной стратегии можно и более точные алгоритм использовать. Там 1-2 сек. на позицию - вполне сносный результат.
|
|
|
Re: Я использую такой алгоритм ID:23711 ответ на 23702 |
Сб, 10 апреля 2004 07:15 («] [#] [») |
|
|
А можно считать АБСОЛЮТНО точно. Анализ одной руки 0.000001с или миллион рук в секунду.
Готов обсудить продажу алгоритма с заинтересованными лицами. ДОРОГО.
|
|
|
Коровин, опубликуйте, пожалуйста, какой-нибудь абсолютно точный результат ID:23712 ответ на 23702 |
Сб, 10 апреля 2004 10:00 («] [#] [») |
|
|
Ну, скажем, для игры с обменом 1, 2 или 5 карт за анте, две пары оплачиваются 1,5 : 1, два бокса с параллельным обменом на боксах.
|
|
|
Re: Я использую такой алгоритм ID:23714 ответ на 23702 |
Сб, 10 апреля 2004 19:31 («] [#] [») |
|
|
Приветствую!
Еще раз повторю, мне нужна всего лишь идея. Остальное додумывается самостоятельно в автономном режиме.
Мой алгоритм позволяет с помощью одной и той же процедуры считать обмен 0..5 карт при открытых 0..5 карт дилера. Только медленно.
Алгоритм следующий. Задаем 5 карт игрока. Задаем открытую карту дилера. По формулам комбинатроники определяем комбинации дилера. Затем по формулам комбинатроники считаем сколько раз проиграет данный расклад игрока дилеру. Сколько раз выиграет. Ну и до кучи считаем ничьи. При заданных оплатах за комбинации, считаем МО.
Если проводим обмен 1..5 карт, то алгоритм будет следующим. Убираем из начального расклада игрока 1..5 карт, добираем в цикле недостающие карты. Получаем новый расклад к которому применяется приведенный выше алгоритм. Суммируем МО каждого расклада и делим на число таких раскладов при обмене.
Например, обменять 1 карту игрока можно 5 способами. Пусть у нас первый бокс и открыта 1 карта дилера.
Меняем 1 карту в первой позиции расклада игрока. Всего возможно 52-1-5=46 обменов. Получаем 46 новых раскладов игрока и значений их МО. Затем меняем карту во 2,3,4 и 5 позиции расклада игрока.
Выбираем лучшее значение МО и, соответственно, позиции обмена.
Обменять 5 карт можно всего одним способом. Возможных новых комбинаций игрока С(46,5)=1370754. Мой алгоритм считает около 2 минут. Тормоза из-за того, что необходимо посчитать МО для 1370754 новых раскладов.
Какие данные надо предварительно насчитать и запомнить, чтобы ускорить расчет обмена 5 карт? Обмен 5 карт рассматриваю в том плане, что он самый требовательный к скорости расчета.
2 Ivan
Quote: | Комбинации дилера считаются по комбинаторным формулам для начальной позиции и для некоторых критических вариантов обмена. Для комбинации Туз-Король учитывается 3-я карта. Для остальных комбинаций учитывается только один номинал - для пары это номинал пары, для 2-х пар номинал старшей пары и т.д. Все флеши считаются одинаковыми. Эти числа запоминаются и потом используются для сравнения с комбинациями игрока. Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам, так же как и комбинации дилера. Этот алгоритм в некоторых ситуациях дает значительную ошибку в оценке, но при выборе хода ошибки редки и все они недорогие. | Продолжу тройка и фул учитывается номинал тройки. Стрит (стритфлэш, рояль) - старшая карта. Так?
Можно чуть подробнее про "Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам".
Как ты считаешь возможные комбинации игрока по формулам комбинатроники?
Смущает вот что. Обмен 5 карт у игрока. Можем посчитать по формулам комбинатроники сколько комбинаций различного типа может быть из оставшихся 46 карт у игрока. Затем, посчитать сколько возможных комбинаций дилера. А вот как теперь найти МО обмена?
2 Korovin
Quote: | А можно считать АБСОЛЮТНО точно. Анализ одной руки 0.000001с или миллион рук в секунду.
Готов обсудить продажу алгоритма с заинтересованными лицами. ДОРОГО. | Готов бесплатно выслушать идею. Т.к. скорость и точность расчета просто потрясают.
|
|
|
Постараюсь поподробнее ID:23715 ответ на 23702 |
Сб, 10 апреля 2004 21:03 («] [#] [») |
|
|
Итак, считаем сколько получится комбинаций дилера каждого сорта и запоминаем их в массиве
Нет игры, AK4, AK5,... AKQ, 22, 33, .. AA,
3322, 44xx, .. AAxx, 222, 333, AAA, Str5, Str6, StrA, F, Full, Care, StrFl.
Для обмена 5 карт получаем точно такой же массив чисел с возможными комбинациями игрока после обмена 5 карт.
Теперь по этим двум массивам получаем МО обмена 5 карт
Процедура очень простая. Делается один проход по комбинациям,
Числа дилера по ходу цикла суммируются и для каждой комбинации имеем сколько комбинаций дилера старше его, а сколько младше.
Для других обменов (меньше пяти карт) - заполняем тот же массив
с учетом, что некоторые карты уже сданы.
Формулы, кстати получаются довольно громоздкие (особенно для всяких там флешей и Туз-Король). Ошибок там выловил немерянно.
Для шестикарточного так и не написал до сих пор. А там еще сложней (т.к. в 5-ом, если есть пара то ни стрит, ни флеш уже не может быть)
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23716 ответ на 23702 |
Сб, 10 апреля 2004 21:57 («] [#] [») |
|
|
Приветствую!
2 Ivan
Спасибо за пояснения. Мне приходила в голову идея насчитать возможные комбинации дилера и игрока. Но это все, насколько я понимаю, применимо только к перовму боксу. Например, на первом боксе поменяли 1 карту. На 2 боксе хотим сбросить 5 карт. Получается, что необходимо посчитать обмен 5 карт на 2 боксе, при условии, что вышло 6 карт. А ведь на первом боксе можно сбросить и не одну, а 1..5 карту. А третий бокс? Ээээ. Вот тут моя мысль останавливается.
ЗЫ. В твоей программе лезем в меню "Читать распечатку". В файле выводиться 1000000, Res1 = -0.9 %, Res2 = -0.6, Res2 = 0.0 %
Думаю, что вместо последнего "Res2" должно быть Res3.
Кроме того добавь в программу расчет дисперсии. Это понадобиться для расчета банка и рисков.
И еще. 1000000 раздач может быть мало для выхода на заданную точность оценки МО.
Могу прислать формулу.
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23717 ответ на 23702 |
Вс, 11 апреля 2004 08:41 («] [#] [») |
|
|
Нет никакой разницы 1-ый бокс или 6-ой.
Процедура одна и та же.
На входе - какие карты уже есть на боксе (4-если меняли одну, 3 - если меняли две и т.д) и список вышедших карт (не важно мы их выбросили с этого бокса или с предыдещего)
На выходе массив чисел (сколько каких комбинаций/номиналов)
Res3 конечно. Там еще и Res4 вместо Res5. Спасибо.
Дисперсию надо бы приделать, конечно. Я ее, честно говоря, и не считал никогда. Так, по счастью, и катал все время без всякой дисперсии.
Формулу пришли. А какая, кстати, заданная точность?
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23718 ответ на 23702 |
Вс, 11 апреля 2004 15:25 («] [#] [») |
|
|
Приветсствую!
2 Ivan
Переходим в мыло. Жди письмо.
2 All
Если кто-то желает высказть еще идеи, буду рад увидеть здесь, на форуме, или в письме.
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23719 ответ на 23702 |
Пн, 12 апреля 2004 07:36 («] [#] [») |
|
|
У тебя очень приличное ядро, считает миллион случайных рук за 86 секунд, так? Попробуй считать не сверху, а снизу....
Насколько я помню, мы еще в прошлом году обсуждали вариант уплотнения мастей. Это позволит тебе уменьшить число анализируемых комбинаций при обменах, например для покупки шестой карты нужно будет считать не 46 вариантов раскладов, а 20-30, и т.п.
Ivan, речь идет об абсолютно точной оценке руки (комбинаций дилера выше/ниже/равно). Для расчета МО, тем более на двух боксах, безусловно требуется симуляция, так как даже такой скорости недостаточно. Все что мне удавалось, это перебрать ВСЕ варианты игры на один бокс в шестикарточный с ТК, результаты я выкладывал на poker.ru год назад
Удачи.
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23720 ответ на 23702 |
Вт, 13 апреля 2004 09:33 («] [#] [») |
|
|
Приветствую.
2 Korovin
Quote: | У тебя очень приличное ядро, считает миллион случайных рук за 86 секунд, так? Попробуй считать не сверху, а снизу....
Насколько я помню, мы еще в прошлом году обсуждали вариант уплотнения мастей. Это позволит тебе уменьшить число анализируемых комбинаций при обменах, например для покупки шестой карты нужно будет считать не 46 вариантов раскладов, а 20-30, и т.п. | Что ты понимаешь под "считать не сверху, а снизу...."??? Не понял.
Насчет сжатия по мастям. Учитывать или не учитывать опадание карт игрока в масть дилера? Если не учитывать, то все просто. А если учитываешь, то получается: одна из карта игрока совпдает с мастью дилера, две карты игрока сопадают с мастью дилера. Ну и т.д.
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23721 ответ на 23702 |
Вт, 13 апреля 2004 18:59 («] [#] [») |
|
|
Приветствую!
Спасибо всем участникам этого треда за ценную информацию . Поделюсь своими результатами.
Я в общем согласен с процедурами, которые были изложены выше. Уточню - я имею ввиду два способа расчета вероятностей, либо прямой перебор по циклам всех возможных выпадений (скажем для обмена одной карты это 46), либо сделать клевую функцию, которая как-то будет считать эти вероятности все сразу.
Проблемы первого варианта очевидны - это низкое быстродействие. У меня для обмена пяти карт выходит около 3 секунд. Конечно с помощью оптимизаций можно выжать в несколько раз меньше, но это погоды не сделает. Обратимся поэтому ко второму варианту.
Тут алгоритмически все совсем не просто, но для пяти карт сделать вполне можно (я как раз на этом этапе сейчас). А вот для шести карт и больше ? Для произвольного количества карт я досчитался до фула сверху, но фул осилить не могу.
Может быть у кого-то есть идеи именно по написанию этой функции для 6 и более карт ?
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23722 ответ на 23702 |
Ср, 14 апреля 2004 06:56 («] [#] [») |
|
|
Приветствую!
2 NoSound
Quote: | Для произвольного количества карт я досчитался до фула сверху, но фул осилить не могу. | Поясни, что значит "досчитался до фула сверху"?
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23723 ответ на 23702 |
Ср, 14 апреля 2004 10:45 («] [#] [») |
|
|
Добрый день
Наша функция должна оценивать вероятности комбинаций. Я считаю количество различных вариантов которыми можно собрать каждую конкретную комбинацию. Скажем для начальной раздачи карт число комбинаций на каре равно 13*48 - это просто. Но в нашем случае нужно учитывать, что мы можем обменивать не все карты + то что часть карт может быть вне игры, скажем карта дилера. Вот для этого последнего случая, то есть когда все нефиксировано и задается как входящие параметры, у меня получилось найти вероятности для стрейт-флеша,каре,флеш-рояля а для фула уже не получается. Впринципе конечно можно осилить, но уж больно много получится там вложенных циклов. Как-то бы красиво сделать, да чтоб побыстрее работало
|
|
|
А зачем для произвольного количества карт сразу делать ID:23724 ответ на 23702 |
Ср, 14 апреля 2004 12:18 («] [#] [») |
|
|
Я опять о своем. Мы же не научную диссертацию делаем, а хотим положительную игру уметь найти и выигрышную стратегию для нее получить.
Вот для пяти карт я сделал все расчеты по формулам. Теперь за шесть взялся. Сложно, но сделаю потихонечьку и для шести.
Ну, даже если и такую глобальную цель ставить - универсальный алгоритм сделать - все равно решение частного случая может помочь в понимании проблемы.
Вот сделаю для шести. Понадобиться - для 7-и. Потом и общий случай сам собой может родиться.
Вот другая проблема есть, на мой взгляд еще более серьезная.
Это повторный обмен. Там как без перебора обойтись у меня даже идеи нет. Хорошо в нашем любимом шестикарточном с покупкой и обменом. Там 46 вариантов покупки можно перебрать, а дальше опять по формулам. А если есть повторный обмен после обмена 2-х, 3-х или 5-карт? Тут никакой перебор не тянет. А есть ведь и такие игры.
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23725 ответ на 23702 |
Ср, 14 апреля 2004 13:23 («] [#] [») |
|
|
Абсолютно согласен со сложностями при повторном обмене!
Иначе как полным перебором я тоже выхода не нашел, к счастью мне нужно было только при первом обмене 1 карта, получилось меньше 1сек. Для 2х и более будет считать часами.
|
|
|
Люди! Используйте профайлер. ID:23726 ответ на 23702 |
Ср, 28 апреля 2004 13:24 («] [#] [») |
|
|
Приветствую!
Люди! Используйте профайлер.
Посмотрел в профайлере на время занимаемое выполнением моей основной процедуры расчета. Оказалось, что 60% времени занимает вызов такой безобидной функции как расчет числа сочетаний.
//
|
|
|
Re: Люди! Используйте профайлер. ID:23727 ответ на 23702 |
Чт, 29 апреля 2004 23:29 («] [#] [») |
|
|
"Оптимизация кода" это вообще огромная наука. У меня после выноса объявления переменных из одной из функций в глобальные переменные скорость увеличилась в три раза (C++ .Net).
|
|
|
Re: Люди! Используйте профайлер. А лучше -- мозги :) ID:23728 ответ на 23702 |
Пт, 30 апреля 2004 23:19 («] [#] [») |
|
|
А вообще, для чего использовать плавающую арифметику там, где прекрасно можно обойтись без нее??? Это же... все равно, что чесать левой ногой правое ухо. Или забивать гвозди микроскопом.
Навскидку, целочисленная функция должна работать раз в 20 быстрее.
|
|
|
Re: Ускорить расчет раскладов в покере... ID:23729 ответ на 23702 |
Ср, 5 мая 2004 07:41 («] [#] [») |
|
|
2Grey:А мат.ожидание e t.c. тоже целочисленными функциями бум считать? ИМХО, на современном "железе" разница между целочисленными и "плавающими" функциями не существенна...
|
|
|