content: {- Constrained Himmelblau function over a non-convex set.
  
  
  Test problem #1 from Deb, K. (2000). An efficient constraint
  handling method for genetic algorithms. Computer methods in applied
  mechanics and engineering, 186(2), 311-338.
  
  Unconstrained optimum: (3,2)
  Constrained optimum: (2.246826, 2.381865)
  
  Running and visualizing in bash/zsh:
  
  N=100 ; ghc --make cp_himmelblau && ./cp_himmelblau -b -d -g $N > output.txt && ( gnuplot -persist <<< "set view map; unset key ; set isosamples 100 ; set logscale cb ; splot [0:6][0:6] (x**2 + y - 11)**2 + (x + y*y - 7)**2 w pm3d, 'output.txt' u 1:2:(0) w p lc 2 pt 4; set xlabel 'x' ; set ylabel 'y' ; set title 'generation $N' ; replot " ; head -1 output.txt)
  
  
  -}
  
  
  import Moo.GeneticAlgorithm.Continuous
  import Moo.GeneticAlgorithm.Constraints
  
  
  import ExampleMain
  
  
  import Data.Function (on)
  
  
  f :: [Double] -> Double
  f [x, y] = (x**2 + y - 11)**2 + (x + y**2 - 7)**2
  xvar [x,_] = x
  yvar [_,y] = y
  g1 [x,y] = 4.84 - (x-0.05)**2 - (y-2.5)**2
  g2 [x,y] = x**2 + (y-2.5)**2 - 4.84
  
  
  constraints = [ 0 .<= xvar <=. 6
                , 0 .<= yvar <=. 6
                , g1 .>=. 0
                , g2 .>=. 0 ]
  
  
  popsize = 100
  initialize = getRandomGenomes popsize [(0,6),(0,6)]
  select = withFitnessSharing (distance2 `on` takeGenome) 0.025 1 Minimizing $
           withConstraints constraints (degreeOfViolation 1.0 0.0) Minimizing $
           tournamentSelect Minimizing 2 popsize
  step = withFinalDeathPenalty constraints $
         nextGeneration Minimizing f select 0
         (simulatedBinaryCrossover 0.5)
         (gaussianMutate 0.05 0.025)
  
  
  {-
  -- exampleMain takes care of command line options and pretty printing.
  -- If you don't need that, a bare bones main function looks like this:
  
  main = do
    results <- runGA initialize (loop (Generations 100) step)
    print . head . bestFirst Minimizing $ results
  
  -}
  main = exampleMain (exampleDefaults { numGenerations = 100 } )
         Minimizing initialize step
  