module Chromosome.Bits (mutateBits,
bits2int,
randomBits,
pointCross,
config)
where
import List
import Random
import Control.Monad.State
import GA
config :: ChromosomeConfig [a] p
config = ChromosomeConfig {
fitness = undefined,
mutate = undefined,
cross = pointCross
}
pointCross :: [a] -> [a] -> (GAState c p) ([a],[a])
pointCross xs ys = do
let len = length xs
point <- gaRand (0, len)
let (left1, right1) = splitAt point xs
(left2, right2) = splitAt point ys
in return $ (left1 ++ right2, left2 ++ right1)
randomBits :: Int -> (GAState c p) [Bool]
randomBits i = replicateM i (gaRand (True, False))
mutateBits :: Double -> [Bool] -> (GAState c p) [Bool]
mutateBits mutationRate xs =
mapM (mutateBit mutationRate) xs
mutateBit r b = do
test <- gaRand (0.0, 1.0)
if test < r
then return $ not b
else return b
bits2int :: [Bool] -> Int
bits2int bs =
sum [ x | (x, b) <- zip _2pwrs bs, b ]
where _2pwrs = 1 : map (*2) _2pwrs