【发布时间】:2014-03-31 01:33:31
【问题描述】:
我正在开发一种算法来玩 Lines of action 棋盘游戏。
该软件(在 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 算法。
我的问题是:如何在不出现内存不足错误的情况下达到更高的深度级别?
【问题讨论】:
-
@MrLore :我没有将电路板存储在任何地方......我总是将它作为方法中的参数传递。我只存储了 1 个板。顺便说一句,这是一个一维数组。您所指的 x, y 是 startIndex 和 endIndex 属性。
标签: java algorithm data-structures tree out-of-memory