Эффективность скрипта - симуляторы покера для статистики - PullRequest
0 голосов
/ 16 апреля 2019

Мой вопрос больше относится к логике, чем к самому кодированию: я строю скрипт на python для имитации покерных рук и получения статистики из него.Мой код очень хорошо подходит для назначения и сравнения рук, и единственным узким местом для моего сценария является получение наилучшей комбинации карт для каждого игрока: симуляция для омахи - каждый игрок получает 4 карты, а на доске 5 карт.Каждый игрок должен использовать наилучшую комбинацию из 5 карт (2 с руки игрока и 3 с доски).

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

Например, у игрока A есть карты A1A2A3A4, а на доске B1B2B3B4B5:

Сначала я сравниваю все возможные руки, которые игрок A может получить: [A1A2B1B2B3, A1A2B1B2B4, A1A2B1B2B5, ..., A3A4B3B4B5] и получите лучшую руку (это 60 комбинаций от каждого игрока).

Сделайте это для всех игроков, а затем проверьте, у кого есть рука победителя.

Мой вопрос: как вы думаете, есть ли способ получить лучшую руку каждого игрока, не проверяя все 60 комбинаций?

Мне потребовалось 16 часов, чтобы выполнить ~ 6,5 миллиардов итераций (~ 2,5 миллиона рук x60 комбинаций досок х 40 итераций на руку).

Не могли бы вы также оценить эффективность?Я не знаю, пытаюсь ли я сделать что-то невозможное, чтобы сделать это здесь = P

РЕДАКТИРОВАТЬ - РЕШЕНО

Спасибо за вклад, ребята.В конце концов я решил это с помощью битовых манипуляций:

https://codereview.stackexchange.com/questions/217597/forming-the-best-possible-poker-hand?noredirect=1#comment421020_217597

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Зависит от того, как работает ваша функция оценки. Если у вас просто есть черный ящик, который берет 5-карточную руку и дает оценку, вы не можете ничего сделать, кроме как накормить его всеми 60 5-карточными руками. Но если его можно разбить на части, некоторые из них можно будет обойти.

Мой код в onejoker, например, представляет собой 5-шаговый обход ориентированного ациклического графа, поэтому я создал специальную функцию для 7 карт, которая пропускает повторение некоторых шагов для комбинаций, начинающихся с одинаковых карт. Он по-прежнему оценивает все 21 (7 выбирают 5) комбинаций, но менее чем за 5 * 21 шагов. Вы можете сделать что-то подобное для рук Омахи.

0 голосов
/ 17 апреля 2019

Я бы не стал делить на 5-сильные руки:

  • Использовать коллекцию. Счет на руке с 9 картами для проверки 4k, fh, 3k, 2p, p
  • Используйте collection.Counter на карте (fget_suit, hand), чтобы проверить наличие сбрасываний
  • Проверьте наличие стритов, если необходимо, с помощью Counter (xy для x, y в zip (hand [1:], hand))

Если вы действительно хотите увидеть лучшую пятикарточную комбинацию каждого игрока:

  • Дамп младших 4 (если у вас их четыре) непарный, неподходящий, неподключенные карты.
  • Это не решит все проблемы, но значительно уменьшит проблему
...