编程概率允许AI决定何时在5张扑克牌中弃牌

时间:2017-03-09 12:40:34

标签: algorithm artificial-intelligence probability poker

我正在写一张人工智能玩5张扑克牌,你可以从手牌上丢弃一张牌,如果你愿意的话可以把它换成另一张牌。我的AI可以重视每一个可能的扑克牌as shown in the answer to my previous question。简而言之,它为每个可能的手分配一个唯一值,其中较高的值与更好/获胜的手相关。

我的任务是现在写一个函数,int getDiscardProbability(int cardNumber)给我的AI一个0-100的数字,关于它是否应该丢弃这张卡(0 = defintely不丢弃,100 =绝对丢弃)

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

然而,这个解决方案只是寻找任何更好的手,而不是区分单手好多少。例如,如果我的AI有一只手23457,它可以丢弃7为K,产生一个稍微好一点的牌(更好的高牌),或者它可以将7换成A或6,完成直 - 比高王更好的手(更高的价值)。

所以,当我的AI计算这个概率时,当它看到通过获得K来改善手牌时它会增加相同的数量,而不是当它看到可以通过获得A来改善手牌时或者6.因此,在计算这个概率时,我不知何故需要考虑我的手和每个可能的手的价值差异。用这个来实现这个目标的好方法是什么?

3 个答案:

答案 0 :(得分:2)

游戏一般都有鸡蛋问题:你想设计一个可以击败优秀玩家的人工智能,但你需要一个好的人工智能来训练你的AI。我假设你为一个有2个玩家版本的扑克制作人工智能,这个扑克有赌注但没有投注。

首先,我要注意的是,如果我有一张每个可能的扑克牌的胜率概率表(其中几乎没有真正不同的扑克牌),你可以编写一个告诉你预期的函数从您手中丢弃一组牌的价值:只需列举所有可能的替换牌并平均用手获胜的概率。没有那么多卡片要评估 - 即使你不忽视套装,而且你要更换最多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。但是,这个过程可能会发生振荡并且不会稳定下来。例如,如果在你的训练的一个阶段,你的AI倾向于吸引大手,那么计数器AI将倾向于非常保守地发挥,当它错过它的抽签时击败你的AI。对于一个非常保守的AI,一个稍微不那么保守的AI会做得更好。所以你倾向于得到一系列越来越不那么保守的人工智能,然后是一个引人注目的地方,你的人工智能再被一个极端保守的人再次击败。

但是对此的修复相对简单 - 只是以某种方式混合旧表和新表(一种标准方法是,在步骤i,将表替换为新的1 / i的加权平均值表和旧表的(i-1)/ i)。这具有不过度调整到最近迭代的效果。并且忽略由于假设而发生的一些细微细节(例如,忽略手中原始卡片的替换效果),这种方法将为您提供游戏理论上的最佳AI,如:"An iterative method of solving a game, Julia Robinson (1950)."

答案 1 :(得分:0)

一种简单(但不那么简单)的方法是使用某种具有手势组合概率的数据库(也许University of Alberta Computer Poker Research Group Database)。

这个想法是了解每个组合赢得多少百分比。并进行组合并比较每个可能的手的百分比。

例如,您有5张卡,AAAKJ,是时候丢弃(或不丢弃)。

  • AAAKJ有一个胜率(我忽略,让我们说75)
  • AAAK(放弃J)有78%(让我们说)。
  • AAAJ(放弃K)有x。
  • AAA(放弃KJ)有y。
  • AA(放弃AKJ)有z。
  • KJ(放弃AAA)有11(?)..
  • 等。

人工智能将保留那个具有较高成功率的组合。

答案 2 :(得分:0)

而不是计算有多少更好,你可以计算概率 Pi 的总和,即新手(带有交换卡)将获胜, i = 1,... 。,47。

这可能是一个艰难的电话,因为其他玩家因为你不知道他们的牌,因此,他们目前的获胜机会。为了更容易,可以应用某种近似值。

例如, Pi = N_lose / N 其中 N_lose 是使用 i 卡丢失到新手牌的牌数, N 是没有AI持有的5的手的总量。最后,您使用 Pi 的总和而不是count