Воспроизводство населения. Должен ли я "глубоко копировать" каждого человека?
Я моделирую развивающееся население в Юлии. Где-то в моем коде я выбираю случайным образом (выборка взвешивается 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
это type
сделанный из двух массивов true/false
Есть ли более эффективный (более быстрый) способ имитации воспроизведения?
Мое главное сомнение в том, что когда я deepcopy
больше данных, чем мне нужно deepcopy
, Немного Individuals
будет пробоваться только один раз, поэтому мне не нужно deepcopy
их. Должен ли я не копировать глубже, а затем искать людей, которые находятся в нескольких копиях в NewPopulation
чтобы deepcopy
их? Как вы думаете, я выиграю время? Есть ли более быстрое решение? Кроме того, может быть лучшая альтернатива тому, как я выбираю людей.
2 ответа
Предположительно, вам нужно копировать только в том случае, если различные копии впоследствии будут мутировать по-разному. Если есть только селекция и селекция без мутации, тогда ссылки на "скопированного" индивида будет достаточно.
FYI deepcopy
является медленным (в настоящее время выпускается джулия); если вам нужна производительность, вы должны написать конкретный copy
метод для вашего типа (ов).
Хотя вы могли бы выиграть время только deepcopy
Что касается тех, которые отбираются несколько раз, я вполне уверен, что это не будет медленной частью вашего алгоритма (я ожидаю, что это будет функция оценки пригодности).
Кроме того, это зависит от того, что Individual
это точно. Если все поля просто immutables
сами, как поплавки, то, возможно, сделать Individual
immutable
тоже. Если у него есть поля, например, Matrix{Float64}
это не сработает и deepcopy
нужно.