2016-06-24 62 views
0

我原本是使用遞歸來創建我的樹,只有我有評分的樹葉,但是因爲我需要知道深度才能知道是最小還是最大,我切換到depth=0開始。然而,由於有時候currentRoot.ia = None因爲沒有得分已經被計算得那麼深。我想要的是跟蹤深度,並找到currentRoot.ia評估過的最深的葉子,以及每個葉子深度的最小值。Python遞歸樹或fowards?修復和簡化代碼

我檢查是否有孫輩,因爲當我評估一個得分的位置時,我還添加了一個給出該得分的移動節點,所以在葉節點處不應該有任何分數。得分來自發動機的角度,所以我必須在奇怪的深處否定,儘管如果我總是最大化得分,也許我可以逃避。

def minimax(currentRoot, depth): 
    if len(currentRoot.children) > 0 and len(currentRoot.children[0].children) > 0: #There are grandchildren 
     for child in currentRoot.children: 
      minimax(child, depth+1) 
    else:   
     if depth%2 == 0: 
      currentRoot.score = currentRoot.ia 
     else: 
      currentRoot.score = -currentRoot.ia 
     return currentRoot.score 

    measure = min if depth % 2 else max 
    currentRoot.score = measure(c.score for c in currentRoot.children) 
    return currentRoot.score 
+0

那麼......問題是什麼? –

+0

@Tadhg currentRoot.score = measure(c在currentRoot.children中的c.score) TypeError:無法訂購的類型:NoneType Josh

+0

下一次請在問題中發佈錯誤,如果可能的話整個回溯。 –

回答

0

我在想這可能會解決我的錯誤,但我不覺得它是優雅的。我遞歸直到我發現一個值,所以ia不是無,並且我深入下去,直到我發現我在樹上沒有被進一步評估的樹葉中。

def minimax(currentRoot, depth): 
    notAtLeaf = True 
    if currentRoot.ia is None: 
     notAtLeaf = False 
     for child in currentRoot.children: 
      minimax(child, depth+1) 
    else: #currentRoot.ia is not None 
     for child in currentRoot.children: 
      if child.ia is not None: 
       notAtLeaf = False 
       minimax(child, depth+1) 

    if notAtLeaf: 
     if depth%2 == 0: 
      currentRoot.score = currentRoot.ia 
     else: 
      currentRoot.score = -currentRoot.ia 
     return currentRoot.score 

    measure = min if depth % 2 else max 
    currentRoot.score = measure(c.score for c in currentRoot.children) 
    return currentRoot.score 
+0

其實這有一個問題currentRoot.score = measure(c在currentRoot.children中的c.score) TypeError:無法訂購的類型:NoneType Josh