packages feed

genetics-0.0.2: hellogenetics.hs

#!/usr/bin/env runhaskell

{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}

import Data.Random (RVar, runRVar)
import Data.Random.List (randomElement)
import Data.Random.Source.DevRandom

import Genetics
import Control.Monad (replicateM)
import Data.Char (ord, chr)

target :: String
target = "Hello World!"

generations :: Int
generations = 2 ^ 16

indexSpace :: [Int]
indexSpace = [0 .. length target - 1]

randomIndex :: IO Int
randomIndex = runRVar (randomElement indexSpace) DevRandom

charSpace :: String
charSpace = [' ' .. '~']

randomChar :: IO Char
randomChar = runRVar (randomElement charSpace) DevRandom

randomGene :: IO String
randomGene = replicateM (length target) randomChar

instance Gene String where
  fitness gene = sum (zipWith (\t g -> if t == g then 1 else 0) target gene) / fromIntegral (length target)

  mutate gene = do
    i <- randomIndex
    c <- randomChar
    return $ take i gene ++ [c] ++ drop (i + 1) gene

  species _ = 8

main :: IO ()
main = do
  pool <- replicateM (species [""]) randomGene
  pool' <- evolve generations pool
  putStrLn $ best pool'