;; AI Final Project ;; Module: Genetics - algorithm ;; CSC 466 - Graci ;; Jacob Peck - 20110425 ; generate random individuals (defmethod generate-random-individual ((alphabet list) &aux rules seed ind) (setf rules '()) (setf seed (list (pick alphabet))) ;random seed (dolist (element alphabet NIL) (setf temprule (list element)) (dotimes (i (+ 1 (random 3)) NIL) (setf temprule (append temprule (list (pick alphabet)))) ) (setf rules (append rules (list temprule))) ;random rules ) (setf ind (make-individual (make-lsys rules seed) 0)) (if *DEMO* (progn (visualize-individual ind) (visualize-lsys (individual-data ind)) (format t "~A~%" (lsys-rules (individual-data ind))) ) ) ind ) (defmethod generate-random-population ((alphabet list) (num integer) (fitness function) &aux inds newind pop) (setf inds '()) (dotimes (i num NIL) (setf newind (generate-random-individual alphabet)) (setf (individual-name newind) i) (setf inds (append inds (list newind))) ) (setf pop (make-population inds 0 #'perform-mutations #'perform-crossovers 50 1 49)) (apply-fitness-to-population pop fitness) pop ) ; run algorithm (defmethod run-genetic-algorithm ((pop population) (fitness function) &aux nextpop) ; run the genetic algorithm (setf nextpop (next-generation pop)) ; apply fitness function to each individual (apply-fitness-to-population nextpop fitness) ; return the new population nextpop ) (defmethod apply-fitness-to-population ((pop population) (fitness function) &aux inds) (setf inds (population-individuals pop)) (dolist (element inds NIL) (funcall fitness element) (if *DEMO* (format t "~A~%" (individual-fitness element))) ) (setf (population-individuals pop) inds) NIL ) ; print average fitness (defmethod population-average-fitness ((pop population)) (format t "Average fitness (generation ~A): ~A~%" (population-generation pop) (calculate-fitness pop)) NIL ) (defmethod calculate-fitness ((pop population) &aux values inds) (setf inds (population-individuals pop)) (setf values '()) (dolist (element inds NIL) (setf values (append values (list (individual-fitness element)))) ) (if *DEMO* (format t "Values: ~A~%" values)) (float (/ (apply #'+ values) (length inds))) ) ; demo code: create random pop of 100, print avg fitness, run 20 generations, print avg fitnesses ; returns the final population for manipulation (defmethod demo-20-generations ((alphabet list) (fitness function) &aux pop) (setf pop (generate-random-population alphabet 100 fitness)) (population-average-fitness pop) (dotimes (i 20 NIL) (setf pop (run-genetic-algorithm pop fitness)) (population-average-fitness pop) ) pop )