【问题标题】:non-recursive alpha beta pruning algorithm非递归 alpha beta 剪枝算法
【发布时间】:2014-07-23 11:10:08
【问题描述】:

我要在硬件上实现一个游戏应用程序 (fpga),由于可识别的硬件困难,我无法实现函数递归。 我刚刚在 minimax 树上搜索了非递归 alpha-beta 修剪算法。 不幸的是,没有找到合适的。任何使用堆栈或其他数据结构解决递归问题的算法或实现都将受到赞赏。

【问题讨论】:

  • 在您的环境中是否可以使用自制或预定义的堆栈,也许是我的数组方式?从概念上讲,没有递归就无法完成。可以使用什么语言?
  • 是的,可以使用堆栈。从概念上讲,任何递归函数都可以通过自制堆栈来实现,就像编译器使用程序堆栈完成这项工作一样! c/c++ 更合适,但算法是要点。
  • 好的,你有任何可以开始的极小极大算法的实现吗?如果是,则问题主要是使用堆栈实现递归,但是如果不参考具体实现,这有点困难。此外,不仅要处理调用参数,还要处理返回值。
  • 您是否尝试过实现迭代 DFS? en.wikipedia.org/wiki/Depth-first_search

标签: algorithm recursion artificial-intelligence minimax non-recursive


【解决方案1】:

看看我的 alpha-beta maximin 代码,我有一个建议:

我的算法中只有一种递归方法,大概是这样的:

/** 
  * Returns maximin value of node with alpha-beta pruning for a certain level of forecasting.
     */
double getMaxAlphaBeta(Node currentState, Player player, int level, double alpha, double beta) {
// [ . . . ]
if(player == MAX){
for(State s : currentState.nextStates){
   utility = getMaxAlphaBeta( s, MIN, level - 1, alpha, beta);
   if (utility > alpha)
      alpha = utility;
   if (alpha >= beta)
      break;
}
}
else{ // [. . .] MIN is playing, do the same things with oppisite sign }

return newBeta;
}

这个方法被另一个方法调用,像这样:

public Action getMinimaxStrategy(Node currentState, Player player, int level) {
    double max = this.getMaxAlphaBeta(currentState, player, level, -inf, +inf);
// [ . . . ]

我要做的是将第二种方法更改为:

public Action getMinimaxStrategy(Node currentState, Player player, int level) {
    DATA max = new DATA(currentState);
    for(!max.isOptimal){
    Array<Node> nextNodes = max.currentState.getNextNodes();
    for(Node max.s : nextNodes){
        max = this.getMaxAlphaBeta(currentState, player, level, currentAlpha, currentBeta);
        // [ . . .]
    }
    }
    // [ . . . ]

其中 DATA 是一个数据结构,其中包含您将作为递归参数传递的所有内容(当前状态、玩家、级别、alpha、beta)以及最优性(这是您将从递归返回的条件)。
然后你可以使用相同的逻辑来修改第一种方法。这个方案可以优化,我没试过。

如果你喜欢就试试,然后告诉我好不好。

【讨论】: