001  (ns nature.initialization-operators
002    "Functions to create individuals and populations"
003    (:require [nature.population-presets :as pp]))
004  
005  (defn uuid
006    "More idiomatic wrapper around Java's v1 UUID functionality"
007    []
008    (str (java.util.UUID/randomUUID)))
009  
010  (defn generate-sequence
011    "Creates a genetic sequence of `sequence-length` elements,
012    where each item is in the collection of `alleles`"
013    [alleles sequence-length]
014    (repeatedly sequence-length #(rand-nth alleles)))
015  
016  (defn build-individual
017    "Generate a new individual, and evaluate the fitness of the genetic sequence."
018    ([genetic-sequence fitness-function]
019     (assoc {} :genetic-sequence genetic-sequence
020            :guid (uuid)
021            :parents pp/initializer-name
022            :age pp/default-age
023            :fitness-score (fitness-function genetic-sequence)))
024  
025    ([genetic-sequence parent-coll age fitness-function]
026     (assoc {} :genetic-sequence genetic-sequence
027            :guid (uuid)
028            :parents parent-coll
029            :age age
030            :fitness-score (fitness-function genetic-sequence))))
031  
032  (defn build-population
033    "Build `population-size` individuals by invoking `build-individual` on random, conforming genetic sequences."
034    [population-size alleles sequence-length fitness-function]
035    (repeatedly population-size #(build-individual (generate-sequence alleles sequence-length) fitness-function)))