首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为国际象棋编写神经网络程序?

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

Stack Overflow用户
提问于 2009-04-15 22:15:21
回答 9查看 37.5K关注 0票数 28

我想编程一个国际象棋引擎,学习如何做出好的步骤,并赢得与其他棋手。我已经编写了一个棋盘的表示和一个输出所有可能的走法的函数。因此,我只需要一个评估函数,它可以说明棋盘在给定情况下有多好。因此,我想使用人工神经网络,然后评估给定的位置。输出应为数值。值越高,白色玩家的位置越好。

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

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-15 22:30:51

去过那里,做过这些。由于你的问题没有连续性(一个位置的值与另一个位置的值没有密切的关系,只有一个输入值的变化),所以神经网络工作的可能性很小。在我的实验中它从来没有起过作用。

我宁愿看到一个模拟退火系统和一个特别的启发式(有很多)来评估职位的价值……

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

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

票数 6
EN

Stack Overflow用户

发布于 2016-07-26 05:57:26

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

票数 14
EN

Stack Overflow用户

发布于 2010-05-17 03:33:28

我不明白为什么你不能有一个神经网络的静态计算器,如果你还做了一些经典的最小最大前瞻与阿尔法-贝塔修剪。许多国际象棋引擎都使用minimax,它有一个智能的静态求值器,它只是将棋子相加或其他东西;如果你有足够的minimax级别,这并不重要。我不知道网络会带来多大的改进,但也没什么可失去的。不过,训练它会很棘手。我建议使用一个前瞻多步的引擎(并且需要CPU负载等)来训练一个前瞻较少的引擎的评估器。这样,你最终得到的引擎就不会占用那么多的CPU (希望如此)。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/753954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档