繁殖种群。我应该“深度复制”每个人吗?

Reproducing a population. Should I `deepcopy` each individual?

我在 Julia 中模拟了一个不断发展的人口。在我的代码中的某个地方,我随机抽样(样本由个体的 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 多次采样的那些来获得一些时间,但我相当确定这不会是您算法的缓慢部分(我希望它作为适应度评价函数)。

此外,它确实在某种程度上取决于 Individual 的确切含义。如果所有的字段本身都是 immutables,就像浮点数一样,那么也可以使 Individual immutable。如果它有字段,例如Matrix{Float64},这是行不通的,需要 deepcopy

大概只有当不同的副本以后会以不同的方式发生变异时,您才需要复制。如果只是没有突变的育种和选择,那么对 "copied" 个体的引用就足够了。

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