2017-03-09 21 views
1

我正在写一张AI来玩5张牌扑克,在那里你可以放弃手中的一张牌并随机换成另一张牌如果你愿意的话,处理一件。我的AI可以珍惜每一支可能的牌手as shown in the answer to my previous question。简而言之,它为每只可能的牌赋予一个独特的值,其中较高的值与一只更好的/获胜的牌相关。编程一个概率,让AI决定何时丢弃一张卡或不在5张牌扑克

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

我想到的方法是通过将卡片换成卡片中的每张卡片(假设现在还有47张卡片),然后将它们的每个值与当前手相比较来计算每个可能的手,计算有多少个更好,所以(count/47) * 100是我的概率。

但是,这种解决方案只是寻找任何更好的手,而不是区分单手是多么好的。例如,如果我的AI有手牌23457,它可以丢弃7个K,产生一个稍微好一点的牌(更好的牌),或者它可以交换一个A或一个6,完成直线 - a比高级国王好得多的手(更高的价值)。因此,当我的AI正在计算这个概率时,当它看到通过获得K可以改善手部比当它看到通过获得一个手部可以改善手部时会增加的概率时,它会增加相同的量。 A或6.因此,当计算这个概率时,我需要考虑我手上和每个可能手中的价值差异。什么是实现这一目标的好方法?

+0

听起来像你应该不关心卡片本身,而是完整的手牌,所以你需要首先评估可能的4张牌手牌(考虑所有5张不同的4张牌手牌)以及获得每张牌所需牌面的几率。然后根据该“机会”得分评估当前得分。 – LordNeo

+0

在“评估可能的4张牌手牌(考虑所有5张不同的4张牌手牌)”时,你“失去了可能的4张牌手牌”,是否意味着牌组中所有可能的4张牌组合? “5个不同的4张牌手”来自哪里? – KOB

+0

查看[期望值](https://en.wikipedia.org/wiki/Expected_value)。您可能想要放弃提供最高预期值的卡(如果它高于您当前手的数值)。 –

回答

0

一个简单的(但不是那么简单)的方法是使用某种数据库与手的组合概率(可能为University of Alberta Computer Poker Research Group Database)。

这个想法是逐渐了解每个组合的胜率有多少百分比。并进行组合并比较每个可能的手的百分比。

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

  • AAAKJ有胜率(我忽略了,可以说75)
  • AAAK(discarting十)有78个(比方说)。
  • AAAJ(discarting K)has x。
  • AAA(discarting KJ)has y。
  • AA(discarting AKJ)有z。
  • KJ(discarting AAA)有11(?)..
  • 等。

而AI会继续从中获得了成功率较高的组合之一。

+1

他只能丢弃1张牌,所以他需要评估5张牌,然后每张4张牌组合,然后得到可能的结果。 – LordNeo

+0

是的,如果是这样的话,只比较4张牌手组合。 – vivoconunxino

+1

我实际上可以丢弃0-3卡,我只是用1来保持我的解释简单,然后我可以改变并应用丢弃1张卡丢弃2张和3张卡的解决方案 – KOB

0

相反计数的多少是更好的,你可以计算概率的总和丕新的手(与交换卡)将获胜, = 1,...,47

这因为其他球员可能是一个艰难的呼叫,因为你不知道他们的牌,因此,他们目前的胜利机会。为了更容易,也许可以应用某种近似。

例如,PI = N_lose/N其中N_lose是手的那样会丧失到新的手个卡中的金额,并Ñ是手的总的可能量而不5人工智能持有。最后,您使用总和Pi而不是count

+0

哇,vivoconunxino忍者:)。 –

1

一般的游戏都有鸡蛋问题:你想设计一个能打败一个好玩家的AI,但是你需要一个好的AI来训练你的AI。我会假设你正在为一个有玩家但没有投注的双人扑克版扑克进行人工智能。

首先,我会注意到,如果我有一张每个可能的扑克牌手(其中有几乎真的不同的扑克牌)的胜率概率表,可以编写一个函数来告诉您期望值从丢弃手中的一套牌:简单列举所有可能的替换牌,并用手平均获胜的概率。没有那么多卡要评估 - 即使你不忽视西装,并且你正在更换最多3张卡,你只有47×46×43/6 = 16215种可能性。在实践中,有很多有趣的可能性 - 例如,如果你没有丢弃的牌不是完全相同的花色,你可以完全忽略花色,如果它们是相同的花色,你只需要区分“同一套”替换为“不同套装”替换。这比我描述的稍微复杂一些,因为你必须小心计算可能性。 (5选择0)+(5选择1)+(5选择2)+(5选择3)= 1 + 5然后你的AI可以通过枚举所有可能的卡组来放弃+ 10 + 10 = 26,并选择最高期望值,如上所述。

鸡蛋问题是你没有每手胜算概率表。我在这里描述了一个不同的扑克相关游戏的方法,但这个想法是相同的:http://paulhankin.github.io/ChinesePoker/。这种方法不是我的想法,基本上相同的想法用于例如游戏理论最佳解算器,以用于真正的扑克变体,如piosolver。

以下是方法。

以某种方式组成的概率表开始。也许你刚开始认为最高等级牌(AKQJT)赢得100%的时间,最差的牌(75432)赢得0%的时间,并且概率之间是线性的。这并不重要。

现在,用您的AI模拟成千上万的手并计算每个手牌的播放频率。你可以用它来构建一个新的胜率概率表。这个新的胜率概率表(忽略了一些次要的理论问题)是对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)."