63 lines
1.5 KiB
Awk
63 lines
1.5 KiB
Awk
#!/bin/awk -f
|
|
function randchar(){
|
|
return substr(charset,randint(length(charset)+1),1)
|
|
}
|
|
function mutate(gene,rate ,l,newgene){
|
|
newgene = ""
|
|
for (l=1; l < 1+length(gene); l++){
|
|
if (rand() < rate)
|
|
newgene = newgene randchar()
|
|
else
|
|
newgene = newgene substr(gene,l,1)
|
|
}
|
|
return newgene
|
|
}
|
|
function fitness(gene,target ,k,fit){
|
|
fit = 0
|
|
for (k=1;k<1+length(gene);k++){
|
|
if (substr(gene,k,1) == substr(target,k,1)) fit = fit + 1
|
|
}
|
|
return fit
|
|
}
|
|
function randint(n){
|
|
return int(n * rand())
|
|
}
|
|
function evolve(){
|
|
maxfit = fitness(parent,target)
|
|
oldfit = maxfit
|
|
maxj = 0
|
|
for (j=1; j < D; j++){
|
|
child[j] = mutate(parent,mutrate)
|
|
fit[j] = fitness(child[j],target)
|
|
if (fit[j] > maxfit) {
|
|
maxfit = fit[j]
|
|
maxj = j
|
|
}
|
|
}
|
|
if (maxfit > oldfit) parent = child[maxj]
|
|
}
|
|
|
|
BEGIN{
|
|
target = "METHINKS IT IS LIKE A WEASEL"
|
|
charset = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
mutrate = 0.10
|
|
if (ARGC > 1) mutrate = ARGV[1]
|
|
lenset = length(charset)
|
|
C = 100
|
|
D = C + 1
|
|
parent = ""
|
|
for (j=1; j < length(target)+1; j++) {
|
|
parent = parent randchar()
|
|
}
|
|
print "target: " target
|
|
print "fitness of target: " fitness(target,target)
|
|
print "initial parent: " parent
|
|
gens = 0
|
|
while (parent != target){
|
|
evolve()
|
|
gens = gens + 1
|
|
if (gens % 10 == 0) print "after " gens " generations,","new parent: " parent," with fitness: " fitness(parent,target)
|
|
}
|
|
print "after " gens " generations,"," evolved parent: " parent
|
|
}
|