wisp
 
(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