用于mini-max算法的Java动态树

时间:2016-06-19 20:37:26

标签: java algorithm tree minimax

我面临着为我的AI模块实现用于mini-max算法的树的问题。

我需要编写的树将有4个级别:root(0) - AI移动(1) - 玩家移动(2)和AI移动(3)。每个级别将包含 n 子项,并且将包含(董事会状态,字段速率和要移动的坐标)等字段。根据我在树的第三层计算,可能的子女数量约为25.000。我该如何实现呢?

目前,我已经实施了3个不同的ArrayList个对象,每个列表都针对特定级别:

  • firstDepthList - 包含具有可能的电路板状态,字段速率和要移动的坐标的对象;
  • secondDepthList包含具有可能的电路板状态的对象(对于firstDepthList中的每个元素),字段速率和要移动的坐标;和
  • thirdDepthList包含上面的对象 来自secondDepthList的元素。当然,我已将链表列在一起 登上并移动连续性。

或许你会推荐更好的解决方案?

1 个答案:

答案 0 :(得分:0)

Mini-max算法只需要一个值:max(或最小值,取决于级别数)。你不必存储所有树。

它可以实现为递归函数。并且没有创建许多状态,只有一个boardState使用(例如,国际象棋图从A移动到B可能会被还原)

double getRating(BoardState state, int currentPlayer, int depth){
     //current player has to be 1 or -1
     if (depth <= 0){
         return state.positionRating();
     }
     double bestRating = -Double.MAX_VALUE;
     for(Move m: state.possibleMoves(currentPlayer)){
         state.apply(m); // modify state
         double rating = currentPlayer * getRating(state, -currentPlayer, depth-1); 
         // player 1 wants to have biggest number, player -1: lowest
         bestRating = Math.max(bestRating, rating);
         state.revert(m) // restore state
     }
return bestState*currentPlayer;
}