19 lines
786 B
D
19 lines
786 B
D
import std.stdio, std.random, std.algorithm, std.range, std.ascii;
|
|
|
|
enum target = "METHINKS IT IS LIKE A WEASEL"d;
|
|
enum C = 100; // Number of children in each generation.
|
|
enum P = 0.05; // Mutation probability.
|
|
enum fitness = (dchar[] s) => target.zip(s).count!q{ a[0] != a[1] };
|
|
dchar rnd() { return (uppercase ~ " ")[uniform(0, $)]; }
|
|
enum mut = (dchar[] s) => s.map!(a => uniform01 < P ? rnd : a).array;
|
|
|
|
void main() {
|
|
auto parent = generate!rnd.take(target.length).array;
|
|
for (auto gen = 1; parent != target; gen++) {
|
|
// parent = parent.repeat(C).map!mut.array.max!fitness;
|
|
parent = parent.repeat(C).map!mut.array
|
|
.minPos!((a, b) => a.fitness < b.fitness)[0];
|
|
writefln("Gen %2d, dist=%2d: %s", gen, parent.fitness, parent);
|
|
}
|
|
}
|