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)

Methods

Public Instance methods

[Source]

    # 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

[Validate]