非递归alpha beta修剪算法

时间:2014-07-23 11:10:08

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

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

1 个答案:

答案 0 :(得分: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)以及最优性(这是你从递归返回的条件)。
然后,您可以使用相同的逻辑来修改第一个方法。这个解决方案可以优化,我没试过。

如果您愿意,请尝试并告诉我它是否合适。