代码之家  ›  专栏  ›  技术社区  ›  caw

如何编写人工神经网络(tic-tac-toe)代码?[关闭]

  •  21
  • caw  · 技术社区  · 15 年前

    我想用人工神经网络玩井字游戏。我的网络配置如下: 对于9个字段中的每一个,我使用2个输入神经元。当然,我有18个输入神经元。对于每个字段,我有一个输入神经元用于一个播放器1,一个神经元用于一个播放器2。除此之外,我还有一个输出神经元,它给出当前电路板位置的评估。输出值越高,玩家1的位置越好。越低,对2号队员越好。

    但我的问题是:我如何才能编码神经网络?我的想法是对输入神经元使用一个数组[1-18]。这个数组的值是输入权重。我将使用循环遍历数组。每当有一个神经元要被激活时,我就把权重加到输出值上。因此,输出值是激活输入神经元的权重之和:

    Output = SUM(ActivatedInputNeurons)
    

    你认为这是编程网络的好方法吗?你有更好的主意吗?

    我希望你能帮助我。事先谢谢!

    8 回复  |  直到 8 年前
        1
  •  15
  •   Svante    15 年前

    你有一个18个神经元的输入层和一个1个神经元的输出层。没关系。然而,你需要给你的神经网络一个机会,把输入信息联系起来。为此,您至少需要一个中间层。我建议在中间层使用9个神经元。每个神经元都应该连接到每个输入神经元,而输出神经元应该连接到每个中间神经元。每个这样的连接都有一个权重,每个神经元都有一个激活水平。

    然后,你一次穿过所有的神经元,一层一层。输入层刚被板状态激活。对于所有其他的神经元,你要通过它们各自的连接,并求和连接神经元的激活水平和连接重量的乘积。最后,通过在这个和上应用一个sigmoid函数来计算激活水平。

    这就是工作原理。现在,你需要训练这个网络以获得更好的结果。这有几种算法,你需要做一些谷歌搜索和阅读。最后,当结果不够令人信服时,您可能需要调整神经元和层的数量。例如,您可以将输入层减少到9个神经元,并用+1(对于x)激活它们,用-1(对于o)激活它们。也许添加另一个中间层会产生更好的结果,或者增加一个层的神经元数量。

        2
  •  5
  •   chaos    15 年前

    我不太明白您如何期望从一个输出神经元中得到一个有意义的电路板情况摘要。我更愿意看到:

        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个砝码。然后训练输出神经元在这个位置上演奏的相对可取性。

        3
  •  4
  •   Ron    14 年前

    看看我的TIC项目。我用神经网络和遗传算法解决了这个问题。源代码是免费提供的。

    http://www.roncemer.com/tic-tac-toe-an-experiment-in-machine-learning

        4
  •  3
  •   FryGuy    15 年前

    我认为你应该实施一个“传统的” 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)
    
        5
  •  0
  •   James Eichele Bernard Igiri    15 年前

    对于人工智能编码来说,这是一个很好的入门项目,但是提出一个完整的解决方案将是解决这一问题的重要途径。

    与大多数软件一样,我建议使用面向对象的设计。例如:定义 Neuron 具有输入、权重和输出函数的类。然后,创建其中几个 神经元 对象以建立网络。

    参见维基百科上的文章 artificial neural networks 为了一个好的起点。

    祝你好运!听起来很有趣。

        6
  •  0
  •   paweloque    15 年前

    这不是您问题的直接答案,但您应该了解以下框架/工具: SNNS 或者它的Java对应 JavaNNS . 我很确定你会找到问题的答案。

        7
  •  0
  •   mkoryak    15 年前

    在添加权重之后,您需要使用一个函数来规范化和,如果您想允许负数,人们通常使用tanh。

    编辑:

    Here is a java multilayer perceptron 几年前我研究的实现。这一个用于检查程序,但输入较少,您也可以将其用于检查程序。

    另外,你可能需要找到一种方法来教它如何取胜,但这是另一个问题。

        8
  •  0
  •   Todor Balabanov    8 年前

    如果您使用神经网络库(如fann或neuroph),将节省时间。

    对输入进行编码的一种方法是9个输入神经元。9个神经元的输出也很好。我在其他回放中没有看到的是隐藏层的大小。我想您将使用传统的三层MLP。隐藏层的大小一直是个谜。我会尝试10个隐藏的神经元。

    如果传输功能是乙状结肠,您可以对输入进行如下编码:

    0位球员。

    1 - X播放器。

    0.5 -空。

    神经网络的输出将是9个实数。在这种情况下,某些单元格将被占用。可以搜索与空单元格对应的最高输出值。

    推荐文章