class Chromosome
This class represent a chromosome, which contains several allele (gene's values) and is able to mutate, and to cross over.
Public Class Methods
create_random_from(description)
click to toggle source
Create a random chromosome from a description
# File lib/chromosome.rb, line 26 def self.create_random_from(description) new(description.map(&:create_random)) end
cross_over(chromo_a, chromo_b)
click to toggle source
Cross over two chromosomes to provide a new one
# File lib/chromosome.rb, line 41 def self.cross_over(chromo_a, chromo_b) chromo_a, chromo_b = randomize_chromosomes(chromo_a, chromo_b) size = chromo_a.size return chromo_a.copy if size < 2 return new([chromo_a[0], chromo_b[1]].map!(&:copy)) if size == 2 cross_over_impl(chromo_a, chromo_b, size) end
cross_over_impl(chromosome_a, chromosome_b, size)
click to toggle source
# File lib/chromosome.rb, line 49 def self.cross_over_impl(chromosome_a, chromosome_b, size) swap_index = rand(size - 1) new(chromosome_a.each_with_index.map do |from_a, index| (index <= swap_index ? from_a : chromosome_b[index]).copy end) end
new(alleles)
click to toggle source
Construct a chromosome from an array of alleles
# File lib/chromosome.rb, line 12 def initialize(alleles) unless alleles.is_a?(Array) puts alleles.inspect raise 'this constructor expect an array of alleles as input' end @alleles = alleles end
randomize_chromosomes(*chromosomes)
click to toggle source
# File lib/chromosome.rb, line 56 def self.randomize_chromosomes(*chromosomes) chromosomes.sort_by! { rand } end
Public Instance Methods
aggregated_alleles()
click to toggle source
Aggregate all alleles values
# File lib/chromosome.rb, line 36 def aggregated_alleles map(&:value).join(';') end
copy()
click to toggle source
Copy the current chromosome and all its alleles
# File lib/chromosome.rb, line 21 def copy Chromosome.new(map(&:copy)) end
mutate()
click to toggle source
Mutate a randomly selected allele of the current chromosome
# File lib/chromosome.rb, line 31 def mutate @alleles[rand size].mutate end