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