Python 骑士';用神经网络进行旅游

Python 骑士';用神经网络进行旅游,python,graph,neural-network,Python,Graph,Neural Network,我正在研究骑士巡演问题,并决定尝试用python实现它,使用神经网络来寻找解决方案 有关该方法的一般说明,请参见 虽然我认为我已经正确地实现了它(我看不出任何其他错误),但它不起作用,它更新了一些链接,删除了连接顶点的阶数大于2的边,但它不会收敛于解决方案 我想知道是否有人对我不正确地实现了什么有任何想法(对于可怕的代码感到抱歉) 编辑 工作代码可以在GitHub上找到,第一印象是你只有一个电路板缓冲区。我这样做是基于这样一个事实,即我没有看到迭代之间有任何缓冲区交换——我没有仔细观察,可能很容

我正在研究骑士巡演问题,并决定尝试用python实现它,使用神经网络来寻找解决方案

有关该方法的一般说明,请参见

虽然我认为我已经正确地实现了它(我看不出任何其他错误),但它不起作用,它更新了一些链接,删除了连接顶点的阶数大于2的边,但它不会收敛于解决方案

我想知道是否有人对我不正确地实现了什么有任何想法(对于可怕的代码感到抱歉)

编辑

工作代码可以在GitHub上找到,第一印象是你只有一个电路板缓冲区。我这样做是基于这样一个事实,即我没有看到迭代之间有任何缓冲区交换——我没有仔细观察,可能很容易出错


如果你在适当的位置修改一个缓冲区,当你进行邻居计数时,你将它们建立在一个部分修改过的板上,而不是一开始的板上。

你不能在适当的位置更新神经元。由于U[t+1]依赖于U[t]和V[t],如果您已经更新了V,那么U的计算将是错误的

我认为您应该将更新分为两个阶段 更新_状态和更新_输出,以便更新所有U,然后更新所有V

    for n in neurons:
        n.update_state()
    for n in neurons:
        n.update_output()

在看过你的代码后,我认为你对你使用的公式的解释可能是不正确的。你说当更新状态时,你加四而不是两,然后减去神经元本身的输出。在我看来,你把神经元本身的输出减去两次。查找邻域的代码似乎无法区分神经元的邻域和神经元本身,您需要运行此代码两次-每个顶点一次


对我自己代码的测试似乎证实了这一点。当我将神经元自身的输出减去两次而不是一次时,收敛速度会大大提高。

我真不敢相信我怎么会错过如此明显的东西。答案被接受,因为解释稍微好一点。你能发布你的最终解决方案吗?可能对其他人有帮助虽然我目前的解决方案很好,但我想在发布之前添加模式检测。