我正在开发一种算法来玩动作线游戏。
该软件(在java中)构建了一个树,其中所有的棋子都可能在棋盘上移动。树的每个级别都充满了转弯的可能移动:
0级:对手发挥的第一步
等级1:我可以玩的可能动作
等级2:对手在第一次移动后可以进行的移动
......等等。
在动作游戏中,每个玩家以12个棋子开始,最多可以在8个方向上进行一次移动,因此1圈的最大可能移动次数为96次。这意味着每个级别的树由96 ^填充深度移动节点。
现在,当我计算最大深度为4的可能移动树时,软件应该使用
84 934 656(96 ^ 4)次一个treeNode对象所需的RAM空间内存对吗?更清楚的是,如果treeNode对象占用10个字节,那么4级树应该使用~850 MB。
这是我的节点类,我试图让它使用非常低的内存,只有3个实例属性:`public class MinNode {
public static int myColor;
public final MaxNode[] childNodes = new MaxNode[mainClass.NB_POSSIBLE_MOVES];
private byte nbChildren = 0;
public final byte startIndex;
public final byte endIndex;
public MinNode(final int[] currentBoard, final byte startIndex, final byte endIndex, final int depth){
this.startIndex = startIndex;
this.endIndex = endIndex;
if (depth <= mainClass.MAX_DEPTH){
computeMyPossibleMoves(currentBoard, depth);
}
}
private void computeMyPossibleMoves(final int[] currentBoard, final int depth){...}
// Only if move is valid
private void addMove(final int[] currentBoard, final byte startIndex, final byte endIndex, final int depth){
int buffer = currentBoard[endIndex];
currentBoard[endIndex] = currentBoard[startIndex];
currentBoard[startIndex] = mainClass.NO_PAWN;
childNodes[nbChildren++] = new MaxNode(currentBoard, startIndex, endIndex, depth + 1);
currentBoard[startIndex] = currentBoard[endIndex];
currentBoard[endIndex] = buffer;
}`
我通过用对手玩的移动来调用构造函数来初始化树构建。 MaxNodes和MinNodes基本相同,我只是将它们区分为将解析树的minimax算法。
我的问题是:如何在不出现内存错误的情况下达到更高的深度级别?
答案 0 :(得分:0)
您不必预先创建整个树,而只需在运行minimax算法时动态创建子树。
您还需要确保以depth-first search方式运行minimax(而不是breadth-first search),但情况可能已经如此。
这应该要求在任何给定时间存储不超过depth * branchingFactor
或depth
个节点(取决于实现)。