我面临着为我的AI模块实现用于mini-max算法的树的问题。
我需要编写的树将有4个级别:root(0) - AI移动(1) - 玩家移动(2)和AI移动(3)。每个级别将包含 n 子项,并且将包含(董事会状态,字段速率和要移动的坐标)等字段。根据我在树的第三层计算,可能的子女数量约为25.000。我该如何实现呢?
目前,我已经实施了3个不同的ArrayList
个对象,每个列表都针对特定级别:
firstDepthList
- 包含具有可能的电路板状态,字段速率和要移动的坐标的对象; secondDepthList
包含具有可能的电路板状态的对象(对于firstDepthList
中的每个元素),字段速率和要移动的坐标;和thirdDepthList
包含上面的对象
来自secondDepthList
的元素。当然,我已将链表列在一起
登上并移动连续性。或许你会推荐更好的解决方案?
答案 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;
}