RosettaCodeData/Task/Evolutionary-algorithm/PascalABC.NET/evolutionary-algorithm.pas

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.