algorithm - 对概率进行编程,让 AI 决定何时在 5 张牌扑克中弃牌

标签 algorithm artificial-intelligence probability poker

我正在编写一个 AI 来玩 5 张牌扑克,如果您愿意,您可以从手上丢弃一张牌并将其交换为另一张随机发的牌。我的人工智能可以评估每一手可能的扑克牌as shown in the answer to my previous question 。简而言之,它为每个可能的手牌分配一个独特的值,其中较高的值与更好/获胜的手牌相关。

我现在的任务是编写一个函数,int getDiscardProbability(int cardNumber),它为我的 AI 提供一个从 0 到 100 的数字,与是否应该丢弃这张卡有关(0 = 一定要丢弃)不丢弃,100 = 绝对丢弃)。

我想到的方法是通过将这张牌与牌组中的所有其他牌交换来计算每一种可能的牌(假设目前还剩下 47 张牌),然后将它们的每个值与当前牌进行比较,计算有多少个更好,因此 (count/47) * 100 是我的概率。

但是,这个解决方案只是寻找更好的牌,而不是区分一只手有多好。例如,如果我的 AI 有一手牌 23457,它可以丢弃 7 换取 K,从而产生稍微好一点的手牌(更好的高牌),或者它可以将 7 换成 A 或 A 6、完成顺子 - 比至高王更好的一手牌(更高的值(value))。

所以,当我的人工智能计算这个概率时,当它看到这手牌可以通过获得 K 来改善时,它会比当它看到这手牌可以通过获得 A 来改善时增加相同的数量或 6. 因此,在计算此概率时,我需要以某种方式将我的手牌和每手可能的手牌的值(value)差异考虑在内。实现这一目标的好方法是什么?

最佳答案

游戏通常存在先有鸡还是先有蛋的问题:你想设计一个可以击败优秀玩家的人工智能,但你需要一个好的人工智能来训练你的人工智能。我假设您正在为 2 人版本的扑克制作一个 AI,该版本有底注但没有投注。

首先,我要指出的是,如果我有一张每种可能的扑克手牌的获胜率概率表(令人惊讶的是,真正不同的牌手很少),人们可以编写一个函数来告诉您来自丢弃手中的一组牌:只需枚举所有可能的替换牌并平均该手牌获胜的概率。没有那么多牌可供评估——即使你不忽略花色,并且你要替换最多 3 张牌,你也只有 47 * 46 * 43/6 = 16215 种可能性。在实践中,有趣的可能性要少得多——例如,如果你不弃掉的牌并非都是同花色的,你可以完全忽略花色,而如果它们是同花色的,你只需要区分“同一套”替换为“不同套”替换。这比我描述的要稍微棘手一些,因为您必须小心地正确计算可能性。

然后你的AI可以通过枚举所有可能要丢弃的牌组来工作,其中有(5选0)+(5选1)+(5选2)+(5选3)= 1 + 5 + 10 + 10 = 26,然后选择期望最高的那个,如上面计算的那样。

先有鸡还是先有蛋的问题是你没有每手牌的胜率概率表。我在这里描述了一种不同的扑克相关游戏的方法,但想法是相同的:http://paulhankin.github.io/ChinesePoker/ 。这种方法不是我的想法,本质上相同的想法也用于例如 piosolver 等真实扑克变体的博弈论最优解算器中。

方法如下。

从以某种方式组成的概率表开始。也许您只是开始假设最高等级的手牌 (AKQJTs) 赢得 100% 的时间,而最差的手牌 (75432) 赢得 0% 的时间,并且两者之间的概率是线性的。没关系。

现在,用您的 AI 模拟数万手牌,并计算每个手牌等级的玩频率。您可以使用它来构建新的获胜率概率表。这个新的胜率概率表(忽略一些小的理论问题)是你的人工智能的最佳对抗策略,因为使用这个表的人工智能知道你的原始人工智能最终每手牌的可能性有多大,并以最佳方式对抗那个。

现在自然的想法是再次重复这个过程,并希望这能产生越来越好的人工智能。然而,这个过程可能会振荡而不是稳定下来。例如,如果在训练的某个阶段,你的 AI 倾向于听大牌,那么对手 AI 就会倾向于非常保守地打牌,当你的 AI 错过听牌时,它会击败你的 AI。面对非常保守的人工智能,稍微不那么保守的人工智能会做得更好。因此,你会倾向于得到一系列越来越不保守的人工智能,然后出现一个临界点,你的人工智能再次被极端保守的人工智能击败。

但是解决这个问题相对简单——只需以某种方式混合旧表和新表(一种标准方法是在步骤 i 处,用新表的 1/i 的加权平均值替换表)表和旧表的 (i-1)/i)。这具有不过度调整最近迭代的效果。并且忽略一些因假设而发生的小细节(例如,忽略你手上原始牌的替换效果),这种方法将为你提供游戏理论上最优的AI,如: "An iterative method of solving a game, Julia Robinson (1950)." 中所述。

关于algorithm - 对概率进行编程,让 AI 决定何时在 5 张牌扑克中弃牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42695658/

相关文章:

algorithm - 这个嵌套 for 循环的运行时间是多少?

找到方链排列的算法

java - 使用 Dijkstra 的多条最短路径

python - gensim 4.1.2 的 KeyedVectors\' object has no attribute\' wv

c - 如何找到两个单词相差多少距离>>有没有最短的方法

python - 属性错误 : module 'tensorflow.compat.v2.__internal__' has no attribute 'dispatch'

nlp - 如何预测一个句子的概率?

algorithm - HMM 正向算法中的下溢

c++ - 如何在 C 中以确定的概率处理命令?

artificial-intelligence - 对分类器进行分类