我正在研究骑士巡回赛问题,并决定尝试使用神经网络在 python 中实现它以找到解决方案。
该方法的一般解释可以在维基百科上找到
虽然我认为我已经正确实现了它(我看不到其他任何错误),但它不起作用,它更新了一些链接,删除了连接顶点度数大于二的边缘,但它没有不要收敛于解决方案。
我想知道是否有人对我错误实施的内容有任何想法(对不起,可怕的代码)。
编辑
工作代码可以在 GitHub https://github.com/Yacoby/KnightsTour找到
我正在研究骑士巡回赛问题,并决定尝试使用神经网络在 python 中实现它以找到解决方案。
该方法的一般解释可以在维基百科上找到
虽然我认为我已经正确实现了它(我看不到其他任何错误),但它不起作用,它更新了一些链接,删除了连接顶点度数大于二的边缘,但它没有不要收敛于解决方案。
我想知道是否有人对我错误实施的内容有任何想法(对不起,可怕的代码)。
编辑
工作代码可以在 GitHub https://github.com/Yacoby/KnightsTour找到
您无法在原地更新神经元。由于 U[t+1] 取决于 U[t] 和 V[t],如果您已经更新了 V,则 U 的计算将是错误的
我认为您应该将更新分为两个阶段 update_state 和 update_output,因此所有 U 都被更新,然后所有 V
for n in neurons:
n.update_state()
for n in neurons:
n.update_output()
第一印象是您只有一个用于电路板的缓冲区。我基于这样一个事实,即我没有看到迭代之间的任何缓冲区交换——我没有仔细观察,可能很容易出错。
如果您修改单个缓冲区,当您进行邻居计数时,您会将它们基于部分修改的电路板 - 而不是您一开始拥有的电路板。
查看您的代码后,我认为您对您使用的公式的解释可能不正确。你说在更新状态时你加了四个而不是两个,并减去了神经元本身的输出。在我看来,您将神经元本身的输出减去了两次。您查找邻居的代码似乎无法区分神经元的邻居和神经元本身,并且您运行此代码两次 - 每个顶点一次。
对我自己的代码的测试似乎证实了这一点。当我减去神经元自身的输出两次而不是一次时,收敛率会大大提高。