(Arne Babenhauserheide)
2013-09-17: added a minimal evolutionary algorithm which actually changes the added a minimal evolutionary algorithm which actually changes the source-code.
diff --git a/examples/evolve.w b/examples/evolve.w new file mode 100644 --- /dev/null +++ b/examples/evolve.w @@ -0,0 +1,102 @@ +#!/home/arne/wisp/wisp-multiline.sh +; !# + +; A small experiment on a complete evolutionary algorithm. + +; NOTE: This only works after preprocessing to scheme. + +define evalsyntax "0123456789+-*/ ()" + +define : mutate-replace evalstring + let + : eval-index : random : string-length evalstring + replace-index : random : string-length evalsyntax + string-replace evalstring evalsyntax eval-index : + eval-index 1 + . replace-index : + replace-index 1 + + +define : mutate-permutate evalstring + let + : replace : random : string-length evalstring + by : random : string-length evalstring + string-replace evalstring evalstring replace : + replace 1 + . by : + by 1 + + +define : mutate-insert evalstring + let + : eval-index : random : string-length evalstring + insert-index : random : string-length evalsyntax + string-append + substring evalstring 0 eval-index + string : string-ref evalsyntax insert-index + substring evalstring eval-index + + +define : mutate-remove evalstring + if : <= 1 : string-length evalstring + ; cannot remove from a 0 string + . evalstring + let + : eval-index : random : - (string-length evalstring) 1 + string-append + substring evalstring 0 eval-index + substring evalstring : + eval-index 1 + + +define : mutate-eval evalstring + eval-string : string-append "(" evalstring ")" + + +define : better mutated original + < + abs : - 42 : mutate-eval mutated + abs : - 42 : mutate-eval original + + +define : evolve-step evalstring mutate + ; first try a random replacement, then try a permutation. + let : : newstring : mutate evalstring + catch #t + lambda : + mutate-eval newstring + lambda : key . args + set! newstring evalstring + if : better newstring evalstring + . newstring + . evalstring + + +define : evolve-replace evalstring + evolve-step evalstring mutate-replace + +define : evolve-permutate evalstring + evolve-step evalstring mutate-permutate + +define : evolve-insert evalstring + evolve-step evalstring mutate-insert + +define : evolve-remove evalstring + evolve-step evalstring mutate-remove + + +define : evolution initialstring steps + let loop : (step 0) (string initialstring) + let : : action : random 4 + if : >= step steps + . string + cond + : = action 0 + loop (+ step 1) (evolve-replace string) + : = action 1 + loop (+ step 1) (evolve-permutate string) + : = action 2 + loop (+ step 1) (evolve-insert string) + : = action 3 + loop (+ step 1) (evolve-remove string) + +define : run + ; firstoff, seed the random number generator! + set! *random-state* : random-state-from-platform + display : evolution "+ 1 2" 1000 + newline