具有深度限制的 minimax 游戏中的效用函数

Utility function in minimax game with depth-limit

我正在制作我自己的 5 连胜游戏,棋盘大于 5x5,大小尚未确定,但可以说是 10x10。我正在使用 minimax 算法和 alfa-beta 修剪来设计它。我已经确定获胜情况的效用函数为:(空位 + 选择的位)*5,因此如果计算机找到获胜的地方将剩下 2 个空位,则该值将为 (2+1)*5 = 15. 对输的计算相同,但乘以 -5 而不是 5。对于平局,它将评估为 0。现在,我正在写这篇文章的问题是:如何确定未完成场景的实用程序,其中达到深度限制?简单地设为 0 是不够的,必须有某种“猜测”或排名。

我的一个想法是计算每一行、每一列和每条可能的对角线中的所有 X,然后计算空白位置 + 选择的位置乘以找到的最大 X 序列。问题在于计算需要时间并且编写起来很痛苦,然后您还必须考虑找到的序列的边缘:它们是否与 O 接壤?我们应该计算 X 的空白吗?

这看起来非常复杂,因此我想知道是否有人对未完成的场景有什么好的建议。谢谢!

我不知道你在第一段中说的是什么,胜利应该被计为胜利(减去深度总能找到最短的胜利)。如果我理解正确的话,您是想创建一个 evaluation/heuristics 函数来输入棋盘状态并输出该状态的静态分数? Gomoku(连续 5 个)是一款流行的游戏,有很多引擎,Google“评估函数 gomoku”,您会找到很多关于这个主题的信息和论文。

对于像国际象棋这样的游戏,评估已经完成,例如通过计算每边 material 平衡、棋子位置、国王安全等。对于 X-in-a-row,通常的方法是给所有可能的场景打分,然后将它们加在一起。五子棋的场景通常如下:

  • FiveInRow(赢)
  • OpenFour
  • ClosedFour
  • OpenThree
  • ClosedThree
  • OpenTwo
  • ClosedTwo

开意味着友方棋子旁边没有阻挡敌方棋子:

OpenThree: -O--XXX---
ClosedThree: --OXXX---

如何总结它们,以及给每个场景打多少分,由您决定,这就是乐趣和实验的开始!