我想编写一个国际象棋引擎,学习如何做出好的动作并赢得其他玩家.我已经编写了国际象棋棋盘的代表和一个输出所有可能动作的函数.所以我只需要一个评估功能,它可以说明董事会的特定情况有多好.因此,我想使用人工神经网络,然后应该评估给定的位置.输出应该是一个数值.值越高,白人玩家的位置越好.
我的方法是建立一个由385个神经元构成的网络:棋盘上有六个独特的棋子和64个场.因此,对于每个场,我们采取6个神经元(每个1个).如果有白色片段,则输入值为1.如果有黑色片段,则值为-1.如果那个场上没有那种,那么值就是0.除此之外,玩家应该有1个神经元移动.如果是白色,则输入值为1,如果是黑色,则值为-1.
我认为神经网络的配置非常好.但缺少主要部分:如何将这种神经网络实现为编码语言(例如Delphi)?我认为每个神经元的权重在开始时应该是相同的.根据匹配的结果,然后应调整权重.但是怎么样?我想我应该让两个电脑玩家(都使用我的引擎)互相对抗.如果White获胜,Black会得到其权重不佳的反馈.
因此,如果您可以帮助我将神经网络实现为编码语言(最好的是Delphi,否则是伪代码)会很棒.提前致谢!
如果有人随机找到这个页面.鉴于我们现在所知道的,OP提出的建议几乎肯定是可能的.实际上,我们设法为具有更大状态空间的游戏做到了 - Go(https://deepmind.com/alpha-go).
如果您还使用alpha-beta修剪做一些经典的mini-max预测,我不明白为什么你不能为静态评估器提供神经网络.很多国际象棋引擎都使用minimax和一个脑static静态评估器,只是将这些东西加起来; 如果你有足够的极小极大程度,这并不重要.我不知道网络会有多大的改进,但没有什么可失去的.训练它会很棘手.我建议使用一个向前看很多动作的引擎(并且需要大量的CPU等)来训练评估者一个向前看较少动作的引擎.这样你就得到了一个不占用太多CPU的引擎(希望如此).
去过也做过。由于您的问题没有连续性(一个位置的值与一个位置的值并不紧密相关,而一个输入的值只有1个变化),因此NN起作用的可能性很小。而且在我的实验中从未如此。
我宁愿看到具有临时启发式(其中有很多)的模拟退火系统来评估位置的值...
但是,如果您开始使用NN,则表示起来相对容易。一般的NN只是一个图,每个节点都是一个神经元。每个神经元都有一个当前激活值,以及一个基于输入值(即与之链接的所有节点的激活值)来计算下一个激活值的转换公式。
更为经典的NN,即具有输入层,输出层,每一层相同的神经元且没有时间依赖性,因此可以由输入节点数组,输出节点数组和的链接图表示。连接这些节点的节点。每个节点都具有当前激活值,以及转发到的节点列表。计算输出值只需将输入神经元的激活设置为输入值,然后依次遍历每个后续层,使用转换公式计算上一层的激活值。到达最后一个(输出)层时,便得到了结果。