2015-08-09 174 views
2

我正在實施一個二十一點遊戲與最小極大樹計算的概率和自動播放依賴於這個概率。大酒杯迷你極小算法

假設,我們用1臺發揮,第一場比賽莊家需要:「」和球員需要「」,使總得分是12的球員。

在這種情況下,首先我試圖檢查玩家的所有可能概率看臺的決定。

如果玩家代表

我仍然卡在甲板上是這樣的:甲板 結構(K,V)K:卡號,V:卡

{1: 4, 2: 4, 3: 4, 4: 4, 5: 2, 6: 4, 7: 3, 8: 4, 9: 4, 10: 16} 

計數現在,經銷商應該通過數17的一些例子可以是這樣的:

5(base card) + 1(11) + 1 = 17 (possibility of this hand : 4/49 * 3/48) 
5(base card) + 1(11) + 2 = 18 (possibility of this hand : 4/49 * 4/48) 
...... 
5 (base card) + 10 + 1 + 1 = 17 (possibility of this hand : 16/49 * 4/48 * 3/48) 

我的問題是,我怎麼能計算出這一切的採購訂單責任,並計算玩家決定權的最終可能性。我無法弄清楚如何編碼這些數字組合。

編輯:

我發現這個代碼計算可能的組合。它與我看起來很相似。我需要改變這個問題,我希望我能做到。

def subset_sum(numbers, target, partial=[]): 
    s = sum(partial) 

    # check if the partial sum is equals to target 
    if s == target: 
     print "sum(%s)=%s" % (partial, target) 
    if s >= target: 
     return # if we reach the number why bother to continue 

    for i in range(len(numbers)): 
     n = numbers[i] 
     remaining = numbers[i+1:] 
     subset_sum(remaining, target, partial + [n]) 


if __name__ == "__main__": 
    subset_sum([3,9,8,4,5,7,10],15) 

    #Outputs: 
    #sum([3, 8, 4])=15 
    #sum([3, 5, 7])=15 
    #sum([8, 7])=15 
    #sum([5, 10])=15 

回答

0

這個遊戲並不是真正的極小極大的情況。

在minimax中,兩個玩家進行從已知位置確定的移動,並考慮另一個玩家確定其最佳移動的移動。

由於這個例子有兩個玩家,玩家(他實際上並沒有移動,因爲他改變了棋盤的狀態,除了決定是否立場)和莊家(他只隨機動作),在具有隨機選項的未知棋盤狀態下,特別不能使用minimax。

在這種情況下,算法將相當工作良好。將開始與5和加入7:

base = 5 
cards = [7] 

使用下面的公式:

if sum(cards) + base < 16: 
    hit() 
else: 
    if evalStand() > minStandChance: 
    hit() 

沒有必要因爲玩家需要獲得另一張牌,所以計算卡牌樹是正確的。

之後,漸漸地位之後的概率:

def evalStand(): 
    hand = base + sum(cards) 
    sums = [] 
    for cardValue, count in cards.items(): 
    for i in range(count): 
     sums.append(cardValue + hand) 
    return len([i for i in sums if i <= 21])/float(len(sums)) 

簡單地過濾掉可能的手裏,並仍然得到球員< = 21,在這個遊戲中常用的策略是蠕變比這個模擬了它。如果在下一輪之後站的概率小於0.5,則玩家可以停止獲得卡牌。

再說一次,這種情況對極小極小型號來說並不好,但這應該是一個很好的替代解決方案。

編輯:

由於@NickLarsen指出,minStandChance代表啓發式。沒有一個100%準確的變量,但是可以根據AI想要玩的風險進行調整。 (接近於0是有風險的,接近於1是保守的)。

+0

由於遊戲的隨機性,您認爲最大極小不適用,但是有一個稱爲expectimax的變體,專門爲此案開發。你的解決方案有2個常量(16和minStandChance),它們模擬「經驗法則」,而不是正確地模擬遊戲的實際狀態。 –

+0

@NickLarsen當你說應該使用expectimax時,你是否意味着平均事件是在17-21和數窗口中出現的機會,並且玩家的選擇是否停留?我不認爲expectimax比我已經更準確地模擬了這種情況,因爲計算超過1回合是沒有意義的,因爲玩家對牌的總和沒有影響。根據遊戲的簡單規則,這種遊戲的嚴格機械遊戲排除了使用決策制定策略,無論是否有利於繼續或不繼續。 – bcdan

+0

事件代表狀態變化;在這種情況下,即使在兩名球員之間,也可以在一場比賽中得到很多卡。經驗法則是在大多數時間都是正確的啓發式,並不一定是時間。黑色插孔足夠複雜,我預計在16或更少的情況下,至少在1種情況下會出現錯誤,而且幾乎可以肯定,您無法找到始終100%正確的minStandChance值。如果有的話,你應該把它添加到你的解決方案。 –