javascript - 极小极大算法不适合国际象棋中的队友

标签 javascript node.js artificial-intelligence chess minimax

我的目标是编写一个还不错的国际象棋引擎,在下面的位置中,它是 2 中的一个伙伴,引擎应该很容易找到深度为 4-5 的国际象棋引擎。

Chess board with FEN: rr2k3/8/8/8/8/8/8/4K3 (black to play)

AI 的第一个 Action 是 Ra2 来困住白王,白王转到 f1,AI 没有交配,而是将车移动到 c2。

  var initial_depth = depth;
  var bestMove = null;
  var nodes = 0;
  var ret = await minimax(position, depth, alpha, beta, maximizingPlayer);
  console.log("nodes visited: " + nodes);
  return ret;
 
  async function minimax(position, depth, alpha, beta, maximizingPlayer) {
    nodes++;
    if (maximizingPlayer) {
      var validMoves = await getValidMoves(position, ArrtoFEN(position) + " w");
    } else {
      var validMoves = await getValidMoves(position, ArrtoFEN(position) + " b");
    }
    if (validMoves.length < 1 || depth == 0) {
      var eval = await getEval(position);
      return [eval, null];
    }
 
    if (maximizingPlayer) {
      var maxEval = Number.NEGATIVE_INFINITY;
      for (var i = 0; i < validMoves.length; i++) {
        var move = validMoves[i];
        
        var testbrd = makeMove(move, position)  //not the actual code. shortend for Readability
 
        
        var eval = await minimax(testbrd, depth - 1, alpha, beta, false);
        if (eval[0] > maxEval) {
          maxEval = eval[0];
          if (initial_depth == depth) {
            bestMove = move;
            console.log("current bestmove: " + bestMove);
          }
        }
        alpha = Math.max(alpha, eval[0]);
        if (beta <= alpha) {
          break;
        }
      }
      return [maxEval, bestMove];
    } else {
      var minEval = Number.POSITIVE_INFINITY;
 
      for (var i = 0; i < validMoves.length; i++) {
        var move = validMoves[i]; 
          
        var testbrd = makeMove(move, position)//not the actual code. shortend for Readability
 
        var eval = await minimax(testbrd, depth - 1, alpha, beta, true);
        if (eval[0] < minEval) {
          minEval = eval[0];
          if (initial_depth == depth) {
            bestMove = move;
            console.log("current bestmove: " + bestMove);
          }
        }
        beta = Math.min(beta, eval[0]);
        if (beta <= alpha) {
          break;
        }
      }
 
      return [minEval, bestMove];
    }
  }
}

最佳答案

这是因为它认为任何一步都会获胜,并且您没有条件告诉引擎在 1 步中进行配合比在 5 步中进行配合更好。如果在搜索结束时发现您有 0 步合法 Action 并且您已被将杀,那么您将被将杀。在这种情况下,您想要发回将死得分(较大的负值)并从中添加层数。这样,与大量移动相比,更少的移动就能更好地进行交配。

我建议你选择 Negamax 算法而不是 minimax。这将意味着更少的代码并且更容易调试。

关于javascript - 极小极大算法不适合国际象棋中的队友,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72151885/

相关文章:

javascript - 如何用JS制作类似iOS主屏的分页效果?

javascript - 将 Promise 包装在解决 Promise 的对象中有哪些缺点?

javascript - 哪个对象的Javascript中没有`hasOwnProperty`?

javascript - Grails Controller 值(映射)到单独的 javascript 文件

javascript - angular $scope 改变时不更新 HTML

javascript - 我将如何从 json 文件创建模型? (ExtJS)

node.js - 为什么我的 Express API 没有响应?

geometry - 多边形区域计算

machine-learning - 学习型人工智能作为游戏中的对手有意义吗?

machine-learning - 决策树熵计算目标