用 Minimax 算法玩棋盘游戏的策略

人工智能 游戏-ai 极小极大 探索策略 启发式函数 棋盘游戏
2021-11-05 21:43:02

我想为以下游戏构建一个玩家:您有一个棋盘,其中位置1是您的玩家,位置2是对手玩家,-1是一个被阻塞的单元格,一些正值是奖金。您可以向上、向下、向左或向右移动。此外,每个奖金都有一个计时器,直到它消失(步数)。此外,每一步都有超时限制。在游戏结束时,当至少有一名玩家被卡住时,我们会检查比分并宣布获胜者。

板示例:

 -1 -1  0  0  0 -1 -1  -1
 -1  0 -1 -1 -1  0  0  340
 -1 -1  0  0  0 -1  0   0
 -1  0  0 -1  1 -1  0  -1
 -1  0  0 -1 -1  0  0   0
  0  0 -1 -1 -1  0  2  -1
  0 -1  0  0 -1  0  0  600
 -1 -1  0  0 -1 -1 -1  -1
  0 -1  0  0  0  0 -1  -1

我正在使用带有时间限制的 MiniMax 算法来玩游戏。如果我们有孩子,我们会回来为了玩家获胜,为了对手的胜利,和0领带。如果我们到达特定深度,我们会计算启发式值。如果我们在 MiniMax 的某个地方超时,那么我们返回最后计算的方向。我正在尝试找出一个好的策略来赢得这场比赛,或者如果没有解决方案可能会打成平手。

你会定义什么启发式函数?

我的想法 - 四个因素:

  1. fA- 从当前位置的每个方向可能的步数。
  2. fB- 到中心的分析距离。
  3. fC=maxbBonusXIY- 在哪里X是奖金的价值, I1如果我们能得到奖金,在它消失之前(否则0) 和Y是奖金和玩家之间的距离。
  4. FD- 球员之间的距离。最终公式:
    f(s)=0.5(9fA(s))+0.2fC(s)0.2fD(s)0.1fB(s)

我不确定这对于那场比赛是否是一个好的策略。您将如何定义启发式函数?它也应该很快计算出来,因为游戏的每一步都有超时。

换句话说,什么会给我们最好的迹象表明我们的球员将赢/输/平?

1个回答

我不熟悉你的游戏,所以我不能告诉你在你的具体情况下什么是好的启发式,但我可以给你一些关于如何寻找一个好的启发式函数的建议。

根据经验,MiniMax 算法的启发式函数最好保持简单和高效,这样您就可以更深入地了解树。但这取决于与模拟游戏中的移动相比,计算启发式函数的成本有多大。

如果启发式算法比模拟游戏动作花费的时间更长,则可能值得对其进行简化,使其运行得更快,并且您可以看得更远。这通常会导致更多难以用数学表达的紧急和高级策略。一个简单启发式的极端例子是当前玩家得分减去对手得分。由于分数仅在有人降落在奖励瓷砖上时才会改变,因此您在树上取下的许多路径将具有相同的价值,因此您需要能够向前看许多动作以找到非零启发式并能够修剪部分树。但是由于启发式计算的速度非常快,您可以这样做并发现更多不明显的策略,只需通过蛮力模拟即可。这会导致更多的紧急行为,并会告诉你更多关于玩游戏的不同方式(如果这是你的目标)。

如果模拟游戏移动比您当前的启发式花费更长的时间,则可能不值得让启发式更快,因为游戏模拟是您可以沿着树走多远的主要因素。这种情况要困难得多,因为这意味着您必须自己找到最佳策略(以及如何将它们表达为启发式函数)。这更像是一门艺术而不是一门科学——问问任何一位国际象棋大师。我会查找有关游戏的现有文献,看看是否有任何现有策略可以转化为启发式函数。如果没有文献(例如,因为游戏是新的或不受欢迎的),您可以花一些时间自己玩来发现什么是有效的。或者(也许更有趣),您可以使用具有更多紧急行为的简单启发式函数,增加 MiniMax 算法必须采取行动的时间,并与您的 NPC 对手对战几次,看看它发现了什么策略。或者甚至让两个具有不同启发式功能的 NPC 互相对战。然后尝试将它们合并到您的最终启发式函数中。如果您有多个候选者,这也是一种确定哪个启发式函数更好的方法。

有一些方法可以使用机器学习(特别是强化学习)自动优化启发式函数,但在你的情况下可能不值得打开那个蠕虫罐。