Artificial intelligence 如何编码人工神经网络(Tic-tac-toe)?

Artificial intelligence 如何编码人工神经网络(Tic-tac-toe)?,artificial-intelligence,neural-network,game-ai,Artificial Intelligence,Neural Network,Game Ai,我想用人工神经网络玩井字游戏。我的网络配置如下: 对于9个字段中的每个字段,我使用2个输入神经元。当然,我有18个输入神经元。对于每个字段,我有一个输入神经元用于播放器1,一个神经元用于播放器2。除此之外,我还有1个输出神经元,用于评估当前电路板的位置。输出值越高,玩家1的位置就越好。它越低,对玩家2越有利 但我的问题是:我如何编写神经网络?我的想法是使用一个数组[1-18]作为输入神经元。此数组的值是输入权重。我将使用循环遍历数组。每当有一个神经元被激活时,我就把权重加到输出值上。因此,输出值

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

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

Output = SUM(ActivatedInputNeurons)
你认为这是一个很好的网络编程方式吗?你有更好的主意吗


我希望你能帮助我。提前谢谢

这是一个优秀的人工智能编码入门项目,但提出一个完整的解决方案将是解决这一问题的重要途径

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

请参阅上的维基百科文章,以获得一个良好的起点


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

在添加权重后,您需要使用函数规范化总和,如果您想允许负数,人们通常使用TANH

编辑:

我几年前参与的实现。这个用于跳棋,但输入较少,也可以用于跳棋


此外,您可能需要找到一种方法来教它如何获胜,但这是另一个问题,它不是您问题的直接答案,但您应该看看以下框架/工具:或其Java对应物。我很确定你会在那里找到你问题的答案。

我认为你应该使用传递函数实现一个“传统的”,因为它允许你使用反向传播来训练它。这些的代码通常是几行代码,如下所示:

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)

我不太明白你是如何期望从一个输出神经元中得到对董事会情况的有意义的总结的。我会更关注以下方面:

    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个权重。然后训练输出神经元在该位置上的相对期望值。

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

然后,你通过所有的神经元,一次一层。输入层仅在线路板状态下激活。对于所有进一步的神经元,你要通过其各自的连接,并将连接的神经元的激活水平和连接的权重的乘积相加。最后,通过对该总和应用sigmoid函数来计算激活级别


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

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


如果您使用像FANN或Neuroph这样的神经网络库,您将节省时间

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

如果传递函数为sigmoid,则可以按如下方式对输入进行编码:

0.0-O播放器

1.0-X播放器

0.5-空


ANN的输出将是9个实数。在这种情况下,一些单元格将被占用。您可以搜索对应于空单元格的最高输出值

谢谢!两者似乎都是很好的链接。不幸的是,我既没有C++也没有java。我只有Delphi/Pascal。你应该能够找到关于如何做事情的例子。最后你想用ANN学习或做smthg,所以语言是次要的,不是吗?非常感谢。但那将是多层神经网络的代码,不是吗?是的。您将无法仅使用感知器(单层)计算可用分数。我在大学里也做过同样的问题,我甚至不能用反向传播来训练tic-tac-toe上的多层网络。接下来的一点:我认为你可以使用9个输入神经元而不是18个,因为你可以使用0表示“未占用”,1表示“自占用”,1表示“对手占用”。只有9个输入。。。。大概使用一些隐藏的神经元,你肯定能够提取所需的信息。否则,未占用的场地将被视为自用场地和对手占用场地的平均值