home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / AIE9009.ZIP / METAMORF.LSP < prev    next >
Encoding:
Text File  |  1990-08-14  |  21.1 KB  |  762 lines

  1. ;;;
  2. ;;; METAMORPH CODE BY SCOTT AUSTIN
  3. ;;; AS PUBLISHED IN THE AUGUST 1990 ISSUE OF AI EXPERT
  4. ;;; COPYRIGHT (c) 1990 BY SCOTT AUSTIN AND AI EXPERT
  5. ;;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7. ;;; LOADMETA IS THE FUNCTION TO LOAD THE
  8. ;;; FILES CONTAINING THE VARIOUS METAMORPH FUNCTIONS.
  9. ;;;
  10.  
  11. (DEFUN LOADMETA ()
  12.    (LOAD "ALPHABETS")
  13.    (LOAD "RANDOM-FUNCTIONS")
  14.    (LOAD "POPULATION-FUNCTIONS")
  15.    (LOAD "SELECTION-FUNCTIONS")
  16.    (LOAD "FITNESS-FUNCTIONS")
  17.    (LOAD "BINARY-FUNCTIONS")
  18.    (LOAD "REPRO-FUNCTIONS")
  19.    (LOAD "MATING-LISTS-FUNCTIONS")
  20.    (LOAD "ADJUSTCNT-FUNCTIONS")
  21.    (LOAD "STRATEGY-FUNCTIONS")
  22.    (LOAD "EVOLVER-FUNCTIONS")
  23.    (LOAD "VARIATION-FUNCTIONS")
  24.    (LOAD "CRSOVR-FUNCTIONS-1")
  25.    (LOAD "CRSOVR-FUNCTIONS-2")
  26.    (LOAD "MUTATE-FUNCTIONS")
  27.    (LOAD "SUPPORT")
  28.    (LOAD "DISPLAY"))
  29.  
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. ;;;
  32. ;;; METAMORPH IS THE MAIN FUNCTION. INIT-FUNCTIONS  FILE CONTAINS
  33. ;;; THE PARAMETER INITILIZATION LISTS, PLOT-SETUP IS THE
  34. ;;; GRAPHING INITILIZATION FUNCTION, INITIAL-GENERATION  IS
  35. ;;; THE FUNCTION WHICH CONTROLS THE CREATION OF THE
  36. ;;; RANDOMLY GENERATED INITIAL POPULATION. SELECTION AND
  37. ;;;VARIATION ARE FUNCTIONS WHICH CONTAIN THE GENETIC
  38. ;;; OPERATORS OF EVALUATION, CROSSOVER AND MUTATION. PLOT
  39. ;;; EVOLUTION AND NEW-GEN-LIST  ARE THE FUNCTIONS WHICH PLOT
  40. ;;; THE POPULATION EVOLUTIONAL HISTORY, AND CREATES THE
  41. ;;; POPULATION LIST FOR THE NEXT GENERATION
  42. ;;;
  43.  
  44. (DEFUN METAMORPH ()
  45.    (LOAD "INIT-FUNCTIONS")
  46.    (PLOT-SETUP)
  47.    (INITIAL-GENERATION POPULATION-PARAMS)
  48.    (CATCH 'EXIT
  49.       (DOTIMES (GENCOUNT NUMGENS)
  50.          (SELECTION GENCOUNT POPULATION-LIST EVALPOP-PARAMS ATTRIBUTESLIST)
  51.          (VARIATION GENCOUNT FITNESSLIST STRATEGY-PARAMS
  52.           CROSSOVER-PARAMS MUTATE-PARAMS POP-SIZE CHROMOSOME-LENGTH ATTRIBUTESLIST)
  53.          (PLOT-EVOLUTION GENCOUNT)
  54.          (NEW-GEN-LIST GENCOUNT POP-SIZE SURVIVORSLIST MUTATED-EVOLVERS ATTRIBUTESLIST))))
  55.  
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57. ;;;
  58. ;;; INITIALIZATION LISTS AND PARAMETERS
  59. ;;;
  60.  
  61. (SETF ATTRIBUTESLIST NIL)
  62.  
  63. ;;;
  64.  
  65. (SETF FITNESSLIST NIL)
  66.  
  67. ;;;
  68.  
  69. (SETF GENHISTORYLIST NIL)
  70.  
  71. ;;;
  72.  
  73. (SETF TOTAL-CROSSOVERS 0)
  74.  
  75. ;;;
  76.  
  77. (SETF CROSSOVER-PARAMS (LIST 'RANDOM 0.7))
  78.  
  79. ;;;
  80.  
  81. (SETF TOTAL-MUTATIONS 0)
  82.  
  83. ;;;
  84.  
  85. (SETF MUTATE-PARAMS (LIST 0.01 SIMPLE-BINARY))
  86.  
  87. ;;;
  88.  
  89. (SETF NUMGENS 10)
  90.  
  91. ;
  92.  
  93. (SETF POPULATION-PARAMS (LIST 20 14 SIMPLE-BINARY))
  94. ;
  95. ; LIST SYNTAX IS <POP-SIZE> <STRING-LENGTH> <ALPHABET>
  96. ;
  97.  
  98. ;;;
  99.  
  100. (SETF EBC-LIST (LIST 'XNTH XNTHLIST))
  101.  
  102. ;;;
  103.  
  104. (SETF EVALPOP-PARAMS (LIST 'EVAL-BINARY-CHROMOSOMES EBC-LIST))
  105.  
  106. ;;;
  107. ;;; STRATEGY-PARAMS LIST CONTAINS THE SELECTION PARAMETERS
  108. ;;;
  109.  
  110. (SETF STRATEGY-PARAMS (LIST 'ELITIST 0.9))
  111. ;
  112. ; LIST SYNTAX IS <SELECTION STRATEGY> <GENERATION GAP>
  113. ;
  114.  
  115.  
  116. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  117. ;;;
  118. ;;; FUNCTIONS TO GENERATE INITIAL POPULATION
  119. ;;;
  120.  
  121. (DEFUN INITIAL-GENERATION (POP-PARAMS)
  122.    (APPLY 'FUNCALL 'MAKE-RANDOM-POPULATION POP-PARAMS))
  123.  
  124. ;;;
  125. ;;; MAKE-RANDOM-POPULATION GENERATES A
  126. ;;; RANDOM POPULATION OF STRINGS  WHERE THE
  127. ;;; USER SPECIFIES THE POPULATION-SIZE, STRING-LENGTH AND ALPHABET
  128. ;;;
  129.  
  130. (DEFUN MAKE-RANDOM-POPULATION (POPULATION-SIZE STRING-LENGTH ALPHABET
  131.  &OPTIONAL ALPHA-PARAMETERS)
  132.    (SETF POP-SIZE POPULATION-SIZE)
  133.    (SETF POPULATION-LIST NIL)
  134.    (DOTIMES (COUNT POP-SIZE)
  135.       (PUSH (CONS COUNT (MAKE-RANDOM-STRING STRING-LENGTH ALPHABET ALPHA-PARAMETERS))
  136.                       POPULATION-LIST))
  137.          (SETF POPULATION-LIST (REVERSE POPULATION-LIST)))
  138.  
  139. ;;;
  140. ;;; MAKE-RANDOM-STRING GENERATES A RANDOM
  141. ;;; STRING OF TOKENS WHERE THE LENGTH AND
  142. ;;; ALPHABET ARE USER SPECIFIED
  143. ;;;
  144.  
  145. (DEFUN MAKE-RANDOM-STRING (STRING-LENGTH ALPHABET &OPTIONAL ALPHA-PARAMETERS)
  146.    (SETF RANDOM-STRING NIL)
  147.    (SETF CHROMOSOME-LENGTH STRING-LENGTH)
  148.    (DOTIMES (COUNT STRING-LENGTH)
  149.       (PUSH (MAKE-RANDOM-TOKEN ALPHABET  ALPHA-PARAMETERS) RANDOM-STRING))
  150.            RANDOM-STRING)
  151.  
  152. ;;;
  153. ;;; MAKE-RANDOM-TOKEN GENERATES A RANDOM
  154. ;;; TOKEN FROM A USER SUPPLIED ALPHABET
  155. ;;;
  156.  
  157. (DEFUN MAKE-RANDOM-TOKEN (ALPHABET &OPTIONAL ALPHA-PARAMETERS)
  158.    (IF (LISTP ALPHABET)
  159.           (SECOND (ASSOC (RANDOM (LENGTH ALPHABET))ALPHABET))
  160.       (APPLY 'FUNCALL ALPHABET ALPHA- PARAMETERS)))
  161.  
  162. ;;;
  163. ;;; SOME ALPHABETS
  164. ;;;
  165. ;;; ENGLISH ALPHABET
  166. ;;;
  167.  
  168. (SETQ ALPHA
  169.    '((0 A) (1 B) (2 C) (3 D) (4 E) (5 F) (6 G) (7 H) (8 I) (9 J) (10 K)
  170.      (11 L) (12 M) (13 N) (14 O) (15 P) (16 Q) (17 R) (18 S) (19 T) (20 U)
  171.      (21 V) (22 W) (23 X) (24 Y) (25 Z) (26 _)))
  172.  
  173. ;;;
  174. ;;; ELF IS A FUNCTION TO GENERATE ENGLISH LETTERS IN THE SAME
  175. ;;; PROPORTION AS THEY APPEAR IN THE LANGUAGE. THE LETTER "E"
  176. ;;; IS MOST COMMON AND APPEARS 12.62% OF THE TIME OVER LONG
  177. ;;; SAMPLES OF TEXT. "Z" IS THE LEAST COMMON AND APPEARS ONLY
  178. ;;; .09% OF THE TIME.
  179. ;;;
  180.  
  181. (DEFUN ELF ()
  182.    (SETQ NUM (RANDOM 0.1262))
  183.    (COND
  184.       ((<= NUM 9.0E-4) 'Z)
  185.       ((<= NUM 0.0010) 'Q)
  186.       ((<= NUM 0.0015) 'J)
  187.       ((<= NUM 0.0019) 'X)
  188.       ((<= NUM 0.0065) 'K)
  189.       ((<= NUM 0.0099) 'V)
  190.       ((<= NUM 0.0154) 'B)
  191.       ((<= NUM 0.0172) 'Y)
  192.       ((<= NUM 0.0189) 'W)
  193.       ((<= NUM 0.0195) 'G)
  194.       ((<= NUM 0.0203) 'P)
  195.       ((<= NUM 0.0234) 'F)
  196.       ((<= NUM 0.0254) 'M)
  197.       ((<= NUM 0.0272) 'U)
  198.       ((<= NUM 0.0311) 'C)
  199.       ((<= NUM 0.0395) 'D)
  200.       ((<= NUM 0.0411) 'L)
  201.       ((<= NUM 0.0551) 'H)
  202.       ((<= NUM 0.0615) 'R)
  203.       ((<= NUM 0.0650) 'S)
  204.       ((<= NUM 0.0711) 'N)
  205.       ((<= NUM 0.0734) 'I)
  206.       ((<= NUM 0.0761) 'A)
  207.       ((<= NUM 0.0765) 'O)
  208.       ((<= NUM 0.0933) 'T)
  209.       ((<= NUM 0.1262) 'E)))
  210.  
  211. ;;;
  212. ;;; EWF IS A FUNCTION FOR GENERATING THE 26 MOST COMMONLY
  213. ;;; USED ENGLISH WORDS ACCORDING TO THE FREQUENCY THEY
  214. ;;; APPEAR IN LARGE SAMPLES OF ENGLISH TEXT.
  215. ;;;
  216.  
  217. (DEFUN EWF ()
  218.    (SETQ NUM (RANDOM 0.07))
  219.    (COND
  220.       ((<= NUM 0.0044) 'FROM)
  221.       ((<= NUM 0.0045) 'BUT)
  222.       ((<= NUM 0.0046) 'ARE)
  223.       ((<= NUM 0.0047) 'NOT)
  224.       ((<= NUM 0.0050) 'HAD)
  225.       ((<= NUM 0.0051) 'THIS)
  226.       ((<= NUM 0.0052) 'I)
  227.       ((<= NUM 0.0053) 'BY)
  228.       ((<= NUM 0.0054) 'AT)
  229.       ((<= NUM 0.0064) 'BE)
  230.       ((<= NUM 0.0067) 'ON)
  231.       ((<= NUM 0.0070) 'HIS)
  232.       ((<= NUM 0.0073) 'AS)
  233.       ((<= NUM 0.0074) 'WITH)
  234.       ((<= NUM 0.0088) 'IT)
  235.       ((<= NUM 0.0095) 'FOR)
  236.       ((<= NUM 0.0096) 'HE)
  237.       ((<= NUM 0.0098) 'WAS)
  238.       ((<= NUM 0.0101) 'IS)
  239.       ((<= NUM 0.0106) 'THAT)
  240.       ((<= NUM 0.0213) 'IN)
  241.       ((<= NUM 0.0232) 'A)
  242.       ((<= NUM 0.0261) 'TO)
  243.       ((<= NUM 0.0289) 'AND)
  244.       ((<= NUM 0.0364) 'OF)
  245.       ((<= NUM 0.0700) 'THE)))
  246.  
  247. ;;;
  248. ;;; BINARY ALPHABET
  249. ;;;
  250.  
  251. (SETF SIMPLE-BINARY '((0 0) (1 1)))
  252.  
  253. ;;;
  254. ;;; AUGMENTED BINARY ALPAHBET
  255. ;;;
  256.  
  257. (SETF BINARYPLUS '((0 0) (1 1) (2 *)))
  258.  
  259. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  260. ;;;
  261. ;;; SELECTION FUNCTIONS
  262. ;;;
  263.  
  264. (DEFUN FIND-FITNESS (POPLIS EVAL-PARAMS)
  265.    (SETF EVAL-FUNCTION (FIRST EVAL-PARAMS))
  266.    (SETF EVAL-FUNC-PARMS (CONS POPLIS (SECOND EVAL-PARAMS)))
  267.    (APPLY 'FUNCALL EVAL-FUNCTION EVAL-FUNC-PARMS))
  268.  
  269. ;;;
  270.  
  271. (DEFUN NUM-EVOLVERS (POPSIZE GAPFACT)
  272.    (IF (EQUAL GAPFACT 1) (SETQ NUMTOEVOLVE POPSIZE)
  273.       (SETQ NUMTOEVOLVE (FLOOR (* POPSIZE GAPFACT)))))
  274.  
  275. ;;;
  276.  
  277. (DEFUN GET-SURVIVORS (NUMEVOL POPSIZE FITLIS)
  278.    (SETF SURVIVORSLIST NIL)
  279.    (SETF NUM-SURVIVORS (- POPSIZE NUMEVOL))
  280.    (GET-MOST-FIT POPULATION-LIST MOSTFIT)
  281.    (PUSH MOSTFITLIS SURVIVORSLIST)
  282.    (MAKE-SURVIVORS-POOL FITLIS)
  283.    (GET-SURVIVOR-STRINGS NUM-SURVIVORS SURV-POOL)
  284.    (SETF SURVIVORSLIST (REVERSE SURVIVORSLIST)))
  285.  
  286. ;;;
  287.  
  288. (DEFUN GET-MOST-FIT (POPLIS MOSFIT)
  289.    (SETF MOSTFITSYMBOL (FIRST MOSFIT))
  290.    (SETF MOSTFITTAG (LIST MOSTFITSYMBOL (THIRD MOSFIT)))
  291.    (SETF MOSTFITSTRING (CDR (ASSOC MOSTFITSYMBOL POPULATION-LIST)))
  292.    (SETF MOSTFITLIS (LIST MOSTFITSTRING MOSTFITTAG)))
  293.  
  294. ;;;
  295.  
  296. (DEFUN MAKE-SURVIVORS-POOL (FITLIS)
  297.    (SETF SANS-BEST (CDR FITLIS))
  298.    (SETF SANS-WORST (CDR (REVERSE SANS-BEST)))
  299.    (SETF SURV-POOL (REVERSE SANS-WORST)))
  300.  
  301. ;;;
  302.  
  303. (DEFUN GET-SURVIVOR-STRINGS (NUMSURV SURVPOOL)
  304.    (SETF TEMPSURV SURVPOOL)
  305.    (DOTIMES (COUNT1 (- NUM-SURVIVORS 1))
  306.       (SETF SURVELEMENT (NTH COUNT1 SURV-POOL))
  307.       (SETF SURVSYMBOL (FIRST SURVELEMENT))
  308.       (SETF SURVIVORTAG (LIST SURVSYMBOL 'SURVIVOR))
  309.       (SETF SURVSTRING (CDR (ASSOC SURVSYMBOL POPULATION-LIST)))
  310.       (SETF SURVLIS (LIST SURVSTRING SURVIVORTAG))
  311.       (PUSH SURVLIS SURVIVORSLIST)))
  312.  
  313. ;;;
  314.  
  315. (DEFUN GET-EVOLVERS (REPROLIST POPSIZE)
  316.    (SETF TEMPREPRO REPROLIST)
  317.    (SETF EVOLVERS NIL)
  318.    (DOTIMES (COUNT1 POPSIZE)
  319.       (SETF REPELM (POP TEMPREPRO))
  320.       (IF (NOT (EQUAL (SECOND REPELM) 0))
  321.              (PUSH REPELM EVOLVERS))))
  322.  
  323. ;;;
  324.  
  325. (DEFUN GET-CHROMOSOME-SYMBOLS (POPLIST)
  326.    (SETF SYMBOLSLIST (MAPCAR 'FIRST POPLIST)))
  327.  
  328. ;;;
  329.  
  330. (DEFUN GET-CHROMOSOMES (POPLIST)
  331.    (SETF CHROMOLIST (MAPCAR 'CDR POPLIST)))
  332.  
  333. ;;;
  334.  
  335. (DEFUN GET-CHROMOSOME-LENGTH (CHROLIS)
  336.    (SETF CHROMOLENGTH (LENGTH (FIRST CHROLIS))))
  337.  
  338. ;;;
  339.  
  340. (DEFUN APPLY-EVALUATION-FUNCTION (NOMLIST FUNC FUNCTIONLIST)
  341.    (SETF TEMPNORMLIST NOMLIST)
  342.    (SETF FITNESSLIST NIL)
  343.    (SETF TEMPFUNCLIST FUNCTIONLIST)
  344.    (DOTIMES (COUNT1 (LENGTH NOMLIST))
  345.       (RPLACA TEMPFUNCLIST (POP TEMPNORMLIST))
  346.       (PUSH (LIST (APPLY 'FUNCALL FUNC TEMPFUNCLIST) COUNT1) FITNESSLIST))
  347.    (SETF FITNESSLIST
  348.       (SORT FITNESSLIST #'> :KEY
  349.          '(LAMBDA (X)
  350.             (CAR X))))
  351.    (SETF FITNESSLIST (MAPCAR 'REVERSE FITNESSLIST))
  352.    (MOSTFITSYMBOL FITNESSLIST)
  353.    (LEASTFITSYMBOL FITNESSLIST))
  354.  
  355. ;;;
  356.  
  357. (DEFUN MOSTFITSYMBOL (FITLIS)
  358.    (SETF MOSTFIT (CONS-LAST (FIRST FITLIS) 'MOSTFIT)))
  359.  
  360. ;;;
  361.  
  362. (DEFUN LEASTFITSYMBOL (FITLIS)
  363.    (SETF LEASTFIT (CONS-LAST (CAR (LAST FITLIS)) 'LEASTFIT)))
  364.  
  365. ;;;
  366.  
  367. (DEFUN TERM-CRITERIA (FITLIS)
  368.    (IF (EQUAL (SECOND (FIRST FITLIS)) 1.0)
  369.          (THROW 'EXIT 'GOAL)))
  370.  
  371. ;;;
  372. ;;; EVALUATION FUNCTIONS
  373. ;;;
  374.  
  375. (DEFUN EVAL-BINARY-CHROMOSOMES (POPLIS FUNC FUNCTIONLIST)
  376.    (PARSE-POP-LIST POPLIS)
  377.    (NORM-TO-MAX CHROMOLIST)
  378.    (APPLY-EVALUATION-FUNCTION NORMLIST FUNC FUNCTIONLIST))
  379.  
  380. ;;;
  381.  
  382. (DEFUN PARSE-POP-LIST (POPLIST)
  383.    (GET-CHROMOSOME-SYMBOLS POPLIST)
  384.    (GET-CHROMOSOMES POPLIST)
  385.    (GET-CHROMOSOME-LENGTH CHROMOLIST))
  386.  
  387. ;;;
  388. ;;;
  389. ;;;
  390.  
  391. (DEFUN NORM-TO-MAX (CHROMOS)
  392.    (MAXINTEGER CHROMOLENGTH)
  393.    (SETF INTEGERVALS (MAPCAR 'MAKE-INTEGER CHROMOS))
  394.    (SETF NORMLIST
  395.       (MAPCAR
  396.        '(LAMBDA (INTVAL
  397.                               (FLOAT (/ INTVAL MAXINTVAL)) INTEGERVALS)))
  398.  
  399. ;;;
  400.  
  401. (DEFUN MAXINTEGER (CHROMOSOMELENGTH)
  402.    (SETF MAXINTVAL (- (EXPT 2 CHROMOSOMELENGTH) 1)))
  403.  
  404.  
  405. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  406. ;;;
  407. ;;; VARIATION FUNCTIONS
  408. ;;;
  409.  
  410. (DEFUN VARIATION (GENCNT FITLIS STRAT-PARAMS CRSOVR-PARAMS MUTA-PARAMS POPSIZE
  411.                                            CHROMOLEN ATTRIBSLIS)
  412.    (PARSE-FITLIS FITNESSLIST)
  413.    (REPRODUCE FITNESS STRATEGY-PARAMS POPSIZE)
  414.    (APPLYCROSSOVER CRSOVR-PARAMS POPULATION-LIST MATES-LIST CHROMOLEN)
  415.    (SETF EVOLVERSLIST (APPEND NOCROSSLIST EVOLVERSLIST))
  416.    (APPLYMUTATION MUTA-PARAMS EVOLVERSLIST))
  417.  
  418. ;;;
  419.  
  420. (DEFUN PARSE-FITLIS (FITLIS)
  421.    (SETF FITNESS-ORDER (MAPCAR 'FIRST FITLIS))
  422.    (SETF FITNESS (MAPCAR 'SECOND FITLIS)))
  423.  
  424. ;;;
  425. ;;; REPRODUCTION FUNCTIONS
  426. ;;;
  427.  
  428. (DEFUN REPRODUCE (FITNES STRATEGY-PARAMS POPSIZE)
  429.    (MAKE-REPRO-POOL FITNES POPSIZE STRATEGY-PARAMS)
  430.    (GET-EVOLVERS REPRO-LIST POPSIZE)
  431.    (MAKE-MATES-LIST EVOLVERS POPSIZE))
  432.  
  433.  
  434. ;;;
  435. ;;; REPRO-LIST HAS STRUCTURE ((<STRING#> <REPRO-CNT>)...)
  436. ;;;
  437.  
  438. (DEFUN MAKE-REPRO-POOL (FITNES POPSIZE STRATEGY-PARAMS)
  439.    (SETF REPRO-LIST NIL)
  440.    (LIST-AVERAGE FITNES)
  441.    (PROBSELECT FITNES)
  442.    (EXPECTED-COUNT FITNES AVGFITNESS)
  443.    (SELECTION-STRATEGY FITNESSLIST EXPECTED-COUNT-LIST POPSIZE STRATEGY-PARAMS)
  444.    (ADJUST-COUNT ACTUAL-COUNT-LIST NUMTOEVOLVE)
  445.    (SETF TEMPCNT ACTUAL-COUNT-LIST)
  446.    (DOTIMES (COUNT1 POPSIZE)
  447.       (PUSH (LIST COUNT1 (POP TEMPCNT)) REPRO-LIST))
  448.    (SETF REPRO-LIST (REVERSE REPRO-LIST)))
  449.  
  450. ;;;
  451.  
  452. (DEFUN LIST-AVERAGE (FITNES)
  453.    (SETF AVGFITNESS (/ (SUM-LIST FITNES) (LENGTH FITNES))))
  454.  
  455. ;;;
  456. ;;; PROBSELECT COMPUTES THE STRING BY STRING SELECTION PROBABILITIES GIVEN
  457. ;;; THE FITNESS LIST
  458. ;;;
  459.  
  460. (DEFUN PROBSELECT (FITNES)
  461.    (SETF PSELECT-LIST NIL)
  462.    (SETF LISTSUM (SUM-LIST FITNES))
  463.    (SETF TEMPFIT-LIST FITNES)
  464.    (DOTIMES (COUNT1 (LENGTH FITNES))
  465.       (PUSH (/ (POP TEMPFIT-LIST) LISTSUM) PSELECT-LIST))
  466.    (SETF PSELECT-LIST (REVERSE PSELECT-LIST)))
  467.  
  468. ;;;
  469. ;;; GIVEN THE FITNESSLIST THE FUNCTION AND AVERAGE FITNESS EXPECTED-COUNT
  470. ;;; COMPUTES THE EXPECTED NUMBER OF TIMES A STRING SHOULD BE REPRODUCED
  471. ;;;
  472.  
  473. (DEFUN EXPECTED-COUNT (FITNES AVGFIT)
  474.    (SETF TEMPLIST FITNES)
  475.    (SETF EXPECTED-COUNT-LIST NIL)
  476.    (DOTIMES (COUNT1 (LENGTH FITNES))
  477.       (PUSH (/ (POP TEMPLIST) AVGFIT) EXPECTED-COUNT-LIST))
  478.    (SETF EXPECTED-COUNT-LIST (REVERSE EXPECTED-COUNT-LIST)))
  479.  
  480. ;;;
  481.  
  482. (DEFUN SELECTION-STRATEGY (FITLIS EXPCNTLIST POPSIZE STRATEGY-PARAMS)
  483.    (SETF STRATEGY (FIRST STRATEGY-PARAMS))
  484.    (SETF GAPFACTOR (SECOND STRATEGY-PARAMS))
  485.    (IF (EQUAL STRATEGY 'PURE) (PURE-STRATEGY EXPCNTLIST POPSIZE)
  486.       (ELITIST-STRATEGY FITLIS EXPCNTLIST POPSIZE GAPFACTOR)))
  487.  
  488. ;;;
  489.  
  490. (DEFUN PURE-STRATEGY (EXPCNTLIST POPSIZE)
  491.    (SETF NUMTOEVOLVE POPSIZE)
  492.    (SETF ACTUAL-COUNT-LIST (RNDEDCNT EXPCNTLIST)))
  493.  
  494. ;;;
  495.  
  496. (DEFUN RNDEDCNT (EXPCNTLIST)
  497.    (MAPCAR 'ROUND EXPCNTLIST))
  498.  
  499.  
  500. ;;;
  501.  
  502. (DEFUN ELITIST-STRATEGY (FITLIS EXPCNTLST POPSIZE GAPFACT)
  503.    (NUM-EVOLVERS POPSIZE GAPFACT)
  504.    (GET-SURVIVORS NUMTOEVOLVE POPSIZE FITLIS)
  505.    (SETF ACTUAL-COUNT-LIST
  506.       (RNDEDCNT
  507.          (MAPCAR
  508.             '(LAMBDA (X)
  509.                (* X GAPFACT))
  510.             EXPCNTLST))))
  511.  
  512.  
  513. ;;;
  514. ;;; THE ACTUAL REPRODUCTION COUNT IS COMPUTED BY ROUNDING THE EXPECTED
  515. ;;; COUNT TO THE NEAREST INTEGER. NOTE THAT THIS MAY YIELD A NEW POPULATION
  516. ;;; SIZE SLIGHTLY LARGER OR SMALLER THAN THE ACTUAL SIZE, THIS MAY REQUIRE
  517. ;;; ADJUSTING THE POPULATION CORRESPONDINGLY UP OR DOWN TO KEEP IT
  518. ;;; CONSTANT.  SUM-LIST IS A SUPPORT FUNCTION
  519. ;;;
  520.  
  521. (DEFUN ADJUST-COUNT (ACTCNTLIS NUMEVL)
  522.    (SETF LISTCNT '0)
  523.    (SETF NUMELEMENTS (SUM-LIST ACTCNTLIS))
  524.    (IF (< NUMELEMENTS NUMTOEVOLVE)
  525.          (ADJUSTUP NUMELEMENTS ACTCNTLIS NUMEVL))
  526.    (IF (> NUMELEMENTS NUMEVL)
  527.          (ADJUSTDOWN NUMELEMENTS ACTCNTLIS NUMEVL)))
  528.  
  529. ;;;
  530.  
  531. (DEFUN ADJUSTUP (NUMELM CNTLIS POPSIZE)
  532.    (SETF SIZEDIF (- POPSIZE NUMELM))
  533.    (DOTIMES (COUNT1 SIZEDIF)
  534.       (RPLACNTH CNTLIS (+ 1 (NTH COUNT1 CNTLIS)) COUNT1)))
  535.  
  536. ;;;
  537.  
  538. (DEFUN ADJUSTDOWN (NUMELM CNTLIS POPSIZE)
  539.    (SETF LISUM NUMELM)
  540.    (SETF ELEMENTVAL (NTH LISTCNT CNTLIS))
  541.    (IF (= ELEMENTVAL 0)
  542.           (SKIP-VALUE))
  543.    (IF (> ELEMENTVAL 0)
  544.           (DECREMENT-VALUE CNTLIS LISTCNT))
  545.    (SETF SIZEDIF (- LISUM POPSIZE))
  546.    (IF (>= SIZEDIF 1)
  547.          (ADJUSTDOWN LISUM CNTLIS POPSIZE)))
  548.  
  549. ;;;
  550.  
  551. (DEFUN SKIP-VALUE ()
  552.    (IF (EQUAL ELEMENTVAL '0)
  553.          (SETF LISTCNT (+ 1 LISTCNT))) LISTCNT)
  554.  
  555. ;;;
  556.  
  557. (DEFUN DECREMENT-VALUE (CNTLIS ELEMENTCNT)
  558.    (RPLACNTH CNTLIS (- ELEMENTVAL 1) ELEMENTCNT)
  559.    (SETF LISTCNT (+ 1 LISTCNT))
  560.    (SETF LISUM (- LISUM 1)))
  561.  
  562. ;;;
  563.  
  564. (DEFUN MAKE-MATES-LIST (EVLVRS POPSIZE)
  565.    (SETF MATES-LIST NIL)
  566.    (SETF TEMPREPRO EVLVRS)
  567.    (SETF LENEVOLVERS (LENGTH EVLVRS))
  568.    (DOTIMES (COUNT1 LENEVOLVERS)
  569.       (SETF REPROELEMENT (POP TEMPREPRO))
  570.       (SETF FIRSTPARENT (FIRST REPROELEMENT))
  571.       (SETF REPROCNT (SECOND REPROELEMENT))
  572.       (SELECT-MATE FIRSTPARENT REPROCNT POPSIZE)))
  573.  
  574. ;;;
  575. ;;; SELECT-MATE SELECTS A MATE GIVEN THE FIRST PARENT AND THE REPRODUCTION
  576. ;;; SIZE. MATE SELECTION IS FROM THE PREVIOUS GENERATION. NOT-SAME-NUMBER IS
  577. ;;; A SUPPORT FUNCTION
  578. ;;;
  579.  
  580. (DEFUN SELECT-MATE (FIRSTPAR REPRO-CNT POPSIZE)
  581.    (DOTIMES (COUNT2 REPRO-CNT)
  582.       (SETF SECONDPARENT (NOT-SAME-NUMBER FIRSTPAR POPSIZE))
  583.       (PUSH (LIST FIRSTPAR SECONDPARENT) MATES-LIST)))
  584.  
  585.  
  586. ;;;
  587. ;;; CROSSOVER FUNCTIONS
  588. ;;;
  589. ;;; THE FOLLOWING FUNCTIONS PERFORM THE SPLITTING AND
  590. ;;; FUSING OF STRING STRUCTURES ASSOCIATED WITH THE
  591. ;;; CROSSOVER GENETIC OPERATOR. AFTER THE PARENT STRINGS
  592. ;;; HAVE CROSSED OVER OFFSPRING1 IS KEPT FOR THE
  593. ;;; NEXT GENERATION
  594. ;;;;
  595.  
  596. (DEFUN APPLYCROSSOVER (CRSPARAMS POPLIST MATESLIST STRINGLENGTH)
  597.    (SETF LOCUS (FIRST CRSPARAMS))
  598.    (SETF PROBCRSOVR (SECOND CRSPARAMS))
  599.    (CROSSOVER LOCUS PROBCRSOVR POPLIST MATESLIST
  600.      STRINGLENGTH))
  601.  
  602. ;;;
  603.  
  604. (DEFUN CROSSOVER (LOCUS PCROSS POPLIST MATESLIST STRINGLENGTH)
  605.    (SETF TEMPMATES MATESLIST)
  606.    (SETF NOCROSS NIL)
  607.    (SETF NUMEVOLV (LENGTH MATESLIST))
  608.    (SETF EVOLVERSLIST NIL)
  609.    (DOTIMES (COUNT1 NUMEVOLV)
  610.       (SETF PARS (POP TEMPMATES))
  611.       (CROSSOVERTEST LOCUS PCROSS PARS)))
  612.  
  613. ;;;
  614.  
  615. (DEFUN CROSSOVERTEST (LOCUS PCROSS PARENTS)
  616.    (IF (PROBCROSS PCROSS)
  617.          (CROSSOVERFUNC LOCUS PARENTS)
  618.          (PUSH PARENTS NOCROSS))
  619.    (GET-NONCROSSERS NOCROSS POPULATION-LIST))
  620.  
  621. ;;;
  622.  
  623. (DEFUN GET-NONCROSSERS (NOCROS POPLIS)
  624.    (SETF NOCROSSLIST NIL)
  625.    (DOTIMES (COUNT1 (LENGTH NOCROS))
  626.       (SETF NOCRSER (FIRST (POP NOCROS)))
  627.       (SETF NOCRSSTRING (CDR (ASSOC NOCRSER POPLIS)))
  628.       (PUSH (LIST NOCRSSTRING (LIST NOCRSER 'NOCROSSOVER))
  629.                   NOCROSSLIST)))
  630.  
  631. ;;;
  632.  
  633. (DEFUN CROSSOVERFUNC (LOCUS PARENTS)
  634.    (IF (NUMBERP LOCUS)
  635.          (SETF CROSSOVER-LOCUS LOCUS)
  636.          (RANDOM-CROSSOVER-LOCUS CHROMOSOME-LENGTH))
  637.    (GET-PARENT-STRINGS POPULATION-LIST PARENTS)
  638.    (SETF PARENTS-LOCUS (CONS-LAST PARENTS CROSSOVER-LOCUS))
  639.    (SPLIT-STRING CROSSOVER-LOCUS PARENT1)
  640.    (SETF FORE1 FOREPART)
  641.    (SETF AFT1 AFTPART)
  642.    (SPLIT-STRING CROSSOVER-LOCUS PARENT2)
  643.    (SETF FORE2 FOREPART)
  644.    (SETF AFT2 AFTPART)
  645.    (SETF OFFSPRING1 (FUSESTRINGS FORE1 AFT2))
  646.    (SETF OFFSPRING2 (FUSESTRINGS FORE2 AFT1))
  647.    (SETF OFFSPRING OFFSPRING1)
  648.    (SETF OFFSPRINGLIST (LIST OFFSPRING PARENTS-LOCUS))
  649.    (PUSH OFFSPRINGLIST EVOLVERSLIST))
  650.  
  651.  
  652. ;;;
  653. ;;; PROBCROSS IS A FUNCTION WHICH TAKES THE USER SPECIFIED
  654. ;;; CROSSOVER PROBABILITY "PCROSS" AND COMPARES THAT WITH A
  655. ;;; UNIFORMLY GENERATED RANDOM NUMBER "CROSSPROB" TO
  656. ;;; DETERMINE IF CROSSOVER SHOULD OCCUR, THE CROSSOVER
  657. ;;; COUNTER IS INCREMENTED BY 1 IF CROSSOVER IS TO TAKE PLACE.
  658. ;;;
  659.  
  660. (DEFUN PROBCROSS (PCROSS)
  661.    (SETF CROSSPROB (RANDOM 1.0))
  662.    (IF (< CROSSPROB PCROSS)
  663.           (SETF TOTAL-CROSSOVERS (+ 1 TOTAL-CROSSOVERS)))
  664.    (< CROSSPROB PCROSS))
  665.  
  666. ;;;
  667. ;;; RANDOM-CROSSOVER-LOCUS IS THE FUNCTION TO RANDOMLY
  668. ;;; GENERATE THE CROSSOVER POINT GIVEN THE LENGTH OF THE
  669. ;;; STRING, CROSSOVER IS CONSTRAINED TO OCCUR BETWEEN THE
  670. ;;; FIRST AND LAST SITES EXCLUSIVELY I.E. (0 < CROSS-OVER-LOCUS < L),
  671. ;;; WHERE L IS THE STRING LENGTH AND SITES ARE NUMBERED FROM 0.
  672. ;;;
  673.  
  674. (DEFUN RANDOM-CROSSOVER-LOCUS (STRINGLENGTH)
  675.    (SETF CROSSOVER-LOCUS (RANDOM STRINGLENGTH))
  676.    (IF (= 0 CROSSOVER-LOCUS)
  677.           (RANDOM-CROSSOVER-LOCUS STRINGLENGTH)))
  678.  
  679. ;;;
  680.  
  681. (DEFUN GET-PARENT-STRINGS (POPLIST PARENTS)
  682.    (SETF PARENT1 (CDR (ASSOC (FIRST PARENTS) POPLIST)))
  683.    (SETF PARENT2 (CDR (ASSOC (SECOND PARENTS) POPLIST))))
  684.  
  685. ;;;
  686. ;;; SPLIT-STRING IS A FUNCTION TO SPLIT THE STRING AT THE
  687. ;;; CROSSOVER POINT WHICH CAN BE EITHER RANDOMLY CHOSEN OR
  688. ;;; USER SPECIFIED.
  689. ;;;
  690.  
  691. (DEFUN SPLIT-STRING (LOCUS STRING)
  692.    (SETF FOREPART (BUTTAIL STRING LOCUS))
  693.    (SETF AFTPART (NTHCDR LOCUS STRING)))
  694.  
  695. ;;;
  696.  
  697. (DEFUN FUSESTRINGS (FORE AFT)
  698.    (APPEND FORE AFT))
  699.  
  700. ;;;
  701. ;;; MUTATION FUNCTIONS
  702. ;;;
  703. ;;;
  704. ;;; MUTATE-POPULATION APPLIES THE MUTATE-A-STRING FUNCTION TO THE MUTATING
  705. ;;; POPULATION
  706. ;;;
  707.  
  708. (DEFUN APPLYMUTATION (MUTA-PARAMS EVLSLIS)
  709.    (SETF PMUTE (FIRST MUTA-PARAMS))
  710.    (SETF ALPHABET (SECOND MUTA-PARAMS))
  711.    (MUTATE-POPULATION EVLSLIS PMUTE ALPHABET))
  712.  
  713. ;;;
  714.  
  715. (DEFUN MUTATE-POPULATION (POPULATION PMUTATE ALPHABET)
  716.    (SETF MUTATED-EVOLVERS NIL)
  717.    (SETF RANK-ORDER (MAPCAR 'CADR POPULATION))
  718.    (SETF CHROMOSOMES (MAPCAR 'CAR POPULATION))
  719.    (SETF MUTANTCNT 0)
  720.    (DOTIMES (COUNT1 (LENGTH POPULATION))
  721.       (SETF TEMPCHROMO (POP CHROMOSOMES))
  722.       (SETF MUTATEDSTRING (MUTATE-A-STRING TEMPCHROMO PMUTATE ALPHABET))
  723.       (PUSH (LIST MUTATEDSTRING (POP RANK-ORDER)) MUTATED-EVOLVERS)))
  724.  
  725. ;;; MUTATE-A-STRING TAKES AN OBJECT STRING, THE MUTATION PROBABILITY AND THE
  726. ;;; USER SPECIFIED ALPHABET AND SUPPLIES ALTERNATE CHARACTERS FOR THE SITES
  727. ;;; WHERE THE MUTATE FUNCTION IS NON-NIL
  728. ;;;
  729.  
  730. (DEFUN MUTATE-A-STRING (OBJECT-STRING PMUTATE ALPHABET)
  731.    (SETF TEMPOBJECT (COPY-LIST OBJECT-STRING))
  732.    (SETF TEMP-STRING OBJECT-STRING)
  733.    (DOTIMES (COUNT1 (LENGTH OBJECT-STRING))
  734.       (SETF TOKEN (POP TEMP-STRING))
  735.       (IF (PROBMUTATE PMUTATE)
  736.          (RPLACNTH TEMPOBJECT (NOT-SAME-TOKEN TOKEN ALPHABET) COUNT1)))
  737.    TEMPOBJECT)
  738.  
  739. ;;;
  740.  
  741. (DEFUN PROBMUTATE (PMUTATE)
  742.    (SETF MUTATEPROB (RANDOM 1.0))
  743.    (IF (< MUTATEPROB PMUTATE) (SETF MUTANTCNT (+ 1 MUTANTCNT)))
  744.         (< MUTATEPROB PMUTATE))
  745.  
  746. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  747.  
  748.  
  749. (DEFUN NEW-GEN-LIST (GENCNT POPSIZE SURVLIS EVOLIS ATTRIBSLIS)
  750.    (SETF POPULATION-LIST NIL)
  751.    (SETF NEWGENLIS (APPEND SURVLIS EVOLIS))
  752.    (SETF NEWPOPLIS (MAPCAR 'FIRST NEWGENLIS))
  753.    (SETF POPATSLIS (MAPCAR 'SECOND NEWGENLIS))
  754.    (DOTIMES (COUNT1 POPSIZE)
  755.       (PUSH (CONS COUNT1 (POP NEWPOPLIS)) POPULATION-LIST)
  756.       (PUSH (CONS COUNT1 (POP POPATSLIS)) ATTRIBUTESLIST))
  757.    (SETF POPULATION-LIST (REVERSE POPULATION-LIST))
  758.    (SETF ATTRIBUTESLIST (REVERSE ATTRIBUTESLIST)))
  759.  
  760. ;;;
  761. ;;; END OF SOURCE CODE
  762. ;;;