55 lines
1.5 KiB
Rexx
55 lines
1.5 KiB
Rexx
/* Weasel.rex - Me thinks thou art a weasel. - G,M.D. - 2/25/2011 */
|
|
arg C M
|
|
/* C is the number of children parent produces each generation. */
|
|
/* M is the mutation rate of each gene (character) */
|
|
|
|
call initialize
|
|
generation = 0
|
|
do until parent = target
|
|
most_fitness = fitness(parent)
|
|
most_fit = parent
|
|
do C
|
|
child = mutate(parent, M)
|
|
child_fitness = fitness(child)
|
|
if child_fitness > most_fitness then
|
|
do
|
|
most_fitness = child_fitness
|
|
most_fit = child
|
|
say "Generation" generation": most fit='"most_fit"', fitness="left(most_fitness,4)
|
|
end
|
|
end
|
|
parent = most_fit
|
|
generation = generation + 1
|
|
end
|
|
exit
|
|
|
|
initialize:
|
|
target = "METHINKS IT IS LIKE A WEASEL"
|
|
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
|
|
c_length_target = length(target)
|
|
parent = mutate(copies(" ", c_length_target), 1.0)
|
|
do i = 1 to c_length_target
|
|
target_ch.i = substr(target,i,1)
|
|
end
|
|
return
|
|
|
|
fitness: procedure expose target_ch. c_length_target
|
|
arg parm_string
|
|
fitness = 0
|
|
do i_target = 1 to c_length_target
|
|
if substr(parm_string,i_target,1) = target_ch.i_target then
|
|
fitness = fitness + 1
|
|
end
|
|
return fitness
|
|
|
|
mutate:procedure expose alphabet
|
|
arg string, parm_mutation_rate
|
|
result = ""
|
|
do istr = 1 to length(string)
|
|
if random(1,1000)/1000 <= parm_mutation_rate then
|
|
result = result || substr(alphabet,random(1,length(alphabet)),1)
|
|
else
|
|
result = result || substr(string,istr,1)
|
|
end
|
|
return result
|