计算递归状态概率

时间:2015-04-28 16:15:42

标签: python recursion probability solver

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))))

当我打印出概率变量时,它总是很高。它一直认为我们能够使它达到一个特定状态的几率大于实际值?

1 个答案:

答案 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])}