RosettaCodeData/Task/Evolutionary-algorithm/Ruby/evolutionary-algorithm.rb

40 lines
942 B
Ruby
Raw Permalink Normal View History

2013-04-10 16:57:12 -07:00
@target = "METHINKS IT IS LIKE A WEASEL"
2014-01-17 05:32:22 +00:00
Charset = [" ", *"A".."Z"]
COPIES = 100
2013-04-10 16:57:12 -07:00
2014-01-17 05:32:22 +00:00
def random_char; Charset.sample end
2013-04-10 16:57:12 -07:00
def fitness(candidate)
sum = 0
candidate.chars.zip(@target.chars) {|x,y| sum += (x[0].ord - y[0].ord).abs}
100.0 * Math.exp(Float(sum) / -10.0)
end
def mutation_rate(candidate)
1.0 - Math.exp( -(100.0 - fitness(candidate)) / 400.0)
end
def mutate(parent, rate)
parent.each_char.collect {|ch| rand <= rate ? random_char : ch}.join
end
def log(iteration, rate, parent)
puts "%4d %.2f %5.1f %s" % [iteration, rate, fitness(parent), parent]
end
iteration = 0
parent = Array.new(@target.length) {random_char}.join
prev = ""
while parent != @target
iteration += 1
rate = mutation_rate(parent)
if prev != parent
2014-01-17 05:32:22 +00:00
log(iteration, rate, parent)
2013-04-10 16:57:12 -07:00
prev = parent
end
2014-01-17 05:32:22 +00:00
copies = [parent] + Array.new(COPIES) {mutate(parent, rate)}
2013-04-10 16:57:12 -07:00
parent = copies.max_by {|c| fitness(c)}
end
2014-01-17 05:32:22 +00:00
log(iteration, rate, parent)