当前位置: 首页 > 知识库问答 >
问题:

理解Minimax算法

支劲
2023-03-14

我正试图为一个双人8×8棋盘游戏创造一个人工智能对手。经过研究,我发现极大极小算法足够方便地完成这项工作。我创造的人工智能对手将与另一个人工智能对手或人类对战。

我对理解最小最大值算法有疑问。

我试图只创建一个AI对手,但在网络上找到的解释说我需要为两个玩家(最小玩家和最大玩家)编写代码,正如我从下面的伪代码中了解的那样。

MinMax (GamePosition game) {
  return MaxMove (game);
}

MaxMove (GamePosition game) {
  if (GameEnded(game)) {
    return EvalGameState(game);
  }
  else {
    best_move < - {};
    moves <- GenerateMoves(game);
    ForEach moves {
       move <- MinMove(ApplyMove(game));
       if (Value(move) > Value(best_move)) {
          best_move < - move;
       }
    }
    return best_move;
  }
}

MinMove (GamePosition game) {
  best_move <- {};
  moves <- GenerateMoves(game);
  ForEach moves {
     move <- MaxMove(ApplyMove(game));
     if (Value(move) > Value(best_move)) {
        best_move < - move;
     }
  }

  return best_move;
}

我可以进一步理解,最大玩家将是我将要开发的AI,最小玩家是对手。

我的问题是,为什么我必须为最小和最大玩家编写代码才能返回最佳移动?

下面给出的伪代码基于C#。

提前感谢。

共有1个答案

拓拔骁
2023-03-14

你只需要在最坏的情况下为两个玩家搜索最佳解决方案,这就是为什么称为minmax,你不需要更多:

function minimax( node, depth )     
   if node is a terminal node or depth <= 0:        
       return the heuristic value of node  

   α = -∞    
   foreach child in node:          
      α = max( a, -minimax( child, depth-1 ) )  

   return α

节点是一个游戏位置,节点中的子节点是下一步(从所有可用移动的列表中),深度是两个玩家一起搜索的最大移动。

您可能无法在 8x8 上运行所有可能的移动(取决于您有多少个下一步选项),例如,如果每个您都有 8 个不同的可能移动并且游戏在 40 个移动后结束(应该是最坏的情况),那么你会得到 8^40 个位置。计算机将需要十年甚至更长时间才能解决它,这就是为什么您需要深度参数和使用启发式函数(例如随机森林树)来了解游戏位置有多好,而无需检查所有选项。

一个更好的minmax算法是Alpha-Beta修剪,一旦他找到目标(β参数),就可以完成搜索:

function negamax( node, depth, α, β, color )  
   if node is a terminal node or depth = 0     
       return color * the heuristic value of node  

   foreach child of node          
       value = -negamax( child, depth-1, -β, -α, -color )  

   if value ≥ β                
      return value /** Alpha-Beta cut-off */  

  if value ≥ α       
     α = value              

  return α

最好先用一个没有很多位置的游戏(例如,井字游戏)。

 类似资料:
  • 计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两

  • 我最近实现了一个4X4井字游戏的代码,这是使用极大极小算法。然而,我的极大极小函数无限次地递归调用自己。 初始板 (4X4) 井字 - 轮到电脑的代码- 在上面的代码中是船上的空位置,返回“X”(如果玩家X获胜),返回“O”(如果玩家O获胜) checkGameOver函数-

  • 我正在尝试用alpha-beta剪枝实现一个用于tic-tac-toe的minimax算法。现在我有程序在运行,但它似乎不起作用。每当我运行它时,它似乎会在所有的方块中输入垃圾。我已经实现了它,所以我的minimax函数接受一个棋盘状态,并修改该状态,以便当它完成时,棋盘状态包含下一个最佳移动。然后,我将“this”设置为与修改后的电路板相等。以下是我的minimax算法函数: 如果有人想尝试运行

  • 本文向大家介绍python使用minimax算法实现五子棋,包括了python使用minimax算法实现五子棋的使用技巧和注意事项,需要的朋友参考一下 这是一个命令行环境的五子棋程序。使用了minimax算法。 除了百度各个棋型的打分方式,所有代码皆为本人所撸。本程序结构与之前的井字棋、黑白棋一模一样。 有一点小问题,没时间弄了,就这样吧。 一、效果图 (略) 二、完整代码 以上就是本文的全部内容

  • 我对我的象棋游戏的最小极大算法的实现有问题。它的大部分似乎都起作用了,但它要么从来没有做出好的动作,要么对它们的评估(基于两个玩家的活动棋子的分数)出了问题。例如,如果我设置了check(例如,傻瓜的伴侣),ai会做一些随机的事情,而不是杀死国王。我真的找不出我做错了什么。 评估电路板的类StandardBoardEvaluator在经过一些测试后似乎可以工作,因此问题很可能出现在MiniMax实

  • 在我的方法newminimax49中,我有一个minimax算法,它利用了本文中建议给我的记忆和其他一般性改进。该方法使用一个简单的启发式电路板评估函数。我的问题基本上是关于alpha-beta修剪,即我的minimax方法是否使用alpha-beta修剪。据我所知,我相信这是真的,然而,我用来实现它的东西似乎太简单了,不可能是真的。此外,其他人建议我使用alpha-beta剪枝,正如我所说的,我