如何编写人工神经网络(井字棋)? [关闭]
-
11-09-2019 - |
题
我想用人工神经网络玩井字棋。我对网络配置如下: 对于每个9个字段,使用了两输入神经元。所以我当然有18个输入神经元。对于每一个场,我有一块玩家1和1个神经元的一块播放器2的除了一个1个输入神经元,我有1个输出神经元,其给出当前板位置的评估。较高的输出值,更好的是用于播放器1降低它是位置,更好的是它对于玩家2。
但我的问题是:我怎么能代码,神经网络?我的想法是使用的输入神经元的数组[1-18]。该数组的值是输入的权重。在我使用遍历数组行走。每当有要被激活神经元,我的重量添加到输出值。所以输出值是激活的输入神经元的权重的总和:
Output = SUM(ActivatedInputNeurons)
你以为这是网络编程的好方法?你有更好的想法?
我希望你能帮助我。由于事先!
解决方案
那么,你必须18层的神经元的输入层,和1个神经元的输出层。没关系。但是,你需要给你的神经网络把投入关系的机会。对于这一点,你需要至少一个中间层。我建议在中间层中使用9个神经元。它们中的每应该被连接到每个输入神经元,而输出神经元应被连接到每个中间。每个这样的连接具有权重,并且每个神经元具有激活电平。
然后,通过所有的神经元,一个层在一个时间。输入层刚好与板状态激活。对于所有进一步的神经元,你经历过的连接神经元的激活水平的产品和连接的重量都各自连接和总和。最后,通过在此总和施加sigmoid函数计算所述活性度。
这是工作原理。现在,你需要训练这个网得到更好的结果。有几种算法,对于这一点,你将不得不做一些谷歌上搜索和阅读。最后,你可能需要调整神经元和图层时,结果没有得到令人信服的速度不够快的数量。例如,你可以在输入层减少至9层的神经元,并用1个X和-1代表O.也许增加另一个中间层产生更好的效果,或增加层的神经元的数目激活它们。
其他提示
我不是特别了解你的期望得到董事会的情况有意义的总结出一个输出神经元。我会更看具有:
I I I O O O
I I I x O O O
I I I O O O
9 input neurons 9 output neurons
在完全连接的网络,即81层的权重。然后训练的输出神经元的在该位置播放的相对可取性。
有一个在我的抽动项目。我已经解决了这个问题既神经网络和遗传算法。的源代码是免费提供的。
我想你应该实现一个“传统” 前馈ANN采用传递函数的,因为,它允许您使用反向传播训练它。对于这些代码通常最终被的几行代码,是这样的:
SetupInputs();
for (l = 1 .. layers.count)
for (i = 0 .. layers[l].count)
sum = 0
for (j = 0 .. layers[l-1].count)
sum += layers[l-1][j] * weights[l-1][j]
layers[l][i] = TransferFunction(sum)
这是AI编码一个很好的启动项目,而是拿出一个完整的解决方案将是方式大一个答案这么久。
与大多数软件,我建议使用面向对象的设计。例如:定义一个Neuron
类,其具有输入,权重,以及输出功能。然后,创建几个这样的Neuron
对象,以建立自己的网络。
请参阅上维基百科文章人工神经网络获取一个很好的起点。
祝代码!听起来像很多乐趣。
在添加权重之后,您需要使用的功能,人们通常使用TANH,如果你想允许负数规范的总和。
修改强>
这里是一个java多层感知实现,我以前在工作几年。这一个用于跳棋,但具有较少的输入就可以将它用于跳棋太
此外,你需要大概想出一个办法来教它赢了,但那是另外一个问题。
如果您使用神经网络库,比如fann或Neuroph您将节省时间。
以编码的输入的一种方式是通过9个输入神经元。输出也不错,是9元。我没有在其他重播看到的是隐藏层的大小。我想你要使用MLP与传统的3层。隐藏层的大小始终是个谜。我会尝试10个隐藏神经。
如果传递函数为S形你可以编码输入如下:
0.0 - Ø播放机
1.0 - X播放机
0.5 - 空
人工神经网络的输出将是9张实数。在这种情况下,一些细胞会被占满了。您可以搜索对应于空单元的最高输出值。