54 lines
1.7 KiB
Plaintext
54 lines
1.7 KiB
Plaintext
Module WeaselAlgorithm2 {
|
|
Print "Evolutionary Algorithm"
|
|
\\ Weasel Algorithm
|
|
\\ Using dynamic array, which expand if no fitness change,
|
|
\\ and reduce to minimum when fitness changed
|
|
l$="ABCDEFGHIJKLMNOPQRSTUVWXYZ "
|
|
randomstring$=lambda$ l$ ->{
|
|
res$=""
|
|
For i=1 to 28: res$+=Mid$(L$,Random(1,27),1):next i
|
|
=res$
|
|
}
|
|
m$="METHINKS IT IS LIKE A WEASEL"
|
|
lm=len(m$)
|
|
fitness=lambda m$, lm (this$)-> {
|
|
score=0 : For i=1 to lm {score+=If(mid$(m$,i,1)=mid$(this$, i, 1)->1,0)} : =score
|
|
}
|
|
Mutate$=lambda$ l$ (w$)-> {
|
|
for i=1 to len(w$) {
|
|
if random(1,100)<=5 then { insert i, 1 w$=mid$(l$, random(1,27),1) }
|
|
}
|
|
=w$
|
|
}
|
|
f$=randomstring$()
|
|
topscore=0
|
|
last=0
|
|
Pen 11 {Print "Fitness |Target:", @(16),m$, @(47),"|Total Strings"}
|
|
Print Over $(3,8), str$(topscore/28,"##0.0%"),"",$(0),f$, 0
|
|
count=0
|
|
gen=30
|
|
mut=0
|
|
{
|
|
last=0
|
|
Dim a$(1 to gen)<<mutate$(f$)
|
|
mut+=gen
|
|
oldscore=topscore
|
|
For i=1 to gen {
|
|
topscore=max.data(topscore, fitness(a$(i)))
|
|
If oldscore<topscore Then last=i: oldscore=topscore
|
|
}
|
|
If last>0 Then {
|
|
f$=a$(last) : gen=30
|
|
} Else gen+=50
|
|
Print Over $(3,8), str$(topscore/28,"##0.0%"), "",$(0),f$, mut : refresh
|
|
count+=min(gen,i)
|
|
If topscore<28 Then loop
|
|
}
|
|
Print
|
|
Print "Results"
|
|
Print "I found this:"; a$(last)
|
|
Print "Total strings which evalute fitness:"; count
|
|
Print "Done"
|
|
}
|
|
WeaselAlgorithm2
|