脚本效率 - 用于统计的扑克模拟



我的问题更多的是关于逻辑而不是编码本身: 我正在构建一个python脚本来模拟扑克牌并从中获取统计数据。 我的代码非常适合分配和比较手牌,我的脚本的唯一瓶颈是为每个玩家获得最佳的牌组合: 模拟是针对奥马哈的 - 每个玩家获得 4 张牌,棋盘有 5 张牌。每个玩家必须使用5张牌的最佳组合(2张来自玩家的手牌,3张来自棋盘)。

问题是:到目前为止,我能想到的唯一方法是比较玩家可以拥有的每一手牌,然后与其他玩家进行比较。

例如,玩家 A 有牌A1A2A3A4,棋盘B1B2B3B4B5:

首先,我比较玩家A可以获得的所有可能手牌: [A1A2B1B2B3,A1A2B1B2B4,A1A2B1B2B5,...,A3A4B3B4B5]并获得他最好的一手牌(每个玩家的60种组合)。

对所有玩家执行此操作,然后检查谁拥有获胜的手牌。

我的问题是:你认为有没有办法让每个玩家都得到最好的牌,而不必检查所有60种组合?

我花了 16 个小时运行 ~65 亿次迭代(~250 万手 x 60 个棋盘组合 x 每手 40 次迭代)。

您能不能也谈谈效率?我不知道我是否在这里尝试了一些不可能完成的事情=P

编辑 - 已解决

感谢您的输入,伙计们。最后我通过使用位操作解决了它:

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

取决于评估函数的工作方式。如果你只有一个黑匣子,它拿着一手5张牌并产生评估,那么除了给它喂所有60张5张牌之外,你无能为力。但如果它可以被分解成碎片,也许可以绕过其中一些。

例如,我在 onejoker 中的代码是通过有向无环图的 5 步演练,因此我为 7 张卡片创建了一个特殊情况函数,该函数跳过了以相同卡片开头的组合重复一些步骤。它最终仍然评估所有 21(7 选择 5)组合,但步骤少于 5 * 21。你可以为奥马哈的手做类似的事情。

我不会分成 5 手硬手:

  • 使用集合。9张牌手上的计数器检查4k,fh,3k,2p,p
  • 使用集合。地图上的计数器(fget_suit,手)检查 冲
  • 检查直道,如果你必须用计数器(x-y 代表 x, y 在拉链(手[1:],手))

如果你真的想看看每个玩家最好的5张牌手:

  • 转储最低的 4 张(如果您有 4 张)未配对、未适合、未连接的卡。
  • 这不会解决所有问题,但它会大大减少问题。

最新更新