Пилю программку по обсчёту китайского покера

23
Статистика
Статистика
23
Статистика темы
  • Популярность
    Топ-5198
  • Постов
    2,261
  • Просмотров
    184,225
  • Подписок
    23
  • Карма автора
    -45
1 64 65 66 67 114
  • БиллиУбили @ 25.2.2020
    Приближаемся к главной интриге полного дерева: можно ли распространить на него алгоритм разложения "по комбинациям"(а не перебором отдельных карт)

    ну, да. Всего лишь 2-3 цикла(витка) рекурсии, причём можно и последовательно. Сначала раскладываем фантазию на бесконечном наборе(каждая карта из 14-17 карт может принять участие в 1-2-3 комбинациях одновременно, то есть попасть И в топ, И в мидл, И вниз), а потом либо удаляем невозможное(не рекурсия), либо снова запускаем доразложение фантазии на бесконечном наборе, но уже из 9-12 карт. Потом тоже для набора из 4-7 карт и на этом всё.
    Как такое написать без рекурсии, я слабо понимаю. Там будет 10+ циклов разной вложенности...завидую нервам Жак-а
    Ответить Цитировать
    539/741
    + 0
  • Проект разрастается, сможешь ли ты обуздать контролить его?
    Вот уже и шаг в неизвестность. Есть полупустое дерево я ещё мог отладить вручную, то полное - всё. Каждый раз ждать 2 минуты его загрузки...Какие там сидят монстры...уже не проинспектируешь...

    БиллиУбили @ 26.2.2020
    Сначала раскладываем фантазию на бесконечном наборе(каждая карта из 14-17 карт может принять участие в 1-2-3 комбинациях одновременно, то есть попасть И в топ, И в мидл, И вниз),

    Прошёл первый этап. То есть ищем и фиксируем возможные ранги комбинаций.
    Например: из этих 17 карт можно собрать флаш, фулхауз, стрейт и т.д(а каре, предположим, не получается).. Значит, определились возможные варианты разложения(ведь роялфлаш из кустов ниоткуда появиться не может).
    Осталось проверить возможность собрать эти комбинации одновременно(что и значит разложить фантазию).
    Ответить Цитировать
    540/741
    + 0
  • так, немного отдохнули, продолжим.
    Плохие новости: некоторые методы написаны по 2-3 раза, что приводит к некоторой путанице
    Хорошие новости: быстродействие каждого варианта отличается на порядки, так что не составит труда в финальную сборку засунуть "нужные"
    Текущая проблема: разложение фантазии
    сделано
    а) найти все возможные комбинации из текущего набора (от ройялфлаш до Картахай)
    б) найти все возможные разложения фантазии из возможных комбинаций
    в процессе
    в) проверить на пересечение комбинаций = узнать, состоят ли они полностью из разных карт = возможно ли их "собрать" из текущего набора одновременно
    В планах:
    для топ-Х разложений* по очкам(включая фантазию, то есть МАХ очки) найти кол-во этих самых вариантов. То есть, предположим, 14 очков мы можем собрать 10 вариантами, а 16 очков - 8 вариантами. Тогда, по идее, мы должны собирать 14 очков (140 > 128)
    *учитываются только те разложения, которые используют 5 карт "стартера".

    Как обычно, приветствуются ваши комментарии/замечания/предложения.
    Ответить Цитировать
    541/741
    + 0
  • уф...кажись дошло, с чем связана такая задержка. Погубил, как нетрудно догадаться, переход от незаполненного дерева к полному.
    Напомню алгоритм, по которому я раскладываю фантазию.
    а) нахожу все возможные ранги комбинации на данном наборе(14-17 карт)
    б) строю возможные (теоретические) разложения: флаш/стрейт/QQ, фулхаус/Картахай/Картахай и т.п.
    в) нахожу те разложения, которые возможны практически, то есть в которых отсутствуют пересечения(одна и та же карта участвует в 2ух или более комбинациях)
    Ошибка, которая я совершил заключается в том, что на незаполненном дереве пункт а) из найти возможные ранги легко трансформирует в найти все комбинации. Так как дерево небольшое, каждый ранг предоставлен небольшим кол-вом комбинаций.
    Однако, когда я начал работать с полным деревом, я зачем-то начал гонять пункт б) по кругу:
    так, мы можем разложить фулхаус/Картахай/Картахай...значит надо найти фулхаусы и потом постепенно добавлять к нему Картахай и Картахай.
    Зачем? Зачем мне для каждого разложения заново искать все комбинации данного ранга, пусть даже имея информацию, что комбинация данного ранга существует(или не существует)??
    Так проще в пункте а) найти не только есть ли хотя бы одна комбинация данного ранга, но и найти их все(и сохранить). Тогда к дереву мне уже обращать будет не надо. Будет достаточно перебрать все варианты фулхаус/Картахай/Картахай и отсеить пересекающиеся.
    В общем, пока полный перебор, в котором пересечений нет по умолчанию, я пытаюсь заменить "быстрыми" проверками есть ли в 2ух и более комбинациях общая карта(ы).
    Посмотрим, насколько это сработает.
    Ответить Цитировать
    542/741
    + 0
  • БиллиУбили @ 11.3.2020
    я пытаюсь заменить "быстрыми" проверками есть ли в 2ух и более комбинациях общая карта(ы).

    ну, вроде мгновенная операция (более 1млн сравнений / сек)
    if (strcspn (st1.data(),st2.data()) < 5)
    counter++;

    продолжаем пограммирование
    Ответить Цитировать
    543/741
    + 0
  • Хм...17 карт. Сгенерил из них 10 "случайных" флашей и 10 "стрейтов". Вроде бы должно получится 100 вариантов положить одно на другое. В реальности выжило только
    13-14

    Быстродействие такое же
    Ответить Цитировать
    544/741
    + 0
  • Двигаемся, господа. Медленно, но двигаемся.
    Удалось посчитать, сколько раз в реальности реализуется тот или иной шаблон разложения фантазии(например, флаш/стрейт/Картахай). Что удивительно, рекурсия не понадобилась.
    Но возникла следующая проблема. Теперь для разложения стартера надо параллельно считать, какие карты стартера в какой бокс попали. А так как отдельно 3ёх карточных комбинаций я не вводил, то теперь придётся(если по-прежнему их не вводить) определять, попали ли карты стартера в те "три" карты, которые и окажутся на столе или, может, они попали в оставшиеся две(из 5карточной комбинации), которые на стол не попадут.
    Иными словами, как, имея дерево 5карточных комбинаций, определить, является ли какая-то карта ключевой для данного ранга или не является. Для ранга КартаХай всё просто: все карты равноценны, можно удалять любые 2 без риска уменьшения ранга(он и так минимальный).
    А вот что делать с парой (из 5 карт)? ПО идее, карта является ключевой для данного ранга, если замена её на любую другую из колоды не уменьшает ранг. Тратить на это 52-17=42 проверки как-то не хочется. Может есть какой-то инвариант? Так... на будущее...Жду ваших предложений )
    Ответить Цитировать
    545/741
    + 0
  • БиллиУбили @ 16.3.2020
    А вот что делать с парой (из 5 карт)?

    Собственно говоря, а зачем нам искать какой-то там инвариант?
    Ведь мы знаем все 5 карт, которые мы положили в топ. Также мы знаем, что 1-2-3 карты стартера в них входят. Плюс мы знаем, что ранг комбинации - пара. Значит, мы легко вычисляем "ключевые карты" - и (это те карты, которые и образуют "пару").
    Тогда мы получаем следующие ограничения:
    в топе должно быть 3 карты стартера => 2 из них должны быть и
    в топе должно быть 2 карты стартера => как минимум 1 должна быть или
    в топе должно быть 1 карта стартера => ограничений нет
    Ответить Цитировать
    546/741
    + 0
  • Первый "кривой" прогон.
    17 карт. 6 рангов. Всего шаблонов фантазии - 13(включая 0 очков)
    На практике(отсечка >= 4 очков) реализовалось всего 3: флаш/трипс/Картахай, флаш/2пары/Картахай, флаш/Картахай/Картахай.
    Флаш/трипс/Картахай удалось собрать ~ 3.5К способами, флаш/2пары/Картахай - более 50К, флаш/Картахай/Картахай вообще огромное число...
    Но это без обременения наличием в фантазии карт стартера.
    Попробую прикрутить, пока считает какое-то незначительное время.
    Ответить Цитировать
    547/741
    + 0
  • Второй "кривой" прогон.
    Увы, снова облом. Процедура нахождения общих элементов у 2вух(и более) строк слишком ресурсозатратна. Хотя кол-во реальных разложений дошло до приемлимых значений(десятки вариантов), время возросло до > 10 минут.
    Единственное, что можно улучшить - искать только те карты стартера, которые не были найдены на предыдущих этапах(сейчас я каждый бокс "сравниваю" с 5ью картами стартера).
    Быстренько проверю такую возможность, но пока мне это всё не нравится...
    Ответить Цитировать
    548/741
    + 0
  • Да, надо признать, это было плохой идеей. Сначала находить разложения, а уже потом находить, куда попали карты стартера.
    Что ж, возвращаемся к плану Б. Если остановится на разложении 2/2/1(не уменьшая общности), то это всего 30 вариантов разложения. А дальше по известному алгоритму:
    - находим комбинации, которые можно положить вниз с учётом уже 2ух положенных карт
    - находим комбинации, которые можно положить в середину с учётом уже (5+2) положенных карт(то есть в дальнейшем пересечения искать будет не надо)
    - то же для топа
    - побеждает то разложение, которое наберёт макс. ЕВ = кол-во вариантов*очки за разложение
    ну, и из 30 вариантов тоже выберем максимальное
    Но, прежде, чем всё это делать, придётся запрограммировать "маленькое" дерево. То есть дерево для 3ёх карточных комбинаций. Слишком уж муторно выкидывать лишние 2 карты из 5карточной комбинации. Здесь мой подход тоже потерпел крах ))
    Ответить Цитировать
    549/741
    + 0
  • БиллиУбили @ 24.3.2020
    Процедура нахождения общих элементов у 2вух(и более) строк слишком ресурсозатратна.

    Нет. Память, как у рыбки. Я же проверял быстродействие...там млн/с. Проблема оказалось в другом: я сбрасывал найденные комбинации в контейнер, а потом проходил его с начала до конца.
    Вот именно это и стало тормозить быстродействие(до Х30). Ведь до этого я работал с найденными комбинациями "на лету". Неожиданный поворот...
    Есть программисты в треде, может быть такое?
    Почему обход контейнера такой медленный? Ведь фактически это обращение к ячейкам памяти.
    Ответить Цитировать
    550/741
    + 0
  • БиллиУбили @ 26.3.2020
    я сбрасывал найденные комбинации в контейнер, а потом проходил его с начала до конца

    Сейчас посмотрел прошлогодний проект. Хоть я и начал мерить производительность ближе к концу...но там контейнер на контейнере, да ещё и попытка обернуть в классы...возможно и из-за этого не удалось достигнуть быстродействия. Сейчас только обращение в дерево, никаких накоплений...
    Потихоньку заканчиваю разложение фантазии по шаблону. Должно выйти чуть-чуть быстрее, чем полный перебор. С одной стороны, мне не надо перебирать ВСЕ разложения карт по боксам, но с другой стороны, я трачу время на возможные теоретические, но не реализуемые на практике варианты(например, в теории я могу разложить Флаш/Флаш, а в реальности у меня 9 одномастных карт).
    Но, не это самое интересное. Кажется, появилась новая идея
    -фикс
    .
    А что, если закольцевать дерево? То есть сделать "второй" корень, в который будут вести все очки, которые набирает та или иная комбинация. Тогда мне не надо будет обходить всё дерево. Достаточно будет идти снизу вверх и все комбинации будут найдены "мгновенно".
    Красивое решение, как мне кажется.
    А может ли такое массив? Можно ли найти все фулхаусы без полного обхода массива HR[5]? А?
    Ответить Цитировать
    551/741
    + 0
  • БиллиУбили, вот тебе задача со звёздочкой

    Ты любитель просто так голову погреть

    На входе имеем бинарный код набора карт 0-3 шт, кодированные 2 в степени номера карт... 64 битным числом... 000001000000010000000000000000000000100

    Что нужно на выходе получить : все
    возможные комбинации из трёх карт (трипсы пары и хай) с другим набором карт , например с 3 карточным... Тем же способом закодированым...
    Кто решит с мин количеством тиков цпу тому от меня 50 баксов...

    1 день на решение, но должно хватить и пары часов мозголомки)
    Само собой полный перебор всех комбинаций или карт это слишком расточительно и ответом не является

    Пс для серьезного вида добавлю что решение такой "простой"* задачи лежит в основе алгоритмов решения почти любой карточной игры (холдем/Омаха / Китай и т.д. )линейным программированием, чем тс и занимается

    На будущее
    Задача с двумя звёздочками: добавим в колоду Джокеров

    Можете в личку отвечать конфиденциальность гарантируется
    Сообщение отредактировал c00l0ne - 27.3.2020, 11:33
    Ответить Цитировать
    382/882
    + 0
  • Добавим звёздочку и получим третью задачу

    джокеры в колоде и комбинации могут быть пяти карточными
    ... Награду можно оценить в к$
    Ответить Цитировать
    383/882
    + 0
  • БиллиУбили, кстати про тот алгоритм рекурентный который я тебе описывал ,
    вот такой бенчмарк получился :
    1 фантазия в секунду на 1 ядре
    wUh5DTSrSrWKicJ3P4dgyg.png

    32 х карточная)
    Ответить Цитировать
    384/882
    + 1
  • c00l0ne @ 27.3.2020
    1 фантазия в секунду на 1 ядре

    лол. Тут же 40 фант за 1 сек пацаны раскладывают...Погоди, на выходных доделаю , может и этот "рекорд" побью
    Ответить Цитировать
    552/741
    + 0
  • БиллиУбили @ 27.3.2020
    лол. Тут же 40 фант за 1 сек пацаны раскладывают...Погоди, на выходных доделаю , может и этот "рекорд" побью


    из 32 карт состоящих?) Как же ты читаешь сообщения тупо все таки

    Я думаю пацаны из 32 карт раскладывают ровно 0 фантазий за секунду, за минуту) и возможно за 5 минут )
    Ответить Цитировать
    385/882
    + 0
  • c00l0ne @ 27.3.2020
    Как же ты читаешь сообщения тупо все таки

    сорян, пока не понимаю, зачем раскладывать фантазию из 32 карт. А почему не из 33?
    Ответить Цитировать
    553/741
    + 0
  • БиллиУбили, ну это просто бенчмарк на скорость проверить ... из скольки карт 1 раздачу в 1 сек , фо фан
    кстати написалось все за 2 дня но 1600 строчек из них половина копипастом ... таблицы HR не использовал так и ... бинарно все комбы определил
    Ответить Цитировать
    386/882
    + 0
1 64 65 66 67 114
1 человек читает эту тему (1 гость):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.