class CrossoverArray

Class for handling crossover against arrays. Supports

* Single point crossover
* n-point corssover

Public Class Methods

build_dna_by_synchronous(cdna_a, cdna_b, pdna_a, pdna_b, ordinal_range, synchronous) click to toggle source
# File lib/evopop/crossover_array.rb, line 57
def self.build_dna_by_synchronous(cdna_a, cdna_b, pdna_a, pdna_b, ordinal_range, synchronous)
  pdnas = [pdna_a, pdna_b]
  pdnas.reverse! unless synchronous
  cdna_a += pdnas[0][ordinal_range]
  cdna_b += pdnas[1][ordinal_range]

  [cdna_a, cdna_b]
end
combine_on_ordinal(dna_a, dna_b, ordinals) click to toggle source
# File lib/evopop/crossover_array.rb, line 53
def self.combine_on_ordinal(dna_a, dna_b, ordinals)
  dna_a[0..ordinals[0]] + dna_b[(ordinals[0] + 1)..ordinals[1]] + dna_a[(ordinals[1] + 1)..dna_a.length - 1]
end
n_point_crossover(dna_a, dna_b, ordinals) click to toggle source
# File lib/evopop/crossover_array.rb, line 29
def self.n_point_crossover(dna_a, dna_b, ordinals)
  ret_a = []
  ret_b = []

  old_ordinal = 0
  toggle = true
  ordinals << dna_a.length + 1

  ordinals.each do |ordinal|
    if toggle
      ret_a += dna_a[old_ordinal..ordinal]
      ret_b += dna_b[old_ordinal..ordinal]
    else
      ret_a += dna_b[old_ordinal..ordinal]
      ret_b += dna_a[old_ordinal..ordinal]
    end

    old_ordinal = ordinal + 1
    toggle = !toggle
  end

  [ret_a, ret_b]
end
one_point_crossover(a, b, ordinal) click to toggle source
# File lib/evopop/crossover_array.rb, line 8
def self.one_point_crossover(a, b, ordinal)
  # Compose the dna of the first child from the first chunk of the
  # first candidate and the second chunk of the second candidate
  dna_a_left = a[0..ordinal]
  dna_b_right = b[(ordinal + 1)..-1]

  # Compose the dna of the second child from the first chunk of the
  # first candidate and the second chunk of the second candidate
  dna_b_left = b[0..ordinal]
  dna_a_right = a[(ordinal + 1)..-1]

  [dna_a_left + dna_b_right, dna_b_left + dna_a_right]
end
two_point_crossover(cdna_a, cdna_b, ordinals) click to toggle source
# File lib/evopop/crossover_array.rb, line 22
def self.two_point_crossover(cdna_a, cdna_b, ordinals)
  dna_a = combine_on_ordinal(cdna_a, cdna_b, ordinals)
  dna_b = combine_on_ordinal(cdna_b, cdna_a, ordinals)

  [dna_a, dna_b]
end