计算胜率 - 扑克机器人

3
我正在尝试使用Java构建扑克牌机器人。我已经编写了手牌评估类,并即将开始向神经网络输入数据,但我遇到了一个问题。我需要每一步(起手、翻牌前、翻牌后、转牌后和河牌后)每一手牌的胜率。
我的问题在于,有52张牌,5张牌的组合有2598960种。因此,我需要为每个可能的手牌存储2598960个胜率。这个数字非常庞大,而且这些只是我需要计算河牌胜率的情况。
所以我有两个选择:
  1. 为每个可能的手牌和每个可能的牌堆找到胜率,并在启动应用程序时加载它们,但会占用过多内存。
  2. 即时计算胜率,但会缺乏处理能力。
是否有第三种更好的方法来解决这个问题?

2
你需要在哪里运行你的程序?200万个数字(甚至更多)对于任何现代计算机似乎都不是问题。 - joanlofe
不仅仅是两百万个数字,而是2.6m * 可能的手牌组合。可能的手牌组合接近1000种,所以仅河牌就有26亿的胜率。 - dirac
2个回答

0

忽略颜色怎么样?从52个可能的值中,你只剩下13个。你只有6175个选项。当然,颜色对于同花顺很重要 - 但在这里,它几乎是二进制的 - 所有颜色都相同还是不同?所以我们有12350种可能性(包括一些不可能的组合,实际上与其他数字一样,一个数字出现了不止一次,因此颜色必须不同,实际上只有7462种可能性)。

如果顺序很重要(例如起手牌、翻牌、转牌或者叫什么),那么可能性会更多,但仍然比你的两百万少得多。尝试简化你的问题,你会发现它们可以被解决。


你不能忽略颜色。 - dirac
我并没有完全忽略它。我处理了刷新操作,还有其他的我错过了吗? - Vlasec
哦,我没想到 - 你是在说德州扑克对吧?那么我猜这可能会有点更加复杂,因为总共有七张牌。但是还是尽量简化一下吧。 - Vlasec

0

第三个选项是使用磁盘...但我的首选是根据需要计算赔率。

为什么需要计算所有5张牌的组合,因为很多这样的手牌都是同样有价值的,由于有4种花色,所以在手牌之间存在重复。

个人认为,应该根据打败你手牌的手数和你手牌打败的手数来评估你的手牌。从这里可以通过乘以活跃手数来计算你赢得桌面的概率。


使用磁盘?那是什么? - dirac
硬盘是应用程序之外的一些持久存储,例如一个手牌赔率数据库,您可以随时查询。它会很大,至少几个千兆字节。 - David Petran
我认为这是最糟糕的选择。 - dirac
@dirac 存储所有可能手牌胜率的方式都是最差的选择,无论您选择将它们存储在哪里。另一个问题是,如果您的机器人要基于玩家所持任意两张牌(因此基于玩家可能拥有的所有牌的完整组合)做出决策,那么您的机器人将会输掉比赛... 如果玩家是合理的,他们不会打“任意牌”,而是会打一定范围内的牌(根据到河流的操作而模糊定义),这将从您基于的所有手牌中消除许多可能性。 - mah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接