28

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

我的方法是建立一个由 385 个神经元组成的网络:棋盘上有 6 个独特的棋子和 64 个区域。因此,对于每个字段,我们需要 6 个神经元(每块 1 个)。如果有白棋,则输入值为 1。如果有黑棋,则值为 -1。如果该字段上没有这种类型的块,则值为 0。除此之外,还应该有 1 个神经元供玩家移动。如果轮到白方,则输入值为1,如果轮到黑方,则输入值为-1。

我认为神经网络的配置非常好。但是缺少主要部分:如何将这个神经网络实现为编码语言(例如 Delphi)?我认为每个神经元的权重在开始时应该是相同的。然后根据比赛结果调整权重。但是怎么做?我想我应该让 2 个电脑玩家(都使用我的引擎)互相对抗。如果白方赢了,黑方会得到它的权重不好的反馈。

因此,如果您能帮助我将神经网络实现为编码语言(最好是 Delphi,否则是伪代码),那就太好了。提前致谢!

4

9 回答 9

14

以防有人随机找到此页面。鉴于我们现在所知道的,OP 的提议几乎肯定是可能的。事实上,我们设法为具有更大状态空间的游戏——围棋(https://deepmind.com/research/case-studies/alphago-the-story-so-far)做到了这一点。

于 2016-07-25T21:57:26.077 回答
10

如果您还使用 alpha-beta 修剪进行一些经典的 mini-max 前瞻,我不明白为什么不能为静态评估器使用神经网络。许多国际象棋引擎使用极小极大和脑死的静态评估器,它只是将棋子或其他东西相加;如果您有足够的极小极大水平,这并不重要。我不知道网络会带来多大的改进,但几乎没有什么可失去的。训练它会很棘手。我建议使用一个可以预见许多动作(并占用大量 CPU 等)的引擎来训练评估器以使用一个可以预见更少动作的引擎。这样,您最终会得到一个不占用太多 CPU 的引擎(希望如此)。

编辑:我在 2010 年写了以上内容,现在在 2020 年Stockfish NNUE 已经完成了。“该网络在中等搜索深度对数百万个位置的 [经典 Stockfish] 评估进行了优化和训练”,然后用作静态评估器,在初始测试中,当使用此静态评估器而不是他们以前的一个(或者,等效地,相同的 elo 具有更少的 CPU 时间)。所以是的,它确实有效,你甚至不必像我最初建议的那样以高搜索深度训练网络:中等搜索深度就足够了,但关键是使用数百万个位置。

于 2010-05-16T19:33:27.947 回答
6

去过也做过。由于您的问题没有连续性(一个位置的值与另一个位置的关系并不密切,一个输入的值只有 1 个变化),因此 NN 工作的可能性很小。在我的实验中从未出现过。

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

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

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

于 2009-04-15T22:30:50.577 回答
5

这是可能的,但无论如何都不是微不足道的。

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

为了训练他的评估功能,他动用了大量的计算能力。

概括地说,您可以按如下方式进行。您的评估函数是前馈神经网络。让矩阵计算得出一个标量输出来评估移动的好坏。网络的输入向量是棋盘上所有棋子表示的棋盘状态,比如白兵是 1,白马是 2...,空白区域是 0。棋盘状态输入向量示例是简单的 0 序列-12 的。对于许多游戏,可以使用大师级游戏(例如在 fics 数据库中提供)对这种评估进行训练,从而最大限度地减少当前参数所说的最高估值与大师级移动(应该具有最高估值)之间的损失。这当然假设大师的动作是正确和最优的。

于 2017-02-28T19:14:08.217 回答
4

训练 ANN 所需的东西要么是反向传播学习,要么是某种形式的遗传算法。但国际象棋是如此复杂的游戏,一个简单的人工神经网络不太可能学会下棋——如果学习过程是无监督的,情况就更糟了。

此外,您的问题没有说明层数。您想使用 385 个输入神经元对当前情况进行编码。但是你想如何决定做什么呢?每个场的神经元?最高激发获胜?但通常有不止一种可能的举动。

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

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

在我 16 岁左右的时候,我试图建立和训练一个人工神经网络来玩井字游戏……但我失败了。我建议先尝试这样一个简单的游戏。

于 2009-04-15T22:24:52.417 回答
4

我在这里看到的主要问题是培训之一。你说你希望你的 ANN 占据当前的董事会位置并评估它对玩家有多好。(我假设你会为玩家采取所有可能的动作,将其应用于当前的棋盘状态,通过 ANN 进行评估,然后采用输出最高的一个 - 即:爬山)

在我看来,您的选择是:

  • 开发一些启发式函数来评估棋盘状态并以此训练网络。但这引出了一个问题,即当您可以使用启发式算法时,为什么还要使用 ANN。

  • 使用一些统计方法,例如“在这个棋盘配置中,白棋或黑棋赢了多少场比赛?”,这会给你一个介于白棋或黑棋之间的适应度值。困难在于您的问题空间大小所需的训练数据量。

使用第二个选项,您始终可以从大师游戏中为其提供棋盘序列,并希望有足够的覆盖范围供 ANN 开发解决方案。

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

于 2009-04-15T23:58:37.777 回答
1

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

输出层应该(以某种形式)给出要移动的部分,以及要移动到的位置。

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

让他们互相玩,保留最好的少数,交叉和变异最好的连接组以重新填充池。

于 2011-06-24T00:23:56.210 回答
1

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

它处理跳棋而不是国际象棋,但原理是相同的。

于 2011-07-22T15:18:10.457 回答
0

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

也许虽然可以使用遗传算法。

于 2010-12-06T02:11:34.440 回答