Регистрация
Регистрация Поиск Пользователи Все разделы прочитаны  
CGM > Казино > Казино софт
Опции темы

Ускорить расчет раскладов в покере...

Важные объявления
Старый 06.04.2004, 12:01     TS Старый   #1 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветствую.

Это отчасти продолжение темы начатой мной еще на [Зарегистрироваться?]
Нужна идея как ускорить расчет покерных раскладов с помощью таблиц. На данный момент считается все по формулам комбинатроники. Третий оптимизированный варинат считает обмен 5 карт на 1 боксе за 6 секунд (Первый варинат считал за 2 суток, второй за 2,5 минуты ). Это все на Athlon XP 2200+
Что хранить в таблицах? Делал прикидки, получается большой объем данных. :(
Жду.

__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 09.04.2004, 10:40   #2 (permalink)
Интересующийся
 
Регистрация: 20.03.2004
Адрес: Москва
Сообщений: 75
Комбинации дилера считаются по комбинаторным формулам для начальной позиции и для некоторых критических вариантов обмена. Для комбинации Туз-Король учитывается 3-я карта. Для остальных комбинаций учитывается только один номинал - для пары это номинал пары, для 2-х пар номинал старшей пары и т.д. Все флеши считаются одинаковыми. Эти числа запоминаются и потом используются для сравнения с комбинациями игрока. Комбинации игрока для всех рассматриваемых вариантов обмена считаются по комбинаторным формулам, так же как и комбинации дилера. Этот алгоритм в некоторых ситуациях дает значительную ошибку в оценке, но при выборе хода ошибки редки и все они недорогие.

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

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

А потом, когда дело доходит до разработки выигрышной стратегии можно и более точные алгоритм использовать. Там 1-2 сек. на позицию - вполне сносный результат.
Ivan вне форума      
Старый 10.04.2004, 08:15   #3 (permalink)
Бессмертный
 
Аватар для korovin
 
Регистрация: 13.02.2004
Адрес: Россия
Сообщений: 3,027
А можно считать АБСОЛЮТНО точно. Анализ одной руки 0.000001с или миллион рук в секунду.

Готов обсудить продажу алгоритма с заинтересованными лицами. ДОРОГО.
korovin вне форума      
Старый 10.04.2004, 11:00   #4 (permalink)
Интересующийся
 
Регистрация: 20.03.2004
Адрес: Москва
Сообщений: 75
Ну, скажем, для игры с обменом 1, 2 или 5 карт за анте, две пары оплачиваются 1,5 : 1, два бокса с параллельным обменом на боксах.
Ivan вне форума      
Старый 10.04.2004, 20:31     TS Старый   #5 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветствую!

Еще раз повторю, мне нужна всего лишь идея. Остальное додумывается самостоятельно в автономном режиме.
Мой алгоритм позволяет с помощью одной и той же процедуры считать обмен 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с или миллион рук в секунду.
Готов обсудить продажу алгоритма с заинтересованными лицами. ДОРОГО.
Готов бесплатно выслушать идею. Т.к. скорость и точность расчета просто потрясают. 8O

__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 10.04.2004, 22:03   #6 (permalink)
Интересующийся
 
Регистрация: 20.03.2004
Адрес: Москва
Сообщений: 75
Итак, считаем сколько получится комбинаций дилера каждого сорта и запоминаем их в массиве
Нет игры, AK4, AK5,... AKQ, 22, 33, .. AA,
3322, 44xx, .. AAxx, 222, 333, AAA, Str5, Str6, StrA, F, Full, Care, StrFl.

Для обмена 5 карт получаем точно такой же массив чисел с возможными комбинациями игрока после обмена 5 карт.

Теперь по этим двум массивам получаем МО обмена 5 карт
Процедура очень простая. Делается один проход по комбинациям,
Числа дилера по ходу цикла суммируются и для каждой комбинации имеем сколько комбинаций дилера старше его, а сколько младше.

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

Формулы, кстати получаются довольно громоздкие (особенно для всяких там флешей и Туз-Король). Ошибок там выловил немерянно.

Для шестикарточного так и не написал до сих пор. А там еще сложней (т.к. в 5-ом, если есть пара то ни стрит, ни флеш уже не может быть)
Ivan вне форума      
Старый 10.04.2004, 22:57     TS Старый   #7 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветствую!

2 Ivan

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

ЗЫ. В твоей программе лезем в меню "Читать распечатку". В файле выводиться 1000000, Res1 = -0.9 %, Res2 = -0.6, Res2 = 0.0 %
Думаю, что вместо последнего "Res2" должно быть Res3.
Кроме того добавь в программу расчет дисперсии. Это понадобиться для расчета банка и рисков.
И еще. 1000000 раздач может быть мало для выхода на заданную точность оценки МО.
Могу прислать формулу.
__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 11.04.2004, 09:41   #8 (permalink)
Интересующийся
 
Регистрация: 20.03.2004
Адрес: Москва
Сообщений: 75
Нет никакой разницы 1-ый бокс или 6-ой.
Процедура одна и та же.
На входе - какие карты уже есть на боксе (4-если меняли одну, 3 - если меняли две и т.д) и список вышедших карт (не важно мы их выбросили с этого бокса или с предыдещего)
На выходе массив чисел (сколько каких комбинаций/номиналов)

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

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

Формулу пришли. А какая, кстати, заданная точность?
Ivan вне форума      
Старый 11.04.2004, 16:25     TS Старый   #9 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветсствую!

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

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

__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 12.04.2004, 08:36   #10 (permalink)
Бессмертный
 
Аватар для korovin
 
Регистрация: 13.02.2004
Адрес: Россия
Сообщений: 3,027
У тебя очень приличное ядро, считает миллион случайных рук за 86 секунд, так? Попробуй считать не сверху, а снизу....

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

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

Удачи.
korovin вне форума      
Старый 13.04.2004, 10:33     TS Старый   #11 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветствую.

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

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

Насчет сжатия по мастям. Учитывать или не учитывать опадание карт игрока в масть дилера? Если не учитывать, то все просто. А если учитываешь, то получается: одна из карта игрока совпдает с мастью дилера, две карты игрока сопадают с мастью дилера. Ну и т.д.
__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 13.04.2004, 19:59   #12 (permalink)
Незнакомец
 
Регистрация: 13.04.2004
Сообщений: 17
Приветствую!

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

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

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

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

Может быть у кого-то есть идеи именно по написанию этой функции для 6 и более карт ?
NoSound вне форума      
Старый 14.04.2004, 07:56     TS Старый   #13 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветствую!

2 NoSound
Цитата:
Сообщение от Quote:
Для произвольного количества карт я досчитался до фула сверху, но фул осилить не могу.
Поясни, что значит "досчитался до фула сверху"?
__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 14.04.2004, 11:45   #14 (permalink)
Незнакомец
 
Регистрация: 13.04.2004
Сообщений: 17
Добрый день

Наша функция должна оценивать вероятности комбинаций. Я считаю количество различных вариантов которыми можно собрать каждую конкретную комбинацию. Скажем для начальной раздачи карт число комбинаций на каре равно 13*48 - это просто. Но в нашем случае нужно учитывать, что мы можем обменивать не все карты + то что часть карт может быть вне игры, скажем карта дилера. Вот для этого последнего случая, то есть когда все нефиксировано и задается как входящие параметры, у меня получилось найти вероятности для стрейт-флеша,каре,флеш-рояля а для фула уже не получается. Впринципе конечно можно осилить, но уж больно много получится там вложенных циклов. Как-то бы красиво сделать, да чтоб побыстрее работало
NoSound вне форума      
Старый 14.04.2004, 13:18   #15 (permalink)
Интересующийся
 
Регистрация: 20.03.2004
Адрес: Москва
Сообщений: 75
Я опять о своем. Мы же не научную диссертацию делаем, а хотим положительную игру уметь найти и выигрышную стратегию для нее получить.

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

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

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

Вот другая проблема есть, на мой взгляд еще более серьезная.
Это повторный обмен. Там как без перебора обойтись у меня даже идеи нет. Хорошо в нашем любимом шестикарточном с покупкой и обменом. Там 46 вариантов покупки можно перебрать, а дальше опять по формулам. А если есть повторный обмен после обмена 2-х, 3-х или 5-карт? Тут никакой перебор не тянет. А есть ведь и такие игры.

Ivan вне форума      
Старый 14.04.2004, 14:23   #16 (permalink)
Незнакомец
 
Регистрация: 13.04.2004
Сообщений: 17
Абсолютно согласен со сложностями при повторном обмене!

Иначе как полным перебором я тоже выхода не нашел, к счастью мне нужно было только при первом обмене 1 карта, получилось меньше 1сек. Для 2х и более будет считать часами.
NoSound вне форума      
Старый 28.04.2004, 14:24     TS Старый   #17 (permalink)
Ветеран
 
Аватар для Mariner
 
Регистрация: 12.02.2004
Адрес: Россия, УРФО
Сообщений: 1,399
Приветствую!

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

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

// ×èñëî ñå÷òàíèé èç N ïî M
function C(N, M: integer): integer;
var
a,b,c,d: real;
begin
a:=N;
b:=M;
c:=1;
d:=b+1;
while (d<=a) do
begin
c:=c*d/(a-d+1);
d:=d+1;
end;
Result:=Round(c);
end;

После оптимизации кода путем замены вызова этой функции на обращение к заранее посчитанному массиву, вызов функции расчета числа сочетаний сократился до 5%.
Соответственно время расчета обмена 5 карт без учета сжатия по мастям сократилось с 2,5 минут до 22 секунд. Выигрыш в скорости почти в 7 раз!


__________________
Mariner

Западное полушарие Марса рассечено на протяжении 4 000 км вдоль экватора рифтовыми долинами Маринер - крупнейшим поясом разломов на планете.
Mariner вне форума      
Старый 30.04.2004, 00:29   #18 (permalink)
Незнакомец
 
Регистрация: 13.04.2004
Сообщений: 17
"Оптимизация кода" это вообще огромная наука. У меня после выноса объявления переменных из одной из функций в глобальные переменные скорость увеличилась в три раза (C++ .Net).
NoSound вне форума      
Старый 01.05.2004, 00:19   #19 (permalink)
Бессмертный
 
Аватар для Grey
 
Регистрация: 30.04.2004
Сообщений: 3,612
А вообще, для чего использовать плавающую арифметику там, где прекрасно можно обойтись без нее??? Это же... все равно, что чесать левой ногой правое ухо. Или забивать гвозди микроскопом.
Навскидку, целочисленная функция должна работать раз в 20 быстрее.
__________________
Arthur Grey
Grey вне форума      
Старый 05.05.2004, 08:41   #20 (permalink)
Ветеран
 
Аватар для denker
 
Регистрация: 28.04.2004
Сообщений: 1,377
Отправить сообщение для denker с помощью ICQ
2Grey:А мат.ожидание e t.c. тоже целочисленными функциями бум считать? ИМХО, на современном "железе" разница между целочисленными и "плавающими" функциями не существенна...
__________________
http://forum.betflop.com/viewtopic.php?f=23&t=333
Дневник
denker вне форума      

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор раскладов успешных игроков kesey Limit Holdem, Omaha, 7-Card Stud и другие виды покера 42 29.06.2008 21:36
как ускорить игру? prokrusto Покер один на один 9 12.02.2008 00:36
"Тестер" для раскладов в Покере. CLON Казино софт 14 14.11.2007 09:39
Расчет вероятностей событий в покере. Murk Теории, стратегии, основы покера 20 03.07.2005 22:07
Расчет дисперсии при ОС на покере joker50 Покер против казино 5 06.04.2004 21:41


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.

Быстрый переход
Правила форумов CGM Контакты Справка Обратная связь CGM.ru Архив Вверх Главная
 
Использование материалов сайта разрешено только при наличии активной ссылки на источник.
Все права на картинки и тексты принадлежат Информационному агентству CGM и их ПАРТНЕРАМ. Политика конфидециальности
CGM.ru на Youtube CGM.ru на Google+ CGM.ru в Twitter CGM.ru на Facebook CGM.ru в vKontakte CGM.ru в Instagram

В сотрудничестве с Pokeroff.ru
Текущее время: 05:26. Часовой пояс GMT +3.
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot