32 lines
1.1 KiB
Plaintext
32 lines
1.1 KiB
Plaintext
def alphabet: [' ABCDEFGHIJKLMNOPQRSTUVWXYZ'...];
|
|
def target: ['METHINKS IT IS LIKE A WEASEL'...];
|
|
def generationSize: 100;
|
|
def mutationPercent: 10;
|
|
|
|
source randomCharacter
|
|
$alphabet::length -> SYS::randomInt -> $alphabet($+1)!
|
|
end randomCharacter
|
|
|
|
templates countFitness
|
|
@:0;
|
|
$ -> \[i](when <=$target($i)> do @countFitness: $@countFitness + 1; \) -> !VOID
|
|
{ candidate: $, fitness: $@countFitness } !
|
|
end countFitness
|
|
|
|
sink evolve
|
|
@: {generation: 0"1", parent: $};
|
|
$@.parent -> #
|
|
when <{fitness: <=$target::length>}> do
|
|
'Target "$target...;" reached after $@.generation; generations' -> !OUT::write
|
|
otherwise
|
|
'Fitness $.fitness; at generation $@.generation;: "$.candidate...;"$#10;' -> !OUT::write
|
|
@.generation: $@.generation + 1"1";
|
|
1..$generationSize -> [$@.parent.candidate... -> \(
|
|
when <?(100 -> SYS::randomInt <..~$mutationPercent>)> do $randomCharacter!
|
|
otherwise $!
|
|
\)] -> countFitness -> \(when <{fitness: <$@evolve.parent.fitness..>}> do @evolve.parent: $;\) -> !VOID
|
|
$@.parent -> #
|
|
end evolve
|
|
|
|
[1..$target::length -> $randomCharacter] -> countFitness -> !evolve
|