def get_dir(state, max_depth):
#Possible directions and their corresponding scores so far
paths = {'w':1,'a':1,'s':1,'d':1}
#Rate each direction
for dir in paths:
#Takes a game state and a direction as input and returns
#a list of all possible states that could occur from moving in that direction
children = successors(state, dir)
if children:
children = [children[0][:10], children[1][:10]]
#Weight the probability of the each state depending on if a 2 on or a 4 was spawned
weights = {0:.9,1:.1}
for section in weights:
for board in children[section]:
#PROBLEM HERE
paths[dir] += rank_branch(board, max_depth, (weights[section]*(1/(num_empty(board)))))
else:
paths[dir] = False
我使用上面的函数来选择在2048年移动的方向。我试图通过我们能够达到该状态的概率来加权每个州的启发式排名。
为了做到这一点,在每一层我将产生一块瓷砖的概率乘以它上面的数字(.9代表at,.1代表一个4)乘以它可能产生的地方数量(空的数量)砖)。
我的代码:
weights[section]*(1/(num_empty(board))))
当我打印出概率变量时,它总是很高。它一直认为我们能够使它达到一个特定状态的几率大于实际值?
答案 0 :(得分:0)
如果子变量中的每个板都是一个随机瓦片生成后的状态,那么你需要在空瓦片的数量上加1,因为新瓦片产生的地点在它产生之前是空的吗?
weights[section]*(1/(num_empty(board)+1)))
话虽如此,每次调用一个函数似乎有点傻,因为移动给定方向时获得状态的概率对于所有后继者是相同的(除了产生2个瓦片与4个瓦片时的差异)
计算概率的一个更好的方法是计算后继者的数量,并找出从该池中挑选出来的几率。
prob = {0:9/(len(children[0])*9)+len(children[1]),1:1/(len(children[0])*9)+len(children[1])}