上下文 我正在模拟行为进化。为此,我使用神经网络来模拟行为。实际上有数以千计的这些神经网络相互作用。在任何给定代的末尾,最强烈的行为被复制到其邻居上。当发生这种情况时,我需要在新的神经网络上创建一个相同但独立的更强大的神经网络版本;从而取代它。
问题 我已经研究过深度克隆,但它可以复制节点引用,而不是创建一个新的相同实例。困难来自系统结构。我无法看到如何改善它。 速度也是一个因素。我需要这个每周运行数百万次迭代。
非常感谢任何帮助。
系统结构
细胞
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
}
深度克隆(我从stackOverflow中扯掉某人)
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 :(得分:0)
我认为您的代码只包含一个小错误:
Network network = (Network) ois.readObject();
return (Network) ois.readObject();
在这里,您从ObjectInputStream
读取网络两次,并返回第二个实例(应该为null)。如果删除第一行,它应该可以工作。
对象经过深度克隆,新网络实例中的所有引用都正确地相互连接,而不是原始对象。
然而,性能方面,这种序列化/反序列化非常昂贵。如果性能至关重要,我建议找一个处理速度更快的结构。
例如,每个网络的两个平面数组,一个具有权重(作为原始浮点数或甚至整数),另一个具有到下一个节点的int索引,使用{{1}复制起来至少要快一个数量级}}
答案 1 :(得分:0)
这部分深度克隆代码对我来说很奇怪:
System.arraycopy()
两次读取对象,只返回第二个...我希望这里有例外。