45 lines
994 B
Plaintext
45 lines
994 B
Plaintext
pragma.syntax("0.9")
|
|
pragma.enable("accumulator")
|
|
|
|
def target := "METHINKS IT IS LIKE A WEASEL"
|
|
def alphabet := "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
|
|
def C := 100
|
|
def RATE := 0.05
|
|
|
|
def randomCharString() {
|
|
return E.toString(alphabet[entropy.nextInt(alphabet.size())])
|
|
}
|
|
|
|
def fitness(string) {
|
|
return accum 0 for i => ch in string {
|
|
_ + (ch == target[i]).pick(1, 0)
|
|
}
|
|
}
|
|
|
|
def mutate(string, rate) {
|
|
return accum "" for i => ch in string {
|
|
_ + (entropy.nextDouble() < rate).pick(randomCharString(), E.toString(ch))
|
|
}
|
|
}
|
|
|
|
def weasel() {
|
|
var parent := accum "" for _ in 1..(target.size()) { _ + randomCharString() }
|
|
var generation := 0
|
|
|
|
while (parent != target) {
|
|
println(`$generation $parent`)
|
|
def copies := accum [] for _ in 1..C { _.with(mutate(parent, RATE)) }
|
|
var best := parent
|
|
for c in copies {
|
|
if (fitness(c) > fitness(best)) {
|
|
best := c
|
|
}
|
|
}
|
|
parent := best
|
|
generation += 1
|
|
}
|
|
println(`$generation $parent`)
|
|
}
|
|
|
|
weasel()
|