File size: 1,363 Bytes
2a2a517
6e5f7ce
d3b42d5
2a2a517
 
d3b42d5
2a2a517
d3b42d5
 
a369299
 
b364345
 
 
 
5dffe92
6e5f7ce
5dffe92
2a2a517
c3d54db
b364345
2a2a517
5dffe92
b364345
9c27796
 
b364345
9c27796
 
 
b364345
8ff33c6
b364345
 
6e5f7ce
9c27796
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
include("eureqa.jl")

println("Lets try to learn (x2^2 + cos(x3)) using regularized evolution from scratch")
const nthreads = Threads.nthreads()
println("Running with $nthreads threads")
const npop = 1000
const annealing = true
const niterations = 100
const ncyclesperiteration = 30000

# 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:niterations

    # Spawn threads to run indepdent evolutions, then gather them
    @inbounds Threads.@threads for i=1:nthreads
        allPops[i] = run(allPops[i], ncyclesperiteration, annealing, verbose=1000)
    end

    # Get best 10 models from each evolution. 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 used twice
            allPops[j].members[k] = deepcopy(bestPops.members[rand(1:size(bestPops.members)[1])])
        end
    end
end