41 lines
1.1 KiB
Plaintext
41 lines
1.1 KiB
Plaintext
import "random" for Random
|
|
|
|
var target = "METHINKS IT IS LIKE A WEASEL"
|
|
var set = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
|
|
var rand = Random.new()
|
|
|
|
// fitness: 0 is perfect fit. greater numbers indicate worse fit.
|
|
var fitness = Fn.new { |a| (0...target.count).count { |i| a[i] != target[i] } }
|
|
|
|
// set m to mutation of p, with each character of p mutated with probability r
|
|
var mutate = Fn.new { |p, m, r|
|
|
var i = 0
|
|
for (ch in p) {
|
|
if (rand.float(1) < r) {
|
|
m[i] = set[rand.int(set.count)]
|
|
} else {
|
|
m[i] = ch
|
|
}
|
|
i = i + 1
|
|
}
|
|
}
|
|
|
|
var parent = List.filled(target.count, "")
|
|
(0...parent.count).each { |i| parent[i] = set[rand.int(set.count)] }
|
|
var c = 20 // number of times to copy and mutate parent
|
|
var copies = List.filled(c, null)
|
|
for (i in 0...c) copies[i] = List.filled(parent.count, 0)
|
|
System.print(parent.join())
|
|
var best = fitness.call(parent)
|
|
while (best > 0) {
|
|
for (cp in copies) mutate.call(parent, cp, 0.05)
|
|
for (cp in copies) {
|
|
var fm = fitness.call(cp)
|
|
if (fm < best) {
|
|
best = fm
|
|
parent = cp.toList
|
|
System.print(parent.join())
|
|
}
|
|
}
|
|
}
|