Next: Copying, Previous: Neutral Variants, Up: Usage [Contents][Index]
Using the test
function defined in a previous example
(see Evaluation), the code block below searches for a “repair”
of the buggy gcd implementation in ../test/gcd/gcd.s
. The
“repair” will be a version of gcd which passes all 11 tests run in
test
.
The target
and max-evals
keyword arguments are passed to
evolve
(see evolve). These arguments terminate the
evolutionary search when either a repair has been reached or a budget
of fitness evaluations has been exhausted respectively.
The following properties of this example should be noted.
evolve
the population is populated with copies
of the original program.
*orig*
individual is assigned a fitness before the
*population*
is populated. This is necessary as the search
functions assume that every element of *population*
already
have a fitness assigned.
*population*
is not explicitly passed to the evolve
function which implicitly modifies the *population*
variable.
When this function terminates the evolved program variants will be
saved in the *population*
.
(in-package :software-evolution-example) (defvar *orig* (from-file (make-instance 'asm) "../test/gcd/gcd.s")) (setf (fitness *orig*) (test *orig*)) ; (2) (setf *population* (loop :for i :below 100 :collect (copy *orig*))) ; (1) (evolve #'test :max-evals 100 :target 11) ; (3)
Evolution may be parallelized by calling evolve
in multiple
threads. For example a parallel version of the above example would
replace,
(evolve #'test :max-evals 100 :target 11)
with the following.
(require 'bordeaux-threads) (defvar *num-threads* 64 "Number of available cores.") ;; launch *num-threads* evolution threads (let (threads) (loop :for n :below *num-threads* :do (push (bordeaux-threads:make-thread (lambda () (evolve #'test :max-evals 100 :target 11)) :name (format nil "opt-~d" n)) threads))) ;; wait for all threads to return (mapc #'bordeaux-threads:join-thread threads)
Next: Copying, Previous: Neutral Variants, Up: Usage [Contents][Index]