2017-03-18 80 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