2009-10-11 41 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

尋找你的代碼後,我覺得你對你使用的可能是不正確的公式解釋。你說當更新狀態時,你添加四個而不是兩個,並減去神經元本身的輸出。它在我看來就像是你兩次減去神經元本身的輸出。找到鄰居的代碼似乎不能區分神經元的鄰居和神經元本身,並且你運行這個代碼兩次 - 每個頂點一次。

我自己的代碼測試似乎證實了這一點。當我減去神經元自己的輸出兩次而不是一次時,收斂速度大大提高。