在国际象棋中,没有简单的方法可以判断 move1 是否比 move2 好(从您的示例中)。近似值是通过查看“硬”参数来实现的:棋子的数量和价值、双兵或自由兵的存在……通常这种近似值被插入到极小极大算法中。
极小极大
简单来说,思路如下:首先,扩展所有可能的移动(白-黑-白-黑-...),直到达到预定义的深度或时间限制。这将创建一个棋盘位置树(以移动作为边缘),并使用启发式方法评估叶子(如上所述)。然后,树被折叠,最终导致对 move1 与 move 2 的评估。
崩溃是如何工作的?它从树的叶子开始,并为每个节点(又名棋盘位置)分配一个值。对于所有子节点的值已知的每个节点,汇总子节点的值:如果轮到白,则取白的最佳值(最大值);如果轮到黑方,最差(分钟)。因此得名极小极大。重复此过程,直到到达根。
假设以下棋盘位置树:
A
| \
B1 B2
| | \
A11 A21 A22
现在假设以下评估:A11 = 0,A21 = -1,A22 = +1(正值对白色有好处)。我们从近似值中假设位置 A21 优于 A22(黑色),因此我们将 -1 分配给节点 B2。对于 B1,这很清楚,它的值为 0。现在我们假设 B1 对于白色优于 B2,因此 A 的值为 0,白色应该移动到 B1 位置。
这里的想法不是构建整棵树,而是深度优先搜索更有希望的移动,以实现早期截止。在上面的例子中,如果我们从左到右(A-B1-A11-B2-A21-...)深度优先遍历树,在评估 A21 之后,我们知道对于白色,位置 B2 比位置 B1 差。因此,不再需要评估 A22。Alpha 和 beta 仅存储当前已知的对白的最佳可能移动的评估,以及对黑的当前已知的最佳可能响应的评估。遍历树的节点的顺序(初始排序)决定了是否有可能以及有多少个可能的截止。来自维基百科:
通常在 alpha-beta 期间,子树暂时由第一玩家优势(当许多第一玩家移动是好的,并且在每个搜索深度处,第一玩家检查的第一移动是足够的,但所有第二玩家的反应都需要试图找到一个反驳),反之亦然。...
如果排序不是最优的,则必须完全探索更多的子树。
另见
迭代深化深度优先搜索。
优化
严格来说,这棵树是一个有向无环图,因为相同的棋盘位置可以通过不同的移动组合(例如,转座子)来实现。使用哈希表来检测相同的位置,这将节省大量的计算工作。