3

我遵循維基百科文章上的pseducode,我認爲我得到了它的工作。但是,它會返回分數,而當我想知道我想要做什麼時,這並不完全有幫助。Minimax與Alpha-beta修剪,得到結果

我試過我認爲會是最好的舉動的一種方式,但我認爲它並沒有像我實際嘗試對抗它時那樣工作(國際象棋),AI使得有一定程度的延遲3.

級這裏是我的功能:

public static function alphaBeta(node, depth, alph, beta, team, tellTheMove:Boolean = false):* { 
     var pointer:ChessMove; 
     if (depth == 0) { 
      return scoreOf(node); 
     } 
     var childrenOf:Vector.<ChessMove > = returnPossibleMoves(node,team); 
     if (childrenOf.length == 0) { 
      return scoreOf(node); 
     } 
     if (team == 0) { 
      for (var i in childrenOf) { 
       var that:Number = alphaBeta(childrenOf[i],depth - 1,alph,beta,1); 
       if(tellTheMove){ 
       } 
       if (that > alph) { 
        alph = that; 
        if(tellTheMove){ 
         pointer = childrenOf[i]; 
        } 
       } 
       if (beta <= alph) { 
        break; 
       } 
      } 
      if(tellTheMove){ 
       return pointer; //Returns the move that's score last exceeded alpha. 
      } 
      return alph; 
     } else { 
      for (var j in childrenOf) { 
       var that2:Number = alphaBeta(childrenOf[j],depth - 1,alph,beta,0); 
       if (that2 < beta) { 
        beta = that2; 
       } 
       if (beta <= alph) { 
        break; 
       } 
      } 
      return beta; 
     } 
    } 

回答

4

深度3是對於像國際象棋的問題很少。在這個深度,大部分力量取決於你的最終評估功能。這種評估功能很難做到可以有效預測電路板的價值。

嘗試更簡單的東西,可以在更低的深度有效解決。 Tic-Tac-Toe是Min-Max第一次嘗試的非常好的遊戲。這是因爲最終的結果是衆所周知的。如果你正確地使用了算法,那麼你根本無法擊敗它。如果你使用Tic-Tac-Toe並且算法失效,那麼你知道你有一個錯誤。

還要注意的是,在某些情況下,最小 - 最大發揮最佳效果,但仍會看起來遲鈍到人類的對手。例如,如果沒有獲勝的機會,Min-Max將開始隨機播放,並進行非常愚蠢的動作。事實就是如此,因爲Min-Max希望對手也能發揮完美,而人類通常不會這麼做。有一些簡單的變化可以通過算法來改變這種行爲,並且在這種情況下min-max播放「延遲較小」。

+2

我想補充一點,如果評估函數非常簡單(僅用於材質),而且沒有靜止搜索,則在大多數位置,所有移動都會返回相同的分數,而Minimax將無法創建選擇。在這種情況下,將使用搜索到的第一步。 –

+0

謝謝!我試過tic tac腳趾,它工作正常。我會努力改進我的評估功能。 – apscience

+0

也嘗試獲得更高的深度。如果你使用alpha-beta修剪,你已經檢查過的所有路徑都會告訴你哪些路徑可以修剪,哪些路徑仍然需要擴展。所以如果你按照錯誤的順序展開路徑,你仍然需要展開幾乎整個樹。如果你先採取最好的路徑,那麼你的修剪將更加有效,因爲那時大部分的樹都不會被擴展。使用這個事實的通常方法是首先根據一些(快速)啓發式對擴展前的可能移動進行排序。這可以在相同的計算時間內導致更大的深度。 – LiKao