25 lines
742 B
ObjectPascal
25 lines
742 B
ObjectPascal
const
|
|
Target = 'METHINKS IT IS LIKE A WEASEL';
|
|
Alphabet = ' ABCDEFGHIJLKLMNOPQRSTUVWXYZ';
|
|
P = 0.05;
|
|
C = 100;
|
|
|
|
function negFitness(trial: string) :=
|
|
trial.Zip(Target, (x, y) -> (if x = y then 0 else 1)).Sum;
|
|
|
|
function mutate(parent: string) :=
|
|
parent.Aggregate('', (mut, ch) -> mut + (if Random(1.0) < P then Alphabet.RandomElement else ch));
|
|
|
|
begin
|
|
var parent := (1..Target.Length).Aggregate('', (p, x)-> p + Alphabet.RandomElement);
|
|
var i := 0;
|
|
while parent <> Target do
|
|
begin
|
|
var copies := ArrGen(C, x -> mutate(parent));
|
|
parent := copies.Aggregate((p, x) -> (if negFitness(x) < negFitness(p) then x else p));
|
|
if i mod 10 = 0 then Println(i, ' ', parent);
|
|
i += 1;
|
|
end;
|
|
Println(i, ' ', parent)
|
|
end.
|