codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
class Gene attr_reader :code, :cost def initialize(code = '') @code = code @cost = 10 ** 10 end def random(length) @code = (0...length).map {rand(256).chr}.join end def calc_cost(compare_to) total = 0 @code.length.times do |i| d = compare_to[i] - @code[i] total += d * d end @cost = total return @cost end def mate(gene) pivot = @code.length / 2 - 1 child1 = @code[0...pivot] + gene.code[pivot..-1] child2 = gene.code[0...pivot] + @code[pivot..-1] return Gene.new(child1), Gene.new(child2) end def mutate(chance) return if rand > chance index = rand(@code.length) up_or_down = rand < 0.5 ? -1 : 1 new_char = ((@code[index] + up_or_down) & 255).chr @code = @code[0...index] + new_char + @code[(index + 1) .. -1] end def inspect @code.inspect end end class Population def initialize(goal, size) @members = [] @goal = goal @generation_number = 0 size.times do gene = Gene.new gene.random(@goal.length) @members.push(gene) end end def sort @members.sort! {|a, b| a.cost <=> b.cost} end def generation @members.each do |member| member.calc_cost(@goal) end sort #display child1, child2 = @members[0].mate(@members[1]) @members = @members[0...-2] + [child1, child2] @members.each do |member| member.mutate(0.5) member.calc_cost(@goal) if member.code == @goal sort #display return true end end @generation_number += 1 return false end def inspect "Population: generation:#{@generation_number}, best:#{@members[0].inspect}" end end population = Population.new('Hello, world!', 20) until population.generation p population end p population puts 'Success!'
Private
[
?
]
Run code
Submit