【问题标题】:Possible optimizations for my alpha-beta pruning algorithm?我的 alpha-beta 修剪算法的可能优化?
【发布时间】:2022-02-17 03:14:10
【问题描述】:

我是一名新程序员,目前使用 Chess.js 和 Chessboard.js 为我的国际象棋引擎编写一个 javascript alpha-beta 修剪 minimax 算法。我已经实现了一个带有移动排序的基本算法。目前,它在 8 秒内评估了大约 14000 个节点,这太慢了。我的算法有问题还是我没有实现优化?我的算法无法在合理的时间限制内处理比深度 4 更深的任何东西。谢谢你。 附言“跟踪评估”功能只是评估每个特定的移动,以避免对叶节点处的板进行全面评估,这种优化使我的程序加快了大约 50%,但现在仍然很慢。

function minimax(game, depth, distanceFromRoot, alpha, beta, gameEval) {//returns gameEval
    if (depth === 0) {
      nodeNum++;
      if(game.turn() === 'b'){
        return (-gameEval / 8);
      }else{
        return (gameEval / 8);
      }
    }

    // run eval 
    var prevEval = gameEval;

    var moves = game.moves();
    moveOrdering(moves);
    var bestMove = null;
    var bestEval = null;
    for (let i = 0; i < moves.length; i++) {
      var gameCopy = new Chess()//dummy board to pass down
      gameCopy.load(game.fen())
      const moveInfo = gameCopy.move(moves[i])

      var curGameCopy = new Chess()//static board to eval, before the move so we know which piece was taken if a capture occurs
      curGameCopy.load(game.fen())
      var curEval = trackingEval(curGameCopy, prevEval, moveInfo, moves[i]); //returns the OBJECTIVE eval for the current move for current move sequence
      var evaluated = -minimax(gameCopy, depth - 1, distanceFromRoot + 1, -beta, -alpha, curEval);//pass down the current eval for that move
      if (evaluated >= beta) {
        return beta;
      }

      if (evaluated > alpha){
        alpha = evaluated
        bestMove = moves[i]
        bestEval = evaluated;
        if (distanceFromRoot === 0) {
          bestEval = evaluated;
        }
      }
    }
    
    if(distanceFromRoot === 0){
      setEval(-bestEval)
      return bestMove;
    }
    return alpha;
  }

【问题讨论】:

标签: javascript algorithm optimization chess alpha-beta-pruning


【解决方案1】:

很难说你做了什么优化,什么是合理的,因为我们只看到你的一小部分代码。您的评估可能很慢,您的移动顺序可能很慢/不正确,并且复制棋盘也比做出然后取消移动要慢。

您可以在这里找到很多关于如何加快算法速度的建议:https://www.chessprogramming.org/Search。 Chessprogramming.org 也是一个非常好的资源,用于开发您的引擎。

【讨论】:

    【解决方案2】:

    在进一步研究其他经典优化之前,我看到了两个快速优化。

    除非depth = 0,否则不要计算板的评估。我假设您在每一步都计算整个评估,这非常耗时且完全没有必要。

    不要每次都抄板子。这也很耗时。使用一块棋盘进行整个搜索,您可以在其中进行搜索时做出和取消动作。其伪代码为:

    for move in moves:
        board.do(move)  #the original (not a copy) board has made the move
        
        #Alpha-beta stuff like you did
    
        board.undo(move) #restore the board
        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多