Spaces:
Sleeping
Sleeping
include("eureqa.jl") | |
println("Lets try to learn (x2^2 + cos(x3) + 5) using regularized evolution from scratch") | |
const nthreads = Threads.nthreads() | |
println("Running with $nthreads threads") | |
const npop = 100 | |
const annealing = true | |
const niterations = 30 | |
const ncyclesperiteration = 10000 | |
# Generate random initial populations | |
allPops = [Population(npop, 3) for j=1:nthreads] | |
bestScore = Inf | |
# Repeat this many evolutions; we collect and migrate the best | |
# each time. | |
for k=1:4 | |
# Spawn independent evolutions | |
# Gather them | |
@inbounds Threads.@threads for i=1:nthreads | |
allPops[i] = run(allPops[i], ncyclesperiteration, annealing) | |
end | |
# Get best 10 models for each processes. Copy because we re-assign later. | |
bestPops = deepcopy(Population([member for pop in allPops for member in bestSubPop(pop).members])) | |
bestCurScoreIdx = argmin([bestPops.members[member].score for member=1:bestPops.n]) | |
bestCurScore = bestPops.members[bestCurScoreIdx].score | |
println(bestCurScore, " is the score for ", stringTree(bestPops.members[bestCurScoreIdx].tree)) | |
# Migration | |
for j=1:nthreads | |
for k in rand(1:npop, 50) | |
# Copy in case one gets copied twice | |
allPops[j].members[k] = deepcopy(bestPops.members[rand(1:size(bestPops.members)[1])]) | |
end | |
end | |
end | |
## Possibly calls once for every thread? But works. | |
# using Distributed | |
# addprocs(8) | |
# @everywhere const nthreads = 8 | |
# @everywhere include("eureqa.jl") | |
# println("Lets try to learn (x2^2 + cos(x3) + 5) using regularized evolution from scratch") | |
# @everywhere const npop = 100 | |
# @everywhere const annealing = false | |
# @everywhere const niterations = 30 | |
# @everywhere const ncyclesperiteration = 10000 | |
# # Generate random initial populations | |
# # Create a mapping for running the algorithm on all processes | |
# @everywhere f = (pop,)->run(pop, ncyclesperiteration, annealing) | |
# @everywhere allPops = [Population(npop, 3) for j=1:nthreads] | |
# @everywhere bestScore = Inf | |
# # Repeat this many evolutions; we collect and migrate the best | |
# # each time. | |
# for k=1:4 | |
# # Spawn independent evolutions | |
# @everywhere futures = [@spawnat :any f(allPops[i]) for i=1:nthreads] | |
# # Gather them | |
# for i=1:nthreads | |
# @everywhere allPops[i] = fetch(futures[i]) | |
# end | |
# # Get best 10 models for each processes. Copy because we re-assign later. | |
# @everywhere bestPops = deepcopy(Population([member for pop in allPops for member in bestSubPop(pop).members])) | |
# @everywhere bestCurScoreIdx = argmin([bestPops.members[member].score for member=1:bestPops.n]) | |
# @everywhere bestCurScore = bestPops.members[bestCurScoreIdx].score | |
# println(bestCurScore, " is the score for ", stringTree(bestPops.members[bestCurScoreIdx].tree)) | |
# # Migration | |
# for j=1:nthreads | |
# for k in rand(1:npop, 50) | |
# # Copy in case one gets copied twice | |
# @everywhere allPops[j].members[k] = deepcopy(bestPops.members[rand(1:size(bestPops.members)[1])]) | |
# end | |
# end | |
# end | |
# julia> @everywhere include_string(Main, $(read("count_heads.jl", String)), "count_heads.jl") | |
# julia> a = @spawnat :any count_heads(100000000) | |
# Future(2, 1, 6, nothing) | |
# julia> b = @spawnat :any count_heads(100000000) | |
# Future(3, 1, 7, nothing) | |
# julia> fetch(a)+fetch(b) | |
# 100001564 | |
# allPops = [Population(npop, 3) for j=1:nthreads] | |
# bestScore = Inf | |
# for i=1:10 | |
# tmpPops = fetch(pmap(f, allPops)) | |
# allPops[1:nthreads] = tmpPops[1:nthreads] | |
# # Get best 11 models for each processes | |
# bestPops = Population([member for pop in allPops for member in bestSubPop(pop).members]) | |
# bestCurScoreIdx = argmin([bestPops.members[member].score for member=1:bestPops.n]) | |
# bestCurScore = bestPops.members[bestCurScoreIdx].score | |
# println(bestCurScore, " is the score for ", stringTree(bestPops.members[bestCurScoreIdx].tree)) | |
# end | |
# function update(allPops::Array{Population, 1}, bestScore::Float64) | |
# # Map it over our workers | |
# #global allPops = deepcopy(pmap(f, deepcopy(allPops))) | |
# #curAllPops = deepcopy(pmap(f, allPops)) | |
# curAllPops = pmap(f, allPops) | |
# for j=1:nthreads | |
# allPops[j] = curAllPops[j] | |
# end | |
# # Get best 10 models for each processes | |
# bestPops = Population([member for pop in allPops for member in bestSubPop(pop).members]) | |
# bestCurScoreIdx = argmin([bestPops.members[member].score for member=1:bestPops.n]) | |
# bestCurScore = bestPops.members[bestCurScoreIdx].score | |
# if bestCurScore < bestScore | |
# bestScore = bestCurScore | |
# println(bestScore, " is the score for ", stringTree(bestPops.members[bestCurScoreIdx].tree)) | |
# end | |
# # Migration | |
# for j=1:nthreads | |
# allPops[j].members[1:50] = deepcopy(bestPops.members[rand(1:bestPops.n, 50)]) | |
# end | |
# return allPops, bestScore | |
# end | |
# function runExperiment() | |
# # Do niterations cycles | |
# allPops = [Population(npop, 3) for j=1:nthreads] | |
# bestScore = Inf | |
# for i=1:niterations | |
# allPops, bestScore = update(allPops, bestScore) | |
# end | |
# return bestScore | |
# end | |
# runExperiment() | |