首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minimax算法不适合国际象棋中的配偶

Minimax算法不适合国际象棋中的配偶
EN

Stack Overflow用户
提问于 2022-05-07 11:03:09
回答 1查看 100关注 0票数 2

我的目标是编码一个有点好的国际象棋引擎,在下面的位置,它是一个伙伴在2,引擎应该很容易找到它的深度4-5。

AI做出的第一个动作是Ra2捕捉白国王,白色国王去f1,而不是交配,AI移动鲁克到c2。

代码语言:javascript
复制
  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];
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-08 18:07:07

这是因为它看到任何移动都会赢,而且你没有条件告诉引擎在1移动中做伴侣要比5次移动更好。如果在搜索结束时发现您有0的合法移动,并且正在检查,那么您将被选中。在这种情况下,您想要返回一个校验分数(较大的负值),并从这里添加层。这样你就能更好地在更少的动作中交配,而不是在更多的动作中交配。

我建议你用芦荟代替minimax。这意味着代码要少得多,调试也容易得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72151885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档