我正在實施一個二十一點遊戲與最小極大樹計算的概率和自動播放依賴於這個概率。大酒杯迷你極小算法
假設,我們用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
由於遊戲的隨機性,您認爲最大極小不適用,但是有一個稱爲expectimax的變體,專門爲此案開發。你的解決方案有2個常量(16和minStandChance),它們模擬「經驗法則」,而不是正確地模擬遊戲的實際狀態。 –
@NickLarsen當你說應該使用expectimax時,你是否意味着平均事件是在17-21和數窗口中出現的機會,並且玩家的選擇是否停留?我不認爲expectimax比我已經更準確地模擬了這種情況,因爲計算超過1回合是沒有意義的,因爲玩家對牌的總和沒有影響。根據遊戲的簡單規則,這種遊戲的嚴格機械遊戲排除了使用決策制定策略,無論是否有利於繼續或不繼續。 – bcdan
事件代表狀態變化;在這種情況下,即使在兩名球員之間,也可以在一場比賽中得到很多卡。經驗法則是在大多數時間都是正確的啓發式,並不一定是時間。黑色插孔足夠複雜,我預計在16或更少的情況下,至少在1種情況下會出現錯誤,而且幾乎可以肯定,您無法找到始終100%正確的minStandChance值。如果有的話,你應該把它添加到你的解決方案。 –