2017-03-18 79 views
0

上下文 我正在模擬行爲進化。爲此,我使用神經網絡來模擬行爲。實際上有成千上萬的這些神經網絡相互作用。在任何一代人的最後,最強烈的行爲都被抄襲到鄰居身上。當發生這種情況時,我需要爲更強大的神經網絡創建一個完全相同但獨立的版本;從而取代它。動態創建一個相同和獨立的神經網絡副本。 JAVA

的問題 我已經看過了深深的克隆,它的工作原理,但它是複製節點的引用,而不是創建一個新的相同的實例。困難來自系統結構。我看不出如何改善它。 速度也是一個因素。我需要這個每週運行數百萬次迭代。

任何幫助將不勝感激。

系統結構

細胞

public class Cell_NN Extends Cell 
{ 
    private Network network; 

    //Methods 
} 

網絡

public class Network implements Cloneable, Serializable 
{ 
    private ArrayList<ArrayList<Node>> net; 
    private ArrayList<Node> layer; 

    //Methods 
} 

節點

public class Node implements Cloneable, Serializable 
{ 
    private ArrayList<Node> nextNodes; 
    private ArrayList<Float> weights; 

    //Methods 
} 

深克隆(這是我從計算器扯掉某人)

public Network deepClone() 
{ 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(this); 

     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
     ObjectInputStream ois = new ObjectInputStream(bais); 
     Network network = (Network) ois.readObject(); 
     return (Network) ois.readObject(); 

    } catch (IOException e) { 
     return null; 
    } catch (ClassNotFoundException e) { 
     return null; 
    } 
} 

我不能確定這是否是允許的,但這裏是我的情況下,github上,你想了解更多的信息:Napier40124399。項目名爲HonorsMain_v2並且是公共的。

+0

看起來更適合CodeReview.SE。你真的遇到了你的代碼問題,比如StackOverflowError? – glee8e

+0

沒有錯誤,一切運行順利。它根本不符合要求。 – Hoijf

+0

不好意思,因爲那段深拷貝代碼看起來不錯,它也是apache commons-lang的[通用克隆工具]所使用的技術(https://github.com/apache/commons-lang/blob/主/ SRC /主/ JAVA /組織/阿帕奇/公地/ lang3/SerializationUtils.java#L77)。我認爲在發佈的代碼中沒有任何錯誤。也許你應該檢查你軟件的其他部分。 – glee8e

回答

0

我覺得你的代碼只包含一個小bug:

Network network = (Network) ois.readObject(); 
    return (Network) ois.readObject(); 

在這裏,你從ObjectInputStream讀取網絡的兩倍,並返回二審(應爲空)。如果你刪除第一行,它應該工作。

該對象被深度克隆,並且新網絡實例中的所有引用都正確地相互連接,而不是原始對象。

但是,性能明智這個序列化/反序列化是相當昂貴的。如果性能是本質的,我建議找到一個更快處理的結構。

例如,使用System.arraycopy(),每個網絡的兩個平面陣列,一個具有權重(作爲原始浮點數或甚至整數),另一個具有int索引到下一個節點,至少比複製快一個數量級。

+0

現在感覺非常愚蠢。謝謝。我會盡量實現你的建議速度提升! – Hoijf

0

深克隆這部分代碼看起來很奇怪對我說:

Network network = (Network) ois.readObject(); 
    return (Network) ois.readObject(); 

閱讀對象兩次,只有返回:第二個......我會在這裏期待一個例外。

+0

現在感覺非常愚蠢。謝謝 – Hoijf