-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Simple parallel genetic algorithm implementation -- -- Simple parallel genetic algorithm implementation @package simple-genetic-algorithm @version 0.2.0.0 -- | Simple parallel genetic algorithm implementation. -- --
-- import AI.GeneticAlgorithm.Simple -- import System.Random -- import Text.Printf -- import Data.List as L -- import Control.DeepSeq -- -- newtype SinInt = SinInt [Double] -- -- instance NFData SinInt where -- rnf (SinInt xs) = rnf xs `seq` () -- -- instance Show SinInt where -- show (SinInt []) = "<empty SinInt>" -- show (SinInt (x:xs)) = -- let start = printf "%.5f" x -- end = concat $ zipWith (\c p -> printf "%+.5f" c ++ "X^" ++ show p) xs [1 :: Int ..] -- in start ++ end -- -- polynomialOrder = 4 :: Int -- -- err :: SinInt -> Double -- err (SinInt xs) = -- let f x = snd $ L.foldl' (\(mlt,s) coeff -> (mlt*x, s + coeff*mlt)) (1,0) xs -- in maximum [ abs $ sin x - f x | x <- [0.0,0.001 .. pi/2]] -- -- instance Chromosome SinInt where -- crossover g (SinInt xs) (SinInt ys) = -- ( [ SinInt (L.zipWith (\x y -> (x+y)/2) xs ys) ], g) -- -- mutation g (SinInt xs) = -- let (idx, g') = randomR (0, length xs - 1) g -- (dx, g'') = randomR (-10.0, 10.0) g' -- t = xs !! idx -- xs' = take idx xs ++ [t + t*dx] ++ drop (idx+1) xs -- in (SinInt xs', g'') -- -- fitness int = -- let max_err = 1000.0 in -- max_err - (min (err int) max_err) -- -- randomSinInt gen = -- let (lst, gen') = -- L.foldl' -- (\(xs, g) _ -> let (x, g') = randomR (-10.0,10.0) g in (x:xs,g') ) -- ([], gen) [0..polynomialOrder] -- in (SinInt lst, gen') -- -- stopf :: SinInt -> Int -> IO Bool -- stopf best gnum = do -- let e = err best -- _ <- printf "Generation: %02d, Error: %.8f\n" gnum e -- return $ e < 0.0002 || gnum > 20 -- -- main = do -- int <- runGAIO 64 0.1 randomSinInt stopf -- putStrLn "" -- putStrLn $ "Result: " ++ show int --module AI.GeneticAlgorithm.Simple -- | Chromosome interface class NFData a => Chromosome a crossover :: (Chromosome a, RandomGen g) => g -> a -> a -> ([a], g) mutation :: (Chromosome a, RandomGen g) => g -> a -> (a, g) fitness :: Chromosome a => a -> Double -- | Pure GA implementation. runGA :: (RandomGen g, Chromosome a) => g -> Int -> Double -> (g -> (a, g)) -> (a -> Int -> Bool) -> a -- | Non-pure GA implementation. runGAIO :: Chromosome a => Int -> Double -> (StdGen -> (a, StdGen)) -> (a -> Int -> IO Bool) -> IO a -- | Generate zero generation. Use this function only if you are going to -- implement your own runGA. zeroGeneration :: RandomGen g => g -> (g -> (a, g)) -> Int -> ([a], g) -- | Generate next generation (in parallel) using mutation and crossover. -- Use this function only if you are going to implement your own runGA. nextGeneration :: (RandomGen g, Chromosome a) => g -> [a] -> Int -> Double -> ([a], g)