class Gene
todo/check:
find a better name for Gene (incl.4 genes) e.g. GeneFour, Gene4, GeneGroup, GeneSlice,TraitGenes,... -why? why not?
Attributes
d[R]
r1[R]
r2[R]
r3[R]
Public Class Methods
new( arg )
click to toggle source
d (dominant gene) – todo/check: rename to just d instead of d0 - why? why not? r1 (1st order recessive gene) r2 (2nd order recessive gene) r3 (3rd order recessive gene)
# File lib/copycats/gene.rb, line 16 def initialize( arg ) ## (always) assume String in base32/kai for now kai = arg ## puts "Gene.initialize #{kai}" kai = kai.reverse @d = kai[0] @r1 = kai[1] @r2 = kai[2] @r3 = kai[3] end
Public Instance Methods
mix( other )
click to toggle source
# File lib/copycats/gene.rb, line 82 def mix( other ) puts "Gene#mix" self_swapped = swap other_swapped = other.swap gene = self_swapped.mix_inner( other_swapped ) pp gene gene end
mix_inner( other )
click to toggle source
# File lib/copycats/gene.rb, line 64 def mix_inner( other ) puts "Gene#mix_inner" new_d = mutate( other ) if new_d.nil? ## no mutation of gene.d - use "regular" formula new_d = Lottery.rand(100) < 50 ? d : other.d end new_r1 = Lottery.rand(100) < 50 ? r1 : other.r1 new_r2 = Lottery.rand(100) < 50 ? r2 : other.r2 new_r3 = Lottery.rand(100) < 50 ? r3 : other.r3 gene = Gene.new( new_r3 + new_r2 + new_r1 + new_d ) pp gene gene end
mutate( other )
click to toggle source
# File lib/copycats/gene.rb, line 43 def mutate( other ) puts "Gene#mutate" gene1 = Kai::NUMBER[d] ## dominant gene1 gene2 = Kai::NUMBER[other.d] ## dominant gene2 if gene1 > gene2 gene1, gene2 = gene2, gene1 ## make sure gene2 is always bigger end if (gene2 - gene1) == 1 && gene1.even? probability = 25 probability /= 2 if gene1 > 23 if Lottery.rand(100) < probability genex = (gene1 / 2) + 16 ## 16=2^4 puts " bingo! mutation #{gene2}+#{gene1} => #{genex}" puts " #{Kai::ALPHABET[gene2]}+#{Kai::ALPHABET[gene1]} => #{Kai::ALPHABET[genex]}" return Kai::ALPHABET[genex] end end nil # no mutation end
swap()
click to toggle source
# File lib/copycats/gene.rb, line 29 def swap puts "Gene#swap" kai = to_kai.reverse # note: use reverse kai string (kai[0] is first char/digit/letter) 3.downto(1) do |i| if Lottery.rand(100) < 25 puts " bingo! swap #{i}<>#{i-1}" kai[i-1], kai[i] = kai[i], kai[i-1] end end Gene.new( kai.reverse ) ## note: do NOT forget to pass in kai (unreversed) end
to_kai()
click to toggle source
# File lib/copycats/gene.rb, line 27 def to_kai() @r3 + @r2 + @r1 + @d; end