63 lines
1.7 KiB
Markdown
63 lines
1.7 KiB
Markdown
# Adding Genetic Operators
|
|
|
|
In addition to the already-included genetic operators, you can add your own!
|
|
|
|
## Variation Genetic Operators
|
|
|
|
1. Go to `propeller.variation.cljc`
|
|
2. Define a genetic operator function
|
|
3. In `propeller.variation/new-individual`, add the new genetic operator in the `new-individual` function under the `case` call
|
|
|
|
```clojure
|
|
(defn new-individual
|
|
"Returns a new individual produced by selection and variation of
|
|
individuals in the population."
|
|
[pop argmap]
|
|
...
|
|
(case op
|
|
...
|
|
|
|
:new-genetic-operator
|
|
(-> (:plushy (selection/select-parent pop argmap))
|
|
(new-genetic-operator ))
|
|
...
|
|
:else
|
|
(throw #?(:clj (Exception. (str "No match in new-individual for " op))
|
|
:cljs (js/Error
|
|
(str "No match in new-individual for " op))))))})
|
|
```
|
|
|
|
4. When running a problem, specify the genetic operator in `:variation`.
|
|
For example:
|
|
```
|
|
lein run -m propeller.problems.simple-regression :variation "{:new-genetic-operator 1.0}"
|
|
|
|
```
|
|
|
|
## Selection Genetic Operators
|
|
|
|
1. Go to `propeller.selection.cljc`
|
|
2. Define a genetic operator function
|
|
3. In `propeller.selection.cljc`, add the new genetic operator in the `select-parent` function under the `case` call.
|
|
|
|
```clojure
|
|
(defn select-parent
|
|
"Selects a parent from the population using the specified method."
|
|
[pop argmap]
|
|
(case (:parent-selection argmap)
|
|
...
|
|
:new-genetic-operator (:new-genetic-operator )
|
|
...
|
|
))
|
|
```
|
|
|
|
4. When running a problem, specify the selection method in `:parent-selection`
|
|
|
|
For example:
|
|
|
|
```
|
|
lein run -m propeller.problems.simple-regression :parent-selection :new-genetic-operator
|
|
|
|
```
|
|
|