如何用神经网络编写国际象棋程序?

我想编写一个国际象棋引擎,它可以学习下出好的棋步并击败其他玩家。我已经编写了棋盘的表示方法和一个输出所有可能走法的函数。所以我只需要一个评估函数,它能说出棋盘的给定情况有多好。因此,我想使用一个人工神经网络来评估给定的位置。输出应该是一个数值。数值越高,对白棋玩家越有利。

我的方法是构建一个由 385 个神经元组成的网络:有六种独特的棋子,棋盘上有 64 个格子。因此,对于每个格子,我们取 6 个神经元(每种棋子 1 个)。如果有一个白棋棋子,则输入值为 1。如果有一个黑棋棋子,则值为 -1。如果该格子上没有该种棋子,则值为 0。此外,应该有 1 个神经元代表轮到哪个玩家走棋。如果是白棋的回合,输入值为 1,如果是黑棋的回合,则值为 -1。

我认为神经网络的配置相当不错。但主要部分缺失了:如何将这个神经网络实现到一种编程语言中(例如 Delphi)?我认为每个神经元的权重在开始时应该是相同的。根据比赛的结果,然后应该调整权重。但是如何调整呢?我认为我应该让 2 个电脑玩家(都使用我的引擎)相互对战。如果白棋获胜,黑棋会得到反馈,表明它的权重不好。

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


回答:

我经历过,也做过。由于你的问题中不存在连续性(一个位置的值与另一个位置的值没有紧密的关联,只有一个输入的价值发生了变化),神经网络几乎不可能工作。而且在我的实验中也从未成功过。

我更倾向于使用模拟退火系统,其中包含一个特别的启发式算法(有很多这样的算法)来评估位置的价值……

但是,如果你决心使用神经网络,那么表示起来相对容易。一个通用的神经网络就是一个简单的图,每个节点都是一个神经元。每个神经元都有一个当前的激活值,和一个转换公式来计算下一个激活值,基于输入值,即所有与该节点有连接的节点的激活值。

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注