moo-1.0: Moo/GeneticAlgorithm/Niching.hs
module Moo.GeneticAlgorithm.Niching
( fitnessSharing
) where
import Moo.GeneticAlgorithm.Types
-- | A popular niching method proposed by D. Goldberg and
-- J. Richardson in 1987. The shared fitness of the individual is inversely
-- protoptional to its niche count.
-- The method expects the objective function to be non-negative.
--
-- An extension for minimization problems is implemented by
-- making the fitnes proportional to its niche count (rather than
-- inversely proportional).
--
-- Reference: Chen, J. H., Goldberg, D. E., Ho, S. Y., & Sastry,
-- K. (2002, July). Fitness inheritance in multiobjective
-- optimization. In Proceedings of the Genetic and Evolutionary
-- Computation Conference (pp. 319-326). Morgan Kaufmann Publishers
-- Inc..
fitnessSharing ::
(Phenotype a -> Phenotype a -> Double) -- ^ distance function
-> Double -- ^ niche radius
-> Double -- ^ niche compression exponent @alpha@ (usually 1)
-> ProblemType -- ^ type of the optimization problem
-> Population a
-> Population a
fitnessSharing dist r alpha Maximizing phenotypes =
let ms = map (nicheCount dist r alpha phenotypes) phenotypes
in zipWith (\(genome, value) m -> (genome, value/m)) phenotypes ms
fitnessSharing dist r alpha Minimizing phenotypes =
let ms = map (nicheCount dist r alpha phenotypes) phenotypes
in zipWith (\(genome, value) m -> (genome, value*m)) phenotypes ms
type DistanceFunction a = Phenotype a -> Phenotype a -> Double
nicheCount :: DistanceFunction a
-> Double -> Double
-> Population a -> Phenotype a -> Double
nicheCount dist r alpha population phenotype =
sum $ map (sharing dist r alpha phenotype) population
sharing :: DistanceFunction a
-> Double -> Double
-> DistanceFunction a
sharing dist r alpha pi pj =
let dij = dist pi pj
in if dij < r
then 1.0 - (dij/r)**alpha
else 0.0