;; AI Final Project ;; Module: ALM Specifics-Fitness Functions ;; CSC 466 - Graci ;; Jacob Peck - 20110414 ; assigns a value between [0...1] depending upon the balance of the letters in the output (defmethod fitness-balancing-output ((ind individual) &aux lsys values original-data output counts fitness) (setf counts '()) (setf values '()) (setf lsys (individual-data ind)) (setf original-data (lsys-data lsys)) ; iterate lsys 6 times, grab output (dotimes (i 6 NIL) (iterate-lsys lsys) ) (setf output (lsys-data lsys)) (setf (lsys-data lsys) original-data) (setf (lsys-generation lsys) 0) ; take counts (dolist (element *alphabet* NIL) (setf counts (append counts (list (count element output)))) ) (if *DEMO* (format t "~A~%" counts)) ; create ratios (dotimes (i (length *alphabet*) NIL) (dotimes (j (length *alphabet*) NIL) (if (not (= i j)) (cond ((= (nth i counts) 0) (setf values (append values (list (float 0)))) ) ((= (nth j counts) 0) (setf values (append values (list (float 0)))) ) (t (setf values (append values (list (float (/ (nth i counts) (nth j counts)))))) ) ) ) ) ) (if *DEMO* (format t "~A~%" values)) ; calculate fitness (if (= (apply #'+ values) 0) (setf fitness 0) (setf fitness (float (/ 1 (/ (apply #'+ values) (length values))))) ) (if (> fitness 1) (setf fitness 0)) (if *DEMO* (format t "Fitness: ~A~%" fitness)) (setf (individual-fitness ind) fitness) NIL ) ; assigns a value between [0...1] depending upon the balance of the letters in the system (FAR TOO SENSITIVE) (defmethod fitness-balancing ((ind individual) &aux lsys values raw-data counts fitness) (setf raw-data '()) (setf counts '()) (setf values '()) (setf lsys (individual-data ind)) ; grab all symbols in a flat list (dolist (element (lsys-rules lsys) NIL) (setf raw-data (append raw-data (cdr element))) ) (if *DEMO* (format t "~A~%" raw-data)) ; take counts (dolist (element *alphabet* NIL) (setf counts (append counts (list (count element raw-data)))) ) (if *DEMO* (format t "~A~%" counts)) ; create ratios (dotimes (i (length *alphabet*) NIL) (dotimes (j (length *alphabet*) NIL) (if (not (= i j)) (cond ((= (nth i counts) 0) (setf values (append values (list (float 0)))) ) ((= (nth j counts) 0) (setf values (append values (list (float 0)))) ) (t (setf values (append values (list (float (/ (nth i counts) (nth j counts)))))) ) ) ) ) ) (if *DEMO* (format t "~A~%" values)) ; calculate fitness (if (= (apply #'+ values) 0) (setf fitness 0) (setf fitness (float (/ 1 (/ (apply #'+ values) (length values))))) ) (if (> fitness 1) (setf fitness 0)) (if *DEMO* (format t "Fitness: ~A~%" fitness)) (setf (individual-fitness ind) fitness) NIL )