棋盘游戏和堆问题的算法

时间:2014-03-31 01:33:31

标签: java algorithm data-structures tree out-of-memory

我正在开发一种算法来玩动作线游戏。

该软件(在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算法。

我的问题是:如何在不出现内存错误的情况下达到更高的深度级别?

1 个答案:

答案 0 :(得分:0)

您不必预先创建整个树,而只需在运行minimax算法时动态创建子树。

您还需要确保以depth-first search方式运行minimax(而不是breadth-first search),但情况可能已经如此。

这应该要求在任何给定时间存储不超过depth * branchingFactordepth个节点(取决于实现)。