Advertisement
Guest User

Untitled

a guest
May 17th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 3.66 KB | None | 0 0
  1. #lang racket
  2.  
  3. (require plot)
  4.  
  5. (define function-probability 0.8)
  6. (define arg-probability 0.7)
  7. (define min-val -2)
  8. (define max-val  2)
  9. (define mutate-arg 0.1)
  10. (define mutate-num 0.6)
  11. (define mutate-fun 0.1)
  12. (define (mutate-min x) -1)
  13. (define (mutate-max x)  1)
  14.  
  15. (define fitness-min -7)
  16. (define fitness-max  7)
  17. (define fitness-points 100)
  18.  
  19. (define population-size 50)
  20. (define individuals-survive 20)
  21. (define exception-weight 1000)
  22.  
  23. (define gens
  24.   #((+ expr expr)
  25.     (- expr expr)
  26.     (* expr expr)
  27.     (/ expr expr)
  28.     ;(expt expr expr)
  29.     (sin expr)
  30.     (cos expr)
  31.     (tan expr)))
  32.  
  33. (define args
  34.   #(x))
  35.  
  36. (define args-list
  37.   (vector->list args))
  38.  
  39. (define gens-number (vector-length gens))
  40. (define args-number (vector-length args))
  41.  
  42. (define (target-fun x)
  43.   (+ (* x 1.46327) (/ 0.3423 x)))
  44.  
  45. (define (fitness-compare f1 f2)
  46.   (for/sum ([x (in-range fitness-min
  47.                          fitness-max
  48.                          (exact->inexact (/ (- fitness-max fitness-min) fitness-points)))])
  49.     (abs (- (f1 x) (f2 x)))))
  50.  
  51. (define (generate-values fun)
  52.   (for/list ([x (in-range fitness-min
  53.                           fitness-max
  54.                           (exact->inexact (/ (- fitness-max fitness-min) fitness-points)))])
  55.     (fun x)))
  56.  
  57. (define (random-real-interval from to)
  58.   (+ from (* (random) (- to from))))
  59.  
  60. (define (gen-fun depth)
  61.   (define prob (random))
  62.   {if [or (< depth 1) (> prob function-probability)]
  63.       [if (< (random) arg-probability)
  64.           (vector-ref args (random args-number))
  65.           (random-real-interval min-val max-val)]
  66.       [let ([expr (vector-ref gens (random gens-number))])
  67.         (if (list? expr)
  68.             (map (lambda (x)
  69.                    (if (eq? x 'expr) (gen-fun (sub1 depth))
  70.                        x))
  71.                  expr)
  72.             expr)]})
  73.  
  74. (define (mutate fun depth)
  75.   (define mut (random))
  76.   {cond
  77.     [(and (symbol? fun) (< mut mutate-arg))
  78.      (gen-fun depth)]
  79.     [(and (number? fun) (< mut mutate-num))
  80.      (+ fun (random-real-interval (mutate-min fun) (mutate-max fun)))]
  81.     [(and (list? fun) (< mut mutate-fun))
  82.      (gen-fun (sub1 depth))]
  83.     [(list? fun)
  84.      (cons (car fun) (map (λ (x) (mutate x (sub1 depth))) (cdr fun)))]
  85.     [else
  86.      fun]})
  87.  
  88. (define (test1 d x)
  89.   (define var (gen-fun d))
  90.   (printf "(~A)(~A) = ~A~%" var x (eval `((λ (x) ,var) ,x))))
  91.  
  92. (define (compare-data data1 data2)
  93.   (for/sum [(d1 data1) (d2 data2)]
  94.     (abs (- (real-part d1) (real-part d2)))))
  95.  
  96. (define (test2 d iterations fun)
  97.   (define population (for/vector ((x (in-range population-size))) (gen-fun d)))
  98.   (define values (generate-values fun))
  99.   {for ((n (in-range iterations)))
  100.     [vector-sort! population
  101.                   {λ (f1 f2)
  102.                     (with-handlers [(exn:fail:contract:divide-by-zero? (λ (e) exception-weight))]                      
  103.                       (define d1 (generate-values (eval `(λ (x) ,f1))))
  104.                       (define d2 (generate-values (eval `(λ (x) ,f2))))
  105.                       (< (compare-data d1 values) (compare-data d2 values)))}
  106.                   #:cache-keys? #t]
  107.     [for ((i (in-range individuals-survive)))
  108.       (vector-set! population i (mutate (vector-ref population i) d))]
  109.     [for ((i (in-range individuals-survive population-size)))
  110.       (vector-set! population i (gen-fun d))]
  111.     (when (= 0 (remainder n 100)) (printf "Iteration ~A...~%" n))}
  112.   population)
  113.  
  114. (define (enforce-compile arg)
  115.   (if (procedure? arg)
  116.       arg
  117.       (eval `(λ ,args-list ,arg))))
  118.  
  119. (define (plot2 f1 f2)
  120.   (plot (list (function (enforce-compile f1) min-val max-val)
  121.               (function (enforce-compile f2) min-val max-val))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement