我想使用人工神经网络玩Tic-tac-toe。我对网络的配置如下: 对于9个字段中的每个字段,我使用2个输入神经元。当然,我有18个输入神经元。对于每个场,我有1个输入神经元用于一个玩家1和1个神经元用于一个玩家2.除此之外,我有1个输出神经元,它给出了当前电路板位置的评估。输出值越高,玩家1的位置越好。玩家2的位置越低,玩家2的位置越好。
但我的问题是:我怎么能编码那个神经网络?我的想法是使用Array [1-18]作为输入神经元。此数组的值是输入权重。我将使用循环遍历数组。每当有神经元被激活时,我都会将权重加到输出值上。所以输出值是激活的输入神经元的权重之和:
Output = SUM(ActivatedInputNeurons)
您认为这是一种编程网络的好方法吗?你有更好的想法吗?
我希望你能帮助我。提前谢谢!
答案 0 :(得分:15)
嗯,你有一个18个神经元的输入层,以及1个神经元的输出层。没关系。但是,您需要为神经网络提供将输入置于关系中的机会。为此,您至少需要一个中间层。我建议在中间层使用9个神经元。每个都应连接到每个输入神经元,输出神经元应连接到每个中间体。每个这样的连接都有一个权重,每个神经元都有一个激活水平。
然后,你要经历所有神经元,一次一层。输入层只是在板状态下激活。对于所有其他神经元,您将遍历其各自的连接,并总结连接神经元的激活水平和连接权重的乘积。最后,通过在此总和上应用sigmoid函数来计算激活级别。
这是工作原理。现在,您需要训练此网以获得更好的结果。有几种算法,你必须做一些谷歌搜索和阅读。最后,当结果没有足够令人信服时,您可能希望调整神经元和层的数量。例如,您可以将输入层减少到9个神经元并激活它们,对于X为+1,对于O为-1。也许添加另一个中间层会产生更好的结果,或者增加图层的神经元数量。
答案 1 :(得分:5)
我并不特别了解您希望如何从一个输出神经元中获得有关董事会情况的有意义的总结。我会更多地考虑:
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个权重。然后训练输出神经元以获得在该位置上比赛的相对可取性。
答案 2 :(得分:4)
看看我的Tic项目。我用神经网络和遗传算法解决了这个问题。源代码是免费提供的。
http://www.roncemer.com/tic-tac-toe-an-experiment-in-machine-learning
答案 3 :(得分:3)
我认为你应该使用传递函数来实现'传统'feed-forward 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)
答案 4 :(得分:1)
这是一个很好的AI编码入门项目,但是提出一个完整的解决方案将成为SO的答案。
与大多数软件一样,我建议使用面向对象的设计。例如:定义一个具有输入,权重和输出函数的Neuron
类。然后,创建其中几个Neuron
对象,以构建您的网络。
请参阅artificial neural networks上的维基百科文章,以获得良好的起点。
祝你好运!听起来很有趣。
答案 5 :(得分:0)
添加权重后,您需要使用函数对总和进行标准化,如果您想允许负数,人们通常会使用TANH。
修改强>
几年前我工作的Here is a java multilayer perceptron实施。这个用于检查,但输入较少,你也可以用它作为检查员。
此外,你可能需要找到一种方法来教它赢,但那是另一个问题
答案 6 :(得分:0)
答案 7 :(得分:0)
如果您使用FANN或Neuroph等神经网络库,您将节省时间。
对输入进行编码的一种方法是使用9个输入神经元。 9个神经元的输出也很好。我在其他重放中没有看到的是隐藏层的大小。我想你将使用传统的3层MLP。隐藏层的大小总是神秘的。我会尝试10个隐藏的神经元。
如果传递函数是sigmoid,您可以按如下方式对输入进行编码:
0.0 - O球员。
1.0 - X播放器。
0.5 - 空。
ANN的输出将是9个实数。在这种情况下,一些细胞将被占用。您可以搜索与空单元格对应的最高输出值。