2017-03-09 29 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)."