大酒杯迷你极小算法
问题描述:
我正在实施一个二十一点游戏与最小极大树计算的概率和自动播放依赖于这个概率。大酒杯迷你极小算法
假设,我们用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
答
这个游戏并不是真正的极小极大的情况。
在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是保守的)。
由于游戏的随机性,您认为最大极小不适用,但是有一个称为expectimax的变体,专门为此案开发。你的解决方案有2个常量(16和minStandChance),它们模拟“经验法则”,而不是正确地模拟游戏的实际状态。 –
@NickLarsen当你说应该使用expectimax时,你是否意味着平均事件是在17-21和数窗口中出现的机会,并且玩家的选择是否停留?我不认为expectimax比我已经更准确地模拟了这种情况,因为计算超过1回合是没有意义的,因为玩家对牌的总和没有影响。根据游戏的简单规则,这种游戏的严格机械游戏排除了使用决策制定策略,无论是否有利于继续或不继续。 – bcdan
事件代表状态变化;在这种情况下,即使在两名球员之间,也可以在一场比赛中得到很多卡。经验法则是在大多数时间都是正确的启发式,并不一定是时间。黑色插孔足够复杂,我预计在16或更少的情况下,至少在1种情况下会出现错误,而且几乎可以肯定,您无法找到始终100%正确的minStandChance值。如果有的话,你应该把它添加到你的解决方案。 –