2009-10-11 42 views
2

我在看骑士之旅的问题,并决定在python中使用神经网络来实现它,以找到解决方案。使用神经网络的骑士之旅

方法的一般解释可以Wikipedia

发现虽然我认为我正确实施它(我看不到任何东西,这是错误),这是行不通的,它更新了几个链接,删除连接顶点的度数超过2的边,但它不会收敛在解上。

我想知道如果有人有任何想法,我已经实施了不正确的(抱歉可怕的代码)。

编辑
工作的代码可以在Yacoby.net

+0

你可以发布你的最终解决方案吗?可能会对其他人有所帮助 – daddz 2009-10-13 08:31:40

+0

虽然我目前的解决方案工作正常,但我希望在发布之前添加模式检测。 – Yacoby 2009-10-13 09:36:52

+0

添加了工作解决方案 – Yacoby 2009-10-14 13:07:34

回答

3

你不能更新神经元。由于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() 
+0

我无法相信我怎么能错过如此明显的东西。答案被接受为稍微更好的解释。 – Yacoby 2009-10-11 22:12:18

2

第一印象可以发现的是,你只需要在板上的一个缓冲区。我基于这样一个事实,即在迭代之间我没有看到任何缓冲区交换 - 我没有仔细查看,可能很容易出错。

如果你修改了一个缓冲区,当你做邻居计数时,你将它们建立在一个部分修改的电路板上 - 而不是你开始时的电路板。

0

寻找你的代码后,我觉得你对你使用的可能是不正确的公式解释。你说当更新状态时,你添加四个而不是两个,并减去神经元本身的输出。它在我看来就像是你两次减去神经元本身的输出。找到邻居的代码似乎不能区分神经元的邻居和神经元本身,并且你运行这个代码两次 - 每个顶点一次。

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