【问题标题】:Algorithm for board game and heap problems棋盘游戏和堆问题的算法
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 我不是在解析树(或搜索),而是在构建它,但它的分支因子太大以至于在 4 级之后它太大并且占用太多内存。
  • 那么不要构建整个树,只需在执行 DFS 时动态创建它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多