我模拟了朱莉娅不断变化的人口。在我的代码中的某个地方,我随机抽样(样本由个体的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
。