通过 alpha beta 剪枝理解 minimax

Understanding minimax with alpha beta pruning

对不起,图片来自我的笔记。

我在最后一天阅读了极小极大树和 alpha 数据修剪,并为我的项目做了一些准备。这是奥赛罗在 c.

中的实现

我已经阅读了大量关于它的资源,而且我知道它被问到很多。 在开始评估功能之前,我想充分了解这一点。

在附图中,我无法弄清楚函数 Min_Node(pos)Max_Node(pos) 究竟会做什么,任何输入将不胜感激。

如果有人有任何提示或我在实现这个和我的 Othello 评估功能时应该注意的事情,我愿意接受我能找到的任何帮助。

minimax 算法,也被描述为 here,需要根据博弈树中的当前位置找到最优值的移动。该位置由棋盘配置和当前玩家组成(对于某些游戏,可以单独根据棋盘配置决定)。通常移动的值是递归定义的;对于处于 eding 位置的棋盘(这是游戏树的叶子),如果玩家一赢了,值为 1,如果玩家二赢了,值为 -1,平局为 0游戏。移动的值是通过执行该移动并递归地评估该值来确定的。然后,选择具有最大值(对于玩家一)或最小值(对于玩家二)的移动;在递归评估中,该值为当前位置子树根的所有叶子的最大(或最小)值。这显然是原始问题中提到的功能应该做的。

Alpha-beta 剪枝,如 here 所述,是对这种方法的改进。由于最佳值已知(它们是 1-1),一旦找到具有所需值的移动,就可以停止评估。

这种方法独立于实际游戏。但是,我建议第一步使用更简单的游戏(例如 Tic-Tac-Toe)作为玩具示例,这样可能更容易调试。

我设法弄清楚最大和最小节点是什么,在这种情况下,Max_Node(pos) 检查这是否是播放器,它 returns 是真的,因为它应该被最大化并且 Min_Node(pos) 检查它是否是对手,如果为真,那么它应该被最小化。