我在看骑士之旅的问题,并决定在python中使用神经网络来实现它,以找到解决方案。使用神经网络的骑士之旅
方法的一般解释可以Wikipedia
发现虽然我认为我正确实施它(我看不到任何东西,这是错误),这是行不通的,它更新了几个链接,删除连接顶点的度数超过2的边,但它不会收敛在解上。
我想知道如果有人有任何想法,我已经实施了不正确的(抱歉可怕的代码)。
编辑
工作的代码可以在Yacoby.net
我在看骑士之旅的问题,并决定在python中使用神经网络来实现它,以找到解决方案。使用神经网络的骑士之旅
方法的一般解释可以Wikipedia
发现虽然我认为我正确实施它(我看不到任何东西,这是错误),这是行不通的,它更新了几个链接,删除连接顶点的度数超过2的边,但它不会收敛在解上。
我想知道如果有人有任何想法,我已经实施了不正确的(抱歉可怕的代码)。
编辑
工作的代码可以在Yacoby.net
你不能更新神经元。由于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()
我无法相信我怎么能错过如此明显的东西。答案被接受为稍微更好的解释。 – Yacoby 2009-10-11 22:12:18
第一印象可以发现的是,你只需要在板上的一个缓冲区。我基于这样一个事实,即在迭代之间我没有看到任何缓冲区交换 - 我没有仔细查看,可能很容易出错。
如果你修改了一个缓冲区,当你做邻居计数时,你将它们建立在一个部分修改的电路板上 - 而不是你开始时的电路板。
寻找你的代码后,我觉得你对你使用的可能是不正确的公式解释。你说当更新状态时,你添加四个而不是两个,并减去神经元本身的输出。它在我看来就像是你两次减去神经元本身的输出。找到邻居的代码似乎不能区分神经元的邻居和神经元本身,并且你运行这个代码两次 - 每个顶点一次。
我自己的代码测试似乎证实了这一点。当我减去神经元自己的输出两次而不是一次时,收敛速度大大提高。
你可以发布你的最终解决方案吗?可能会对其他人有所帮助 – daddz 2009-10-13 08:31:40
虽然我目前的解决方案工作正常,但我希望在发布之前添加模式检测。 – Yacoby 2009-10-13 09:36:52
添加了工作解决方案 – Yacoby 2009-10-14 13:07:34