繁殖种群.我应该“深拷贝”每个人吗?



我模拟了朱莉娅不断变化的人口。在我的代码中的某个地方,我随机抽样(样本由个体的fitnesses加权)个体,以形成下一代。因为同一个人可以被多次采样(用替换采样),所以我必须复制这些个体,而不仅仅是创建一个指向相同数据的新指针。以下是目前代码的外观:

##### Reproduction ######
NewPopulation = Array(Individuals, nb_individuals_in_population)
fitnesses = WeightVec(fitnesses)
for i = 1:nb_individuals_in_population
    NewPopulation[i] = deepcopy(sample(OldPopulation, fitnesses))
end

,其中Individuals是由两个true/false数组组成的type

是否有一种性能更高(更快)的方法来模拟再现?

我的主要疑问是,当我deepcopy的数据多于我需要deepcopy.有些Individuals只会采样一次,所以我不需要deepcopy它们。我不应该深度复制,然后在NewPopulation中搜索多个副本中的个人以deepcopy他们吗?你认为我会赢得时间吗?有没有更快的解决方案?此外,除了我抽样个人的方式之外,可能还有更好的选择。

大概你只需要复制,如果不同的副本以后会以不同的方式变异。如果只有没有突变的繁殖和选择,那么参考"复制"的个体就足够了。

仅供参考,deepcopy(在当前的 Julia 版本中)很慢;如果您需要性能,您应该为您的类型编写特定的copy方法。

虽然你可以通过只deepcopy多次采样的那些来获得一些时间,但我相当确定这不会是你的算法的缓慢部分(我希望它是适应度评估功能)。

此外,这在一定程度上取决于Individual究竟是什么。如果所有的田野都像漂浮物一样immutables自己,那么也许也可以做Individual immutable。如果它具有以下字段,例如 Matrix{Float64},这是行不通的,需要deepcopy

最新更新