在国际象棋中实现时间差异

数据挖掘 机器学习 算法 强化学习
2021-09-16 07:35:34

我一直在开发一个国际象棋程序,它利用 alpha-beta 修剪算法和一个评估函数,该函数使用以下特征评估位置,即材料、国王安全、移动性、棋子结构和被困棋子等......我的评估函数是源于

f(p)=w1material+w2kingsafety+w3mobility+w4pawn-structure+w5trapped pieces

在哪里 w是分配给每个特征的权重。在这一点上,我想使用时间差异来调整我的评估函数的权重,其中代理与自己对抗并在此过程中从其环境中收集训练数据(这是强化学习的一种形式)。我已经阅读了一些书籍和文章,以便深入了解如何在 Java 中实现这一点,但它们似乎是理论上的而不是实际的。我需要关于如何根据以前的游戏自动调整我的评估函数的权重的详细解释和伪代码。

2个回答

我建议任何对该主题感兴趣的人看看结合了 TDL 和深度学习的论文。

粗略地说,您需要让引擎互相对战。记录每个位置的最小最大评估。游戏结束时,您将获得奖励,即国际象棋的 {0,1,-1}。然后你需要调整你的参数:

在此处输入图像描述

这个等式告诉我们应该通过时间差异来调整权重,根据你应该做多远来加权。如果您有一个完美的评估,您的时间差异将始终为零,因此您无需进行任何调整。

接下来,您需要使用新参数来玩新游戏。重复直到尽可能多的游戏,或者当你认为它已经融合时。

几点说明:

  1. 我引用的论文应用了折扣系数。这是为神经网络的反向比例算法完成的。你不需要它。
  2. 您需要尝试最佳学习率(等式中的 alpha)。太大会使你的学习不稳定,太少会需要更长的时间才能收敛。我见过有人使用 0.70。我引用的论文使用了 1.0。

首先要说的是,您应该观看“兵棋推演”以了解您正在进入什么领域。

你想要的是 f(p) 使得 f(p) 尽可能接近位置强度。

使用遗传算法的一个非常简单的解决方案是设置 10000 名不同权重的玩家,看看谁获胜。然后保留前 1000 名获胜者的体重,复制 10 次,稍微改变它们以探索体重空间,然后再次运行模拟。那是标准 GA,给定一个函数形式,它的最佳系数是多少。

另一种解决方案是提取位置,因此您有一个表格“(材料、国王安全、机动性、典当结构、陷阱)-> 位置优势”,其中位置优势是一些客观因素(使用上面的模拟计算的结果输赢或已知匹配、可用树的深度、5 个因素之一变得更好的树下的移动次数。然后,您可以为 f(p)、回归、svm 尝试不同的函数形式。