如何为国际象棋编程神经网络?

时间:2009-04-15 22:15:21

标签: artificial-intelligence neural-network chess

我想编写一个国际象棋引擎,学习如何做出好的动作并赢得其他玩家。我已经编写了国际象棋棋盘的代表和一个输出所有可能动作的函数。所以我只需要一个评估功能,它可以说明董事会的特定情况有多好。因此,我想使用人工神经网络,然后应该评估给定的位置。输出应该是一个数值。值越高,白人玩家的位置越好。

我的方法是建立一个由385个神经元构成的网络:棋盘上有六个独特的棋子和64个场。因此,对于每个场,我们需要6个神经元(每个场一个)。如果有白色片段,则输入值为1.如果有黑色片段,则值为-1。如果那个场上没有那种,那么值就是0.除此之外,玩家应该有1个神经元移动。如果是白色,则输入值为1,如果是黑色,则值为-1。

我认为神经网络的配置非常好。但缺少主要部分:如何将这种神经网络实现为编码语言(例如Delphi)?我认为每个神经元的权重在开始时应该是相同的。根据匹配的结果,然后应调整权重。但是怎么样?我想我应该让两个电脑玩家(都使用我的引擎)互相对抗。如果怀特获胜,布莱克会得到其权重不佳的反馈。

如果你可以帮助我将神经网络实现为编码语言(最好的是Delphi,否则是伪代码)会很棒。提前谢谢!

9 个答案:

答案 0 :(得分:10)

如果有人随机找到此页面。鉴于我们现在所知道的,OP提出的建议几乎肯定是可能的。事实上,我们设法为一个拥有更大状态空间的游戏 - Go(https://deepmind.com/alpha-go)。

答案 1 :(得分:9)

如果您还使用alpha-beta修剪做一些经典的mini-max预测,我不明白为什么你不能为静态评估器提供神经网络。很多国际象棋引擎都使用minimax和一个脑static静态评估器,只是将这些东西加起来;如果你有足够的极小极大程度,这并不重要。我不知道网络会有多大的改进,但没有什么可失去的。训练它会很棘手。我建议使用一个向前看很多动作的引擎(并且需要大量的CPU等)来训练评估者一个向前看较少动作的引擎。这样你就得到了一个不占用太多CPU的引擎(希望如此)。

答案 2 :(得分:4)

培训人工神经网络需要的是backpropagation learning或某种形式的genetic algorithm。但国际象棋是一个如此复杂的游戏,简单的人工神经网络将学习如何发挥它的作用 - 如果学习过程没有受到监督,则更是如此。

此外,您的问题没有说明层数。您想使用385个输入神经元来编码当前情况。但是你想如何决定该怎么做?关于每个神经元?最高的激励获胜?但往往有不止一种可能的举动。

此外,您将需要几个隐藏层 - 可以用输入表示的功能和没有隐藏层的输出层实际上是有限的。

所以我不想阻止你尝试,但是在一年左右的时间内成功实施和培训的机会几乎为零。

当我16岁左右的时候,我试图建立并训练人工神经网络来玩井字游戏......我失败了。我建议先尝试这么简单的游戏。

答案 3 :(得分:4)

去过那里,做到了。由于你的问题没有连续性(一个位置的值与另一个位置没有密切关系,一个输入的值只有1个变化),NN几乎没有机会起作用。它在我的实验中从未做过。

我宁愿看到一个带有特殊启发式的模拟退火系统(其中还有很多)来评估该位置的价值......

但是,如果您使用NN设置,则相对容易表示。一般NN只是一个图,每个节点都是一个神经元。每个神经元都有一个当前激活值,以及一个基于输入值计算下一个激活值的转换公式,即具有链接的所有节点的激活值。

更经典的NN,即输入层,输出层,每层相同的神经元,没有时间依赖性,因此可以由输入节点数组,输出节点数组和连接它们的节点的链接图。每个节点拥有一个当前激活值,以及它转发到的节点列表。计算输出值只是将输入神经元的激活设置为输入值,并依次迭代每个后续层,使用转换公式计算前一层的激活值。当你到达最后一个(输出)图层时,你就得到了结果。

答案 4 :(得分:4)

我在这里看到的主要问题是培训。你说你希望你的ANN能够掌握当前的董事会职位,并评估一名球员的优异表现。 (我假设您将为玩家采取一切可能的行动,将其应用于当前的董事会状态,通过ANN进行评估,然后选择具有最高输出的那个 - 即:爬坡)

我看到你的选择是:

  • 开发一些启发式函数来评估电路板状态并训练网络。但是当你可以使用你的启发式时,这就引出了为什么要使用人工神经网络的问题。

  • 使用一些统计测量,例如“从这个电路板配置中白色或黑色赢了多少个游戏?”,这将为您提供白色或黑色之间的适应值。难点在于问题空间大小所需的训练数据量。

使用第二个选项,你总是可以从大师游戏中获取它的电路板序列,并希望ANN有足够的覆盖范围来开发解决方案。

由于问题的复杂性,我想尽可能地抛出最大的网络(即:大量的内部节点),而不会过多地减慢训练速度。

答案 5 :(得分:4)

这是可能的,但不是无关紧要的。

https://erikbern.com/2014/11/29/deep-learning-for-chess/

为了训练他的评估功能,他利用了很多计算能力来实现这一目标。

总的来说,您可以按照以下方式进行操作。您的评估函数是前馈NN。让矩阵计算导致标量输出,估计移动的好坏程度。网络的输入向量是由板上所有块表示的板状态,因此说白色棋子是1,白色骑士是2 ...而空白空间是0.示例板状态输入向量只是0的序列-12'第对于许多游戏,可以使用大师游戏(例如,在fics数据库中可用)来训练该评估,从而最小化当前参数所说的最高估值与大师所做的移动(其应具有最高估值)之间的损失。这当然假设大师的动作是正确和最佳的。

答案 6 :(得分:1)

来到这里说塞拉斯说的话。使用minimax算法,您可以期待能够向前看N个动作。使用Alpha-beta修剪,您可以将其扩展到理论上2 * N的移动,但更实际的是3 * N / 4移动。神经网络在这里非常合适。

也许可以使用遗传算法。

答案 7 :(得分:1)

阅读blondie24:http://www.amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838

它涉及跳棋而不是国际象棋,但原则是相同的。

答案 8 :(得分:0)

您的输入算法是合理的 - 所有位置,所有棋子和两个玩家都被计算在内。对于游戏板的每个过去状态,您可能需要一个输入层,以便将过去的事件再次用作输入。

输出图层应该(以某种形式)让棋子移动,以及移动到的位置。

使用包含所有神经元权重和突触强度的连接组编写遗传算法,并开始多个分离的基因库,每个基因库中都有大量的连接组。

让他们互相玩耍,保持最佳状态,交叉并改变最好的连接点以重新填充游泳池。

相关问题