61 lines
1.0 KiB
Plaintext
61 lines
1.0 KiB
Plaintext
declare
|
|
Target = "METHINKS IT IS LIKE A WEASEL"
|
|
C = 100
|
|
MutateRate = 5 %% percent
|
|
|
|
proc {Main}
|
|
X0 = {MakeN {Length Target} RandomChar}
|
|
in
|
|
for Xi in {Iterate Evolve X0} break:Break do
|
|
{System.showInfo Xi}
|
|
if Xi == Target then {Break} end
|
|
end
|
|
end
|
|
|
|
fun {Evolve Xi}
|
|
Copies = {MakeN C fun {$} {Mutate Xi} end}
|
|
in
|
|
{FoldL Copies MaxByFitness Xi}
|
|
end
|
|
|
|
fun {Mutate Xs}
|
|
{Map Xs
|
|
fun {$ X}
|
|
if {OS.rand} mod 100 < MutateRate then {RandomChar}
|
|
else X
|
|
end
|
|
end}
|
|
end
|
|
|
|
fun {MaxByFitness A B}
|
|
if {Fitness B} > {Fitness A} then B else A end
|
|
end
|
|
|
|
fun {Fitness Candidate}
|
|
{Length {Filter {List.zip Candidate Target Value.'=='} Id}}
|
|
end
|
|
|
|
Alphabet = & |{List.number &A &Z 1}
|
|
fun {RandomChar}
|
|
I = {OS.rand} mod {Length Alphabet} + 1
|
|
in
|
|
{Nth Alphabet I}
|
|
end
|
|
|
|
%% General purpose helpers
|
|
|
|
fun {Id X} X end
|
|
|
|
fun {MakeN N F}
|
|
Xs = {List.make N}
|
|
in
|
|
{ForAll Xs F}
|
|
Xs
|
|
end
|
|
|
|
fun lazy {Iterate F X}
|
|
X|{Iterate F {F X}}
|
|
end
|
|
in
|
|
{Main}
|