我正在制作一个连接四游戏,其中我的引擎使用带有 Alpha-Beta 修剪的 Minimax 进行搜索。由于 Alpha-Beta 修剪在首先查看最佳移动时更有效(因为它可以修剪不良移动的分支),所以我试图提出一组启发式算法,可以将移动从最佳到最差排序。这些启发式方法显然不能保证总是有效,但我的目标是它们通常会让我的引擎首先查看最佳动作。这种启发式的一个例子如下:
- 移动到棋盘中心柱的接近度 - 重量 3。
- 有多少棋子围绕着一个动作 - 重量 2。
- 水平移动到棋盘底部有多低 - 重量 1。
- 等等
但是,我不知道移动的每个属性的最佳权重值集是多少。我上面列出的权重只是我的估计,显然可以改进。我可以想到两种改进它们的方法:
1)进化。我可以让我的引擎思考,而我的启发式尝试猜测引擎会选择哪个动作最好,我会看到我的启发式的成功分数(类似于正确猜测的 x%)。然后,我将对启发式进行伪随机更改/突变(通过将其中一个权重值随机调整一定量),然后看看启发式是如何做的。如果它猜得更好,那将是我的新启发式方法。请注意,当我的引擎思考时,它会在其计算中考虑数千个不同的位置,因此将有足够的数据来平均我的启发式方法在预测方面的好坏。
2) 从一开始就生成数千个具有不同权重值的不同启发式。然后,让他们都尝试猜测我的引擎在思考时会支持哪个动作。应保留得分最高的启发式算法集。
我不确定这里哪种策略更好。策略#1(进化)似乎需要很长时间才能运行,因为每次我让我的引擎认为它需要大约 1 秒。这意味着测试每个新的伪随机突变需要一秒钟。同时,策略 #2 似乎更快,但如果我自己不包括它们,我可能会错过一组很棒的启发式方法。