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)))