-
Notifications
You must be signed in to change notification settings - Fork 3
/
initialization_operators.clj
35 lines (30 loc) · 1.34 KB
/
initialization_operators.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(ns nature.initialization-operators
"Functions to create individuals and populations"
(:require [nature.population-presets :as pp]))
(defn uuid
"More idiomatic wrapper around Java's v1 UUID functionality"
[]
(str (java.util.UUID/randomUUID)))
(defn generate-sequence
"Creates a genetic sequence of `sequence-length` elements,
where each item is in the collection of `alleles`"
[alleles sequence-length]
(repeatedly sequence-length #(rand-nth alleles)))
(defn build-individual
"Generate a new individual, and evaluate the fitness of the genetic sequence."
([genetic-sequence fitness-function]
(assoc {} :genetic-sequence genetic-sequence
:guid (uuid)
:parents pp/initializer-name
:age pp/default-age
:fitness-score (fitness-function genetic-sequence)))
([genetic-sequence parent-coll age fitness-function]
(assoc {} :genetic-sequence genetic-sequence
:guid (uuid)
:parents parent-coll
:age age
:fitness-score (fitness-function genetic-sequence))))
(defn build-population
"Build `population-size` individuals by invoking `build-individual` on random, conforming genetic sequences."
[population-size alleles sequence-length fitness-function]
(repeatedly population-size #(build-individual (generate-sequence alleles sequence-length) fitness-function)))