packages feed

moo-1.0: examples/mop_constr2.hs

{- CONSTR2 problem from (Deb. 2002).
   A part of the unconstrained Pareto-optimal region is not feasible.
-}


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


popsize = 100
generations = 100


mop :: MultiObjectiveProblem ([Double] -> Double)
mop = [ (Minimizing, \[x1,_] -> x1)
      , (Minimizing, \[x1,x2] -> (1+x2)/x1) ]


constraints = [ 0.1 .<= x1 <=. 1.0
              , 0.0 .<= x2 <=. 5.0
              , g1 .>=. 6.0
              , g2 .>=. 1.0 ]
  where
    x1 [x,_] = x
    x2 [_,y] = y
    g1 [x1,x2] = 9*x1 + x2
    g2 [x1,x2] = 9*x1 - x2



initialize = getConstrainedGenomes constraints popsize [(0.1,1.0),(0.0,5.0)]
tournament = tournamentSelect Minimizing 2 popsize


step :: StepGA Rand Double
step = stepConstrainedNSGA2 constraints (degreeOfViolation 1 0)
       mop tournament (blendCrossover 0.1) noMutation -- (gaussianMutate 0.5 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