| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #lang typed/racket
- ;; A simple genetic algorithm
- ;; Computer Exercise #1 from Intro to GA by Mitchell
- ;;
- ;; Uses:
- ;; - fitness-proportionate selection
- ;; - routlette-wheel sampling
- ; The population is stored as a single list of popsize*chromlen elements
- (require math)
- ; population size and individual chromosome length
- (define popsize 100)
- (define chromlen 100)
- ; single-point crossover rate
- (define p-cross 0.7)
- ; bitwise mutation rate
- (define p-mutate 0.001)
- ; Fitness assessment is the number of 1's in the population member
- (: fitness (-> (Listof Integer) Real))
- (define (fitness member)
- (/ (sum member)
- (length member)))
- ; Flip a chromosome to its opposite
- (: flip-chrom (-> Integer Integer))
- (define (flip-chrom val)
- (if (eq? val 1) 0 1))
- ; mutate
- ; because of the way the population is stored and that mutations happen after
- ; offspring are produced, we can mutate the whole list together
- (: mutate (-> (Listof Integer) (Listof Integer)))
- (define (mutate pop)
- (for/list: : Listof Integer ([i : Index pop])
- ((λ (chrom)
- (if (<= (random) p-mutate)
- (flip-chrom i)
- i))
- i)))
- ; Initialize a random population.
- ;(: initpop (-> (Listof Integer)))
- ;(define initpop
- ; (for/list ([i (in-range (* popsize chromlen))])
- ; (random-integer 0 1)))
|