| Module | RouletteSelection |
| In: |
lib/charlie/selection.rb
|
Roulette selection without replacement. Probability of individual i being selected is fitness(i) / sum fitness(1..population size)
# File lib/charlie/selection.rb, line 48
48: def next_generation(population)
49: partial_sum = []
50: sum = 0
51: population.each{|e| partial_sum << (sum += e.fitness) }
52:
53: n = population.size
54: new_pop = []
55: i = [0,0]
56: while new_pop.size < n
57: i[0] = i[1]
58: until i[0]!=i[1]
59: i.map!{ # binary search
60: r = rand * sum
61: l = 0; u = n-1;
62: while l!=u
63: m = (l+u)/2
64: if partial_sum[m] < r
65: l = m+1
66: else
67: u = m
68: end
69: end
70: l
71: }
72: end
73: new_pop += yield(population[i[0]],population[i[1]])
74: end
75: new_pop.pop until new_pop.size == population.size
76: new_pop
77: end