packages feed

moo-1.2: examples/mop_kursawe.hs

{- Kursawe function

A multiobjective optimization problem with a discontinuous and
non-convex Pareto front.

Kursawe, F. (1991). A variant of evolution strategies for vector
optimization. In Parallel Problem Solving from Nature
(pp. 193-197). Springer Berlin Heidelberg.

-}


import Moo.GeneticAlgorithm.Continuous
import Moo.GeneticAlgorithm.Constraints
import Moo.GeneticAlgorithm.Multiobjective


n = 3
popsize = 100
generations = 100


mop :: MultiObjectiveProblem ([Double] -> Double)
mop = [ (Minimizing,
         \xs -> sum (map (\i -> -10*exp(-0.2*sqrt(((xs!!i)**2 + (xs!!(i+1))**2)))) [0..(n-2)]))
      , (Minimizing,
         \xs -> sum (map (\x -> abs(x)**0.8 + 5*sin(x**3)) xs)) ]


constraints :: [Constraint Double Double]
constraints = [ (-5.0) .<= (!!0) <=. 5.0
              , (-5.0) .<= (!!1) <=. 5.0
              , (-5.0) .<= (!!2) <=. 5.0 ]


initialize = getRandomGenomes popsize (replicate 3 (-5.0, 5.0))


step :: StepGA Rand Double
step = stepConstrainedNSGA2bt constraints (degreeOfViolation 1 0)
       mop unimodalCrossoverRP (gaussianMutate 0.01 0.5)


main = do
  result <- runGA initialize $ loop (Generations generations) step
  let solutions = map takeGenome $ takeWhile ((<= 10.0) . takeObjectiveValue) result
  let ovs = map takeObjectiveValues $ evalAllObjectives mop solutions
  flip mapM_ ovs $ \[x1,x2] ->
      putStrLn $ show x1 ++ "\t" ++ show x2