moo-1.0: examples/beale.hs
{- Minimize Beale function using real-valued genetic algorithm.
Optimal value x* = [3, 0.5]. F(x*) = 0.
-}
import Moo.GeneticAlgorithm.Continuous
beale :: [Double] -> Double
beale [x, y] = (1.5 - x + x*y)**2 + (2.25 - x + x*y*y)**2 + (2.625 - x + x*y*y*y)**2
popsize = 101
elitesize = 1
tolerance = 1e-6
selection = tournamentSelect Minimizing 2 (popsize - elitesize)
crossover = unimodalCrossoverRP
mutation = gaussianMutate 0.25 0.1
step = nextGeneration Minimizing beale selection elitesize crossover mutation
stop = IfObjective (\values -> (minimum values) < tolerance)
initialize = getRandomGenomes popsize [(-4.5, 4.5), (-4.5, 4.5)]
main = do
population <- runGA initialize (loop stop step)
print (head . bestFirst Minimizing $ population)