Spaces:
Running
Running
import Random: shuffle! | |
# Pass through the population several times, replacing the oldest | |
# with the fittest of a small subsample | |
function regEvolCycle(pop::Population, T::Float32, curmaxsize::Integer, | |
frequencyComplexity::Array{Float32, 1})::Population | |
# Batch over each subsample. Can give 15% improvement in speed; probably moreso for large pops. | |
# but is ultimately a different algorithm than regularized evolution, and might not be | |
# as good. | |
if fast_cycle | |
shuffle!(pop.members) | |
n_evol_cycles = round(Integer, pop.n/ns) | |
babies = Array{PopMember}(undef, n_evol_cycles) | |
# Iterate each ns-member sub-sample | |
@inbounds Threads.@threads for i=1:n_evol_cycles | |
best_score = Inf32 | |
best_idx = 1+(i-1)*ns | |
# Calculate best member of the subsample: | |
for sub_i=1+(i-1)*ns:i*ns | |
if pop.members[sub_i].score < best_score | |
best_score = pop.members[sub_i].score | |
best_idx = sub_i | |
end | |
end | |
allstar = pop.members[best_idx] | |
babies[i] = iterate(allstar, T, curmaxsize, frequencyComplexity) | |
end | |
# Replace the n_evol_cycles-oldest members of each population | |
@inbounds for i=1:n_evol_cycles | |
oldest = argmin([pop.members[member].birth for member=1:pop.n]) | |
pop.members[oldest] = babies[i] | |
end | |
else | |
for i=1:round(Integer, pop.n/ns) | |
allstar = bestOfSample(pop) | |
baby = iterate(allstar, T, curmaxsize, frequencyComplexity) | |
#printTree(baby.tree) | |
oldest = argmin([pop.members[member].birth for member=1:pop.n]) | |
pop.members[oldest] = baby | |
end | |
end | |
return pop | |
end | |