【问题标题】:Programming a probability to allow an AI decide when to discard a card or not in 5 card poker编程一个概率以允许 AI 在 5 张牌扑克中决定何时丢弃一张牌
【发布时间】:2017-03-09 12:40:34
【问题描述】:

我正在编写一个 AI 来玩 5 张牌扑克,如果你愿意,你可以从手上丢弃一张牌,然后将其换成另一张随机发的牌。我的 AI 可以评估每一手可能的牌 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 或 6,完成顺子- 比高 K 好得多的牌(价值高得多)。

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

【问题讨论】:

  • 听起来你不应该关心牌本身,而是整手牌,所以你需要首先评估可能的 4 手牌(考虑到所有 5 种不同的 4 手牌)和赔率获得每个人需要的卡。然后根据“机会”分数评估当前分数。
  • 你在“评估可能的 4 张牌手(考虑所有 5 种不同的 4 张牌手)”时让我有点迷失了——“可能的 4 张牌手”是指 4 的所有可能组合吗?一副牌里的牌?而“5张不同的4张牌”又是从哪里来的呢?
  • 查看expected value。您可能想要丢弃给您最高期望值的牌(如果它高于您当前手牌的值)。
  • @KOB 你手上有 5 张牌,所以你有 5 个“4 牌”组合,所以首先你评估你当前的手牌,然后评估所有这些 4 牌手,然后是转换的几率将那些 4 张牌变成比现在更好的 5 张牌。
  • @NicoSchertler 我刚刚发布了一个类似的问题,关于我想要实现的预期值及其问题。主要问题是该函数需要返回一个整数 0-100,这将作为我的 AI 决策的指南。如果我使用期望值,我是否应该找到产生最高正期望值的要丢弃的卡片并告诉我的 AI 100% 丢弃这些卡片? math.stackexchange.com/questions/2178086/…

标签: algorithm artificial-intelligence probability poker


【解决方案1】:

游戏一般都有一个鸡蛋问题:你想设计一个可以击败优秀玩家的 AI,但你需要一个优秀的 AI 来训练你的 AI。我假设你正在为一个有底注但没有下注的 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。但是,该过程可能会振荡而不是稳定下来。例如,如果在您训练的某个阶段,您的 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)."

【讨论】:

    【解决方案2】:

    一个简单(但不是那么简单)的方法是使用某种具有手组合概率的数据库(可能是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 个(?)..
    • 等等..

    AI 会阻止组合中成功率较高的那个。

    【讨论】:

    • 他只能出1张牌,所以他需要评估5张手牌,然后是每4张牌的组合,然后是可能的结果。
    • 是的,如果是这样的话,只比较四张牌组合。
    • 我实际上可以弃0-3张牌,我只是用1来保持我的解释简单,然后我可以改变并应用弃1张牌的解决方案来弃掉2张和3张牌
    【解决方案3】:

    您可以计算新手(已交换牌)获胜的概率总和 Pi,而不是计算多少更好,i = 1, .. ., 47.

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

    例如,Pi = N_lose / N 其中 N_lose 是第 i 张牌输给新手牌的手牌数量, N 是没有 AI 持有的 5 手牌的总可能手数。最后,您使用 Pi 的总和而不是 count

    【讨论】:

    • 哇,vivoconunxino ninja'd me :).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多