Created
June 29, 2012 15:34
-
-
Save akyoto/3018651 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import flua.Collection | |
| import flua.Utils | |
| #import playground.Everything | |
| TARGETSTRING = "This is the string that will be evolved. Let's make it longer and longer and longer still.. This is the string that will be evolved. Let's make it longer and longer and longer still.. This is the string that will be evolved. Let's make it longer and longer and longer still.. This is the string that will be evolved. Let's make it longer and longer and longer still.. " | |
| const | |
| POPSIZE = 1000 | |
| MUTATIONRATE = 1 | |
| population = Array<Vector<Byte>>(POPSIZE) | |
| bestScore : Int = 1 | |
| bestInd : Int | |
| #--------------------------------------------------------------------------------------------------- | |
| createPOP | |
| for i = 0 until POPSIZE | |
| #population[i] = Vector<Byte>() | |
| population[i] = Vector<Byte>(TARGETSTRING.lengthInBytes) | |
| #= 0 until TARGETSTRING.length | |
| for j in TARGETSTRING | |
| population[i].add(rand(32, 125)) | |
| #--------------------------------------------------------------------------------------------------- | |
| #--------------------------------------------------------------------------------------------------- | |
| findBest | |
| best : Int = 0 | |
| bscore : Int = 999999 | |
| score : Int = 0 | |
| for x in population counting pidx | |
| score = getScore(x) | |
| if score < bscore | |
| bscore = score | |
| best = pidx | |
| bestInd = best | |
| return best | |
| #--------------------------------------------------------------------------------------------------- | |
| #--------------------------------------------------------------------------------------------------- | |
| getScore a : Vector<Byte> | |
| score : Int = 0 | |
| for x in TARGETSTRING.bytes counting xpos | |
| score += abs(x - a[xpos]) | |
| bestScore = score | |
| return score | |
| #--------------------------------------------------------------------------------------------------- | |
| #--------------------------------------------------------------------------------------------------- | |
| mutatePOP best | |
| #Vector<Byte>() | |
| b = Vector<Byte>(TARGETSTRING.lengthInBytes) | |
| #b= Vector<Byte>() | |
| #clone population[best],b | |
| for x in population[best] | |
| b.add(x) | |
| #elitism | |
| clone b, population[0] | |
| for i = 1 until POPSIZE | |
| clone b, population[i] | |
| mutate population[i] | |
| #--------------------------------------------------------------------------------------------------- | |
| clone source : Vector<Byte>, dest : Vector<Byte> | |
| for x in source counting xpos | |
| dest[xpos] = x | |
| #print dest[xpos] | |
| #print x | |
| #print " " | |
| #--------------------------------------------------------------------------------------------------- | |
| #--------------------------------------------------------------------------------------------------- | |
| mutate indiv : Vector<Byte> | |
| for x in indiv counting xpos | |
| if rand(1, 100) <= MUTATIONRATE | |
| if rand(1, 3) == 1 | |
| indiv[xpos] = rand(32, 125) | |
| else | |
| # this can drift outside range but whatever.. | |
| indiv[xpos] = indiv[xpos] + rand(-2, 2) | |
| #--------------------------------------------------------------------------------------------------- | |
| #--------------------------------------------------------------------------------------------------- | |
| printIndiv indiv : Vector<Byte> | |
| # clone the vec, add null and convert to string | |
| nul : Byte = 0 | |
| #vst = Vector<Byte>(TARGETSTRING.lengthInBytes+1) #Vector<Byte>() | |
| vst = Vector<Byte>() | |
| #clone indiv, vst | |
| for x in indiv counting idx | |
| vst.add(x) | |
| #vst[idx] = x | |
| vst.add(0) | |
| print String(vst.data) | |
| #--------------------------------------------------------------------------------------------------- | |
| createPOP() | |
| generation : Int = 0 | |
| setRandSeed systemTime() | |
| gaMain | |
| while bestScore > 0 | |
| mutatePOP findBest() | |
| generation += 1 | |
| if generation > 5000 | |
| exit() | |
| #printIndiv population[bestInd] | |
| #print " Score is $bestScore" | |
| in Benchmark("test") | |
| gaMain() | |
| print "\n\n" | |
| printIndiv population[0] | |
| print "done in $generation generations. \nYay Darwin!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment