35 lines
777 B
Nim
35 lines
777 B
Nim
|
|
import math, os
|
||
|
|
randomize()
|
||
|
|
|
||
|
|
const
|
||
|
|
target = "METHINKS IT IS LIKE A WEASEL"
|
||
|
|
alphabet = " ABCDEFGHIJLKLMNOPQRSTUVWXYZ"
|
||
|
|
p = 0.05
|
||
|
|
c = 100
|
||
|
|
|
||
|
|
proc random(a: string): char = a[random(a.low..a.len)]
|
||
|
|
|
||
|
|
proc negFitness(trial): int =
|
||
|
|
for i in 0 .. <trial.len:
|
||
|
|
if target[i] != trial[i]: inc result
|
||
|
|
|
||
|
|
proc mutate(parent): string =
|
||
|
|
result = ""
|
||
|
|
for c in parent: result.add if random(1.0) < p: random(alphabet) else: c
|
||
|
|
|
||
|
|
var parent = ""
|
||
|
|
for i in 1..target.len: parent.add random(alphabet)
|
||
|
|
|
||
|
|
var i = 0
|
||
|
|
while parent != target:
|
||
|
|
var copies = newSeq[string](c)
|
||
|
|
for i in 0 .. <copies.len: copies[i] = mutate(parent)
|
||
|
|
|
||
|
|
var best = copies[0]
|
||
|
|
for i in 1 .. <copies.len:
|
||
|
|
if negFitness(copies[i]) < negFitness(best): best = copies[i]
|
||
|
|
parent = best
|
||
|
|
|
||
|
|
echo i, " ", parent
|
||
|
|
inc i
|