Reimpose maximum difference for bmx exchange, hardcoded to 3

This commit is contained in:
Lee Spector 2023-12-11 00:49:01 -05:00
parent 0b2024ec6e
commit 3ce672c022

View File

@ -173,6 +173,20 @@ The function `new-individual` returns a new individual produced by selection and
(+ (* 0.5 (metrics/multiset-distance p1 p2)) (+ (* 0.5 (metrics/multiset-distance p1 p2))
(math/abs (- (count p1) (count p2))))) (math/abs (- (count p1) (count p2)))))
;; (defn bmx
;; "Crosses over two plushies using best match crossover (bmx)."
;; [plushy-a plushy-b rate]
;; (let [a-genes (utils/extract-genes plushy-a)
;; b-genes (utils/extract-genes plushy-b)]
;; (flatten
;; (interpose :gap
;; (remove empty?
;; (mapv (fn [g]
;; (if (< (rand) rate)
;; (apply min-key #(bmx-distance g %) b-genes)
;; g))
;; a-genes))))))
(defn bmx (defn bmx
"Crosses over two plushies using best match crossover (bmx)." "Crosses over two plushies using best match crossover (bmx)."
[plushy-a plushy-b rate] [plushy-a plushy-b rate]
@ -181,10 +195,19 @@ The function `new-individual` returns a new individual produced by selection and
(flatten (flatten
(interpose :gap (interpose :gap
(remove empty? (remove empty?
(mapv (fn [g] (mapv (fn [a-gene]
(if (< (rand) rate) (if (< (rand) rate)
(apply min-key #(bmx-distance g %) b-genes) (let [match-info (map (fn [b-gene]
g)) {:distance (bmx-distance a-gene b-gene)
:gene b-gene})
b-genes)
candidates (filter (fn [info]
(<= (:distance info) 3))
match-info)]
(if (empty? candidates)
a-gene
(:gene (apply min-key :distance candidates))))
a-gene))
a-genes)))))) a-genes))))))
(defn new-individual (defn new-individual