2015-04-28 58 views
0
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年移動。我試圖衡量每個狀態的啓發式排名的概率,我們將能夠達到該狀態。Miscalculating遞歸狀態概率

要做到這一點,在每一層我乘以一個瓦片產生的概率與它上面的數字(.9代表at和.1代表一個4)乘以它可能產生的地方的數量(空的瓷磚)。

我給這家代碼:

weights[section]*(1/(num_empty(board)))) 

當我打印出來的概率變量,它總是要高。它不斷地認爲我們能夠達到某個特定狀態的機率比真正的大?

+1

這是在Python 2.x中,有沒有機會? – jonrsharpe

+0

是的,但我從__future__ –

+0

導入了部門,然後可以將其縮減爲[最小示例](http://stackoverflow.com/help/mcve),其中包含輸入以及預期和實際輸出?就目前而言,目前尚不清楚爲什麼你認爲存在問題,因此很難幫助你找到問題。 – jonrsharpe

回答

0

如果子變量中的每個棋盤在生成隨機拼貼後都是一個狀態,那麼您是否需要將1添加到空拼貼的數量上,因爲在新拼貼生成之前這個點是空的?

weights[section]*(1/(num_empty(board)+1))) 

這就是說,調用一個函數的每個時間似乎周圍是因爲得到的狀態的概率的位傻移動時一個給定的方向爲所有後繼相同(除了差產卵2個切片時vs 4個瓷磚)。

計算概率的一個更好的方法是隻計算後繼者,並計算出被選出池的可能性。

prob = {0:9/(len(children[0])*9)+len(children[1]),1:1/(len(children[0])*9)+len(children[1])} 
+0

哇,謝謝。加1似乎已經解決了這個問題。你能解釋爲什麼只有繼任者才能提出國家的概率? –

+0

@Jan Tsurugi生成2的所有狀態同樣可能被選中,因爲在向一個方向移動時合併次數總是相同的。新瓦片在合併發生後產生。 2個瓦片產生的可能性是4瓦片的9倍,所以我在計算2瓦片產卵的概率時將9除以9,並在計算4瓦片產卵的可能性時除以1。 –