Базар вокруг игры / Комп в помощь / Ускорить расчет раскладов в покере...
  Страницы(4): [#  1  2  3  4  >  »]   Перейти вниз
Ускорить расчет раскладов в покере...   ID:23702 Вт, 6 апреля 2004 11:01 [#] [»)
Mariner Форумы CasinoGames
Приветствую.

Это отчасти продолжение темы начатой мной еще на www.poker.ru
Нужна идея как ускорить расчет покерных раскладов с помощью таблиц. На данный момент считается все по формулам комбинатроники. Третий оптимизированный варинат считает обмен 5 карт на 1 боксе за 6 секунд (Первый варинат считал за 2 суток, второй за 2,5 минуты Smile ). Это все на Athlon XP 2200+
Что хранить в таблицах? Делал прикидки, получается большой объем данных. Sad
Жду.
        
 
Я использую такой алгоритм   ID:23710   ответ на 23702 Пт, 9 апреля 2004 09:40 («] [#] [»)
Ivan Форумы CasinoGames
Комбинации дилера считаются по комбинаторным формулам для начальной позиции и для некоторых критических вариантов обмена. Для комбинации Туз-Король учитывается 3-я карта. Для остальных комбинаций учитывается только один номинал - для пары это номинал пары, для 2-х пар номинал старшей пары и т.д. Все флеши считаются одинаковыми. Эти числа запоминаются и потом используются для сравнения с комбинациями игрока. Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам, так же как и комбинации дилера. Этот алгоритм в некоторых ситуациях дает значительную ошибку в оценке, но при выборе хода ошибки редки и все они недорогие.

Время оценки одной позиции 0,001c
Миллион раздач за 17 мин.

Для оценки игры типа "Обмен 1,2,5 за анте" (преимущество на 1-ом боксе около 3%, на втором около 5%)хватает выше крыши.

А потом, когда дело доходит до разработки выигрышной стратегии можно и более точные алгоритм использовать. Там 1-2 сек. на позицию - вполне сносный результат.
        
 
Re: Я использую такой алгоритм   ID:23711   ответ на 23702 Сб, 10 апреля 2004 07:15 («] [#] [»)
korovin Форумы CasinoGames
А можно считать АБСОЛЮТНО точно. Анализ одной руки 0.000001с или миллион рук в секунду.

Готов обсудить продажу алгоритма с заинтересованными лицами. ДОРОГО.
        
 
Коровин, опубликуйте, пожалуйста, какой-нибудь абсолютно точный результат   ID:23712   ответ на 23702 Сб, 10 апреля 2004 10:00 («] [#] [»)
Ivan Форумы CasinoGames
Ну, скажем, для игры с обменом 1, 2 или 5 карт за анте, две пары оплачиваются 1,5 : 1, два бокса с параллельным обменом на боксах.
        
 
Re: Я использую такой алгоритм   ID:23714   ответ на 23702 Сб, 10 апреля 2004 19:31 («] [#] [»)
Mariner Форумы CasinoGames
Приветствую!

Еще раз повторю, мне нужна всего лишь идея. Остальное додумывается самостоятельно в автономном режиме. Smile
Мой алгоритм позволяет с помощью одной и той же процедуры считать обмен 0..5 карт при открытых 0..5 карт дилера. Только медленно. Smile
Алгоритм следующий. Задаем 5 карт игрока. Задаем открытую карту дилера. По формулам комбинатроники определяем комбинации дилера. Затем по формулам комбинатроники считаем сколько раз проиграет данный расклад игрока дилеру. Сколько раз выиграет. Ну и до кучи считаем ничьи. При заданных оплатах за комбинации, считаем МО.
Если проводим обмен 1..5 карт, то алгоритм будет следующим. Убираем из начального расклада игрока 1..5 карт, добираем в цикле недостающие карты. Получаем новый расклад к которому применяется приведенный выше алгоритм. Суммируем МО каждого расклада и делим на число таких раскладов при обмене.
Например, обменять 1 карту игрока можно 5 способами. Пусть у нас первый бокс и открыта 1 карта дилера.
Меняем 1 карту в первой позиции расклада игрока. Всего возможно 52-1-5=46 обменов. Получаем 46 новых раскладов игрока и значений их МО. Затем меняем карту во 2,3,4 и 5 позиции расклада игрока.
Выбираем лучшее значение МО и, соответственно, позиции обмена.
Обменять 5 карт можно всего одним способом. Возможных новых комбинаций игрока С(46,5)=1370754. Мой алгоритм считает около 2 минут. Тормоза из-за того, что необходимо посчитать МО для 1370754 новых раскладов. Confused
Какие данные надо предварительно насчитать и запомнить, чтобы ускорить расчет обмена 5 карт? Обмен 5 карт рассматриваю в том плане, что он самый требовательный к скорости расчета.

2 Ivan
Quote:
Комбинации дилера считаются по комбинаторным формулам для начальной позиции и для некоторых критических вариантов обмена. Для комбинации Туз-Король учитывается 3-я карта. Для остальных комбинаций учитывается только один номинал - для пары это номинал пары, для 2-х пар номинал старшей пары и т.д. Все флеши считаются одинаковыми. Эти числа запоминаются и потом используются для сравнения с комбинациями игрока. Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам, так же как и комбинации дилера. Этот алгоритм в некоторых ситуациях дает значительную ошибку в оценке, но при выборе хода ошибки редки и все они недорогие.
Продолжу тройка и фул учитывается номинал тройки. Стрит (стритфлэш, рояль) - старшая карта. Так?
Можно чуть подробнее про "Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам".
Как ты считаешь возможные комбинации игрока по формулам комбинатроники?
Смущает вот что. Обмен 5 карт у игрока. Можем посчитать по формулам комбинатроники сколько комбинаций различного типа может быть из оставшихся 46 карт у игрока. Затем, посчитать сколько возможных комбинаций дилера. А вот как теперь найти МО обмена?

2 Korovin
Quote:
А можно считать АБСОЛЮТНО точно. Анализ одной руки 0.000001с или миллион рук в секунду.
Готов обсудить продажу алгоритма с заинтересованными лицами. ДОРОГО.
Готов бесплатно выслушать идею. Т.к. скорость и точность расчета просто потрясают. Shocked
        
 
Постараюсь поподробнее   ID:23715   ответ на 23702 Сб, 10 апреля 2004 21:03 («] [#] [»)
Ivan Форумы CasinoGames
Итак, считаем сколько получится комбинаций дилера каждого сорта и запоминаем их в массиве
Нет игры, 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 («] [#] [»)
Mariner Форумы CasinoGames
Приветствую!

2 Ivan

Спасибо за пояснения. Мне приходила в голову идея насчитать возможные комбинации дилера и игрока. Но это все, насколько я понимаю, применимо только к перовму боксу. Например, на первом боксе поменяли 1 карту. На 2 боксе хотим сбросить 5 карт. Получается, что необходимо посчитать обмен 5 карт на 2 боксе, при условии, что вышло 6 карт. А ведь на первом боксе можно сбросить и не одну, а 1..5 карту. А третий бокс? Ээээ. Вот тут моя мысль останавливается. Confused

ЗЫ. В твоей программе лезем в меню "Читать распечатку". В файле выводиться 1000000, Res1 = -0.9 %, Res2 = -0.6, Res2 = 0.0 %
Думаю, что вместо последнего "Res2" должно быть Res3.
Кроме того добавь в программу расчет дисперсии. Это понадобиться для расчета банка и рисков.
И еще. 1000000 раздач может быть мало для выхода на заданную точность оценки МО.
Могу прислать формулу.
        
 
Re: Ускорить расчет раскладов в покере...   ID:23717   ответ на 23702 Вс, 11 апреля 2004 08:41 («] [#] [»)
Ivan Форумы CasinoGames
Нет никакой разницы 1-ый бокс или 6-ой.
Процедура одна и та же.
На входе - какие карты уже есть на боксе (4-если меняли одну, 3 - если меняли две и т.д) и список вышедших карт (не важно мы их выбросили с этого бокса или с предыдещего)
На выходе массив чисел (сколько каких комбинаций/номиналов)

Res3 конечно. Там еще и Res4 вместо Res5. Спасибо.

Дисперсию надо бы приделать, конечно. Я ее, честно говоря, и не считал никогда. Так, по счастью, и катал все время без всякой дисперсии.

Формулу пришли. А какая, кстати, заданная точность?
        
 
Re: Ускорить расчет раскладов в покере...   ID:23718   ответ на 23702 Вс, 11 апреля 2004 15:25 («] [#] [»)
Mariner Форумы CasinoGames
Приветсствую!

2 Ivan
Переходим в мыло. Жди письмо.

2 All
Если кто-то желает высказть еще идеи, буду рад увидеть здесь, на форуме, или в письме.

Very Happy Rolling Eyes
        
 
Re: Ускорить расчет раскладов в покере...   ID:23719   ответ на 23702 Пн, 12 апреля 2004 07:36 («] [#] [»)
korovin Форумы CasinoGames
У тебя очень приличное ядро, считает миллион случайных рук за 86 секунд, так? Попробуй считать не сверху, а снизу....

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

Ivan, речь идет об абсолютно точной оценке руки (комбинаций дилера выше/ниже/равно). Для расчета МО, тем более на двух боксах, безусловно требуется симуляция, так как даже такой скорости недостаточно. Все что мне удавалось, это перебрать ВСЕ варианты игры на один бокс в шестикарточный с ТК, результаты я выкладывал на poker.ru год назад

Удачи.
        
 
Re: Ускорить расчет раскладов в покере...   ID:23720   ответ на 23702 Вт, 13 апреля 2004 09:33 («] [#] [»)
Mariner Форумы CasinoGames
Приветствую.

2 Korovin
Quote:
У тебя очень приличное ядро, считает миллион случайных рук за 86 секунд, так? Попробуй считать не сверху, а снизу....

Насколько я помню, мы еще в прошлом году обсуждали вариант уплотнения мастей. Это позволит тебе уменьшить число анализируемых комбинаций при обменах, например для покупки шестой карты нужно будет считать не 46 вариантов раскладов, а 20-30, и т.п.
Что ты понимаешь под "считать не сверху, а снизу...."??? Не понял.

Насчет сжатия по мастям. Учитывать или не учитывать опадание карт игрока в масть дилера? Если не учитывать, то все просто. А если учитываешь, то получается: одна из карта игрока совпдает с мастью дилера, две карты игрока сопадают с мастью дилера. Ну и т.д.
        
 
Re: Ускорить расчет раскладов в покере...   ID:23721   ответ на 23702 Вт, 13 апреля 2004 18:59 («] [#] [»)
NoSound Форумы CasinoGames
Приветствую!

Спасибо всем участникам этого треда за ценную информацию Smile. Поделюсь своими результатами. Smile

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

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

Тут алгоритмически все совсем не просто, но для пяти карт сделать вполне можно (я как раз на этом этапе сейчас). А вот для шести карт и больше ? Для произвольного количества карт я досчитался до фула сверху, но фул осилить не могу.

Может быть у кого-то есть идеи именно по написанию этой функции для 6 и более карт ?
        
 
Re: Ускорить расчет раскладов в покере...   ID:23722   ответ на 23702 Ср, 14 апреля 2004 06:56 («] [#] [»)
Mariner Форумы CasinoGames
Приветствую!

2 NoSound
Quote:
Для произвольного количества карт я досчитался до фула сверху, но фул осилить не могу.
Поясни, что значит "досчитался до фула сверху"?
        
 
Re: Ускорить расчет раскладов в покере...   ID:23723   ответ на 23702 Ср, 14 апреля 2004 10:45 («] [#] [»)
NoSound Форумы CasinoGames
Добрый день Smile

Наша функция должна оценивать вероятности комбинаций. Я считаю количество различных вариантов которыми можно собрать каждую конкретную комбинацию. Скажем для начальной раздачи карт число комбинаций на каре равно 13*48 - это просто. Но в нашем случае нужно учитывать, что мы можем обменивать не все карты + то что часть карт может быть вне игры, скажем карта дилера. Вот для этого последнего случая, то есть когда все нефиксировано и задается как входящие параметры, у меня получилось найти вероятности для стрейт-флеша,каре,флеш-рояля а для фула уже не получается. Впринципе конечно можно осилить, но уж больно много получится там вложенных циклов. Как-то бы красиво сделать, да чтоб побыстрее работало Smile
        
 
А зачем для произвольного количества карт сразу делать   ID:23724   ответ на 23702 Ср, 14 апреля 2004 12:18 («] [#] [»)
Ivan Форумы CasinoGames
Я опять о своем. Мы же не научную диссертацию делаем, а хотим положительную игру уметь найти и выигрышную стратегию для нее получить.

Вот для пяти карт я сделал все расчеты по формулам. Теперь за шесть взялся. Сложно, но сделаю потихонечьку и для шести.

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

Вот сделаю для шести. Понадобиться - для 7-и. Потом и общий случай сам собой может родиться.

Вот другая проблема есть, на мой взгляд еще более серьезная.
Это повторный обмен. Там как без перебора обойтись у меня даже идеи нет. Хорошо в нашем любимом шестикарточном с покупкой и обменом. Там 46 вариантов покупки можно перебрать, а дальше опять по формулам. А если есть повторный обмен после обмена 2-х, 3-х или 5-карт? Тут никакой перебор не тянет. А есть ведь и такие игры.
        
 
Re: Ускорить расчет раскладов в покере...   ID:23725   ответ на 23702 Ср, 14 апреля 2004 13:23 («] [#] [»)
NoSound Форумы CasinoGames
Абсолютно согласен со сложностями при повторном обмене!

Иначе как полным перебором я тоже выхода не нашел, к счастью мне нужно было только при первом обмене 1 карта, получилось меньше 1сек. Для 2х и более будет считать часами.
        
 
Люди! Используйте профайлер.   ID:23726   ответ на 23702 Ср, 28 апреля 2004 13:24 («] [#] [»)
Mariner Форумы CasinoGames
Приветствую!

Люди! Используйте профайлер.

Посмотрел в профайлере на время занимаемое выполнением моей основной процедуры расчета. Оказалось, что 60% времени занимает вызов такой безобидной функции как расчет числа сочетаний.

//
        
 
Re: Люди! Используйте профайлер.   ID:23727   ответ на 23702 Чт, 29 апреля 2004 23:29 («] [#] [»)
NoSound Форумы CasinoGames
"Оптимизация кода" это вообще огромная наука. У меня после выноса объявления переменных из одной из функций в глобальные переменные скорость увеличилась в три раза (C++ .Net).
        
 
Re: Люди! Используйте профайлер. А лучше -- мозги :)   ID:23728   ответ на 23702 Пт, 30 апреля 2004 23:19 («] [#] [»)
grey Форумы CasinoGames
А вообще, для чего использовать плавающую арифметику там, где прекрасно можно обойтись без нее??? Это же... все равно, что чесать левой ногой правое ухо. Или забивать гвозди микроскопом.
Навскидку, целочисленная функция должна работать раз в 20 быстрее.
        
 
Re: Ускорить расчет раскладов в покере...   ID:23729   ответ на 23702 Ср, 5 мая 2004 07:41 («] [#] [»)
denker Форумы CasinoGames
2Grey:А мат.ожидание e t.c. тоже целочисленными функциями бум считать? ИМХО, на современном "железе" разница между целочисленными и "плавающими" функциями не существенна...
        
 
Страницы(4): [#  1  2  3  4  >  »]  
Предыдущая тема:2Реактор
Следующая тема:Предложение
Быстрый переход к форуму
  
Текстовая версия  RSS лента
Вернуться вверх

Текущее время: Сб, 23 ноября 03:10:57 2024
Время, затраченное на генерацию страницы: 0.01359 секунд