[racket] simple genetic algorithm

From: Rian Shams (rian.shams at gmail.com)
Date: Sun Nov 10 14:28:35 EST 2013

Hello All,

As part of the design for a simple genetic algorithm I have this function:

(define (roulette-wheel-ratio generation-fitness )
  (cond [(empty? generation-fitness) empty]
           [else (cons (/ (first generation-fitness)
                               (total-population-fitness
generation-fitness))
                    (roulette-wheel-ratio (rest generation-fitness)))]))

where generation-fitness is a list of values that correspond to the fitness
of each individual in a population. For example, in a generation with
population size 12, generation fitness may look like:

'(7.8807275269175125
  6.78896220864992
  6.52572681075793
  3.208263473483078
  9.970710802683316
  10.400703374724888
  7.434703353949041
  6.009574612909729
  2.9503066173989634
  6.07124467626777
  2.1893449585751754
  1.0741024515301607)

Here is how I have defined the auxiliary function, total-population-fitness:

(define (total-population-fitness generation-fitness)
  (foldl + 0 generation-fitness))

I was wondering how can I modify the above function, roulette-wheel-ratio
so that when it evaluates the helper function, total-population-fitness it
only does so for the initial list of generation-fitness. Otherwise the
total population fitness decreases for each recursive call which is what I
don't want, it should remain constant throughout the entire function call.

Basically, is it possible to modify this function so that the auxiliary
function call (total-population-fitness generation-fitness) remains
unaffected by the natural recursion imposed by roulette-wheel-ratio?

Any help would be appreciated as I am still learning the Racket basics.

Kind Regards,
-- 
Rian Shams
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20131110/39201266/attachment.html>

Posted on the users mailing list.