module GEP.GeneOperations (
crossover1pt,
crossover2pt,
crossoverGene,
transposeGene,
transposeIS,
transposeRIS
) where
import GEP.Types
crossover1pt :: ([Symbol], [Symbol])
-> Int
-> ([Symbol],[Symbol])
crossover1pt (x,y) loc = (x', y')
where
(fx, bx) = splitAt (loc1) x
(fy, by) = splitAt (loc1) y
x' = fx++by
y' = fy++bx
splitThirds :: [a] -> Int -> Int -> ([a],[a],[a])
splitThirds x l1 l2 = (fx,mx,bx)
where
(fx,tmp) = splitAt l1 x
(mx,bx) = splitAt (l2l1) tmp
crossover2pt :: ([Symbol], [Symbol])
-> Int
-> Int
-> ([Symbol],[Symbol])
crossover2pt (x,y) loc1 loc2 = (x',y')
where
minLoc = min loc1 loc2
maxLoc = max loc1 loc2
(fx,mx,bx) = splitThirds x (minLoc1) (maxLoc1)
(fy,my,by) = splitThirds y (minLoc1) (maxLoc1)
x' = fx++my++bx
y' = fy++mx++by
geneExtract :: [Symbol] -> Int -> Int -> ([Symbol],[Symbol],[Symbol])
geneExtract x gene geneLen = (before, theGene, after)
where
geneStart = geneLen * gene
geneEnd = geneStart + geneLen
(before,theGene,after) = splitThirds x geneStart geneEnd
crossoverGene :: ([Symbol], [Symbol])
-> Int
-> Int
-> ([Symbol], [Symbol])
crossoverGene (x,y) gene geneLen = (x',y')
where
(fx,mx,bx) = geneExtract x gene geneLen
(fy,my,by) = geneExtract y gene geneLen
x' = fx++my++bx
y' = fy++mx++by
findRIS :: [Symbol] -> Genome -> [Symbol]
findRIS [] _ = []
findRIS (x:xs) g | (isNonterminal x g) = (x:xs)
findRIS (_:xs) g | otherwise = findRIS xs g
transposeRIS :: [Symbol]
-> Genome
-> Int
-> Int
-> Int
-> [Symbol]
transposeRIS x genome gene pos len =
fx ++ risSeq ++ keepHead ++ geneTail ++ bx
where
geneLen = (geneLength genome)
(fx,theGene,bx) = geneExtract x gene geneLen
(geneHead, geneTail) = splitAt (headLength genome) theGene
risCandidateRegion = drop pos theGene
risSeq = take len (findRIS risCandidateRegion genome)
keepHeadlen = (headLength genome) (length risSeq)
keepHead = take keepHeadlen geneHead
insertIntoGene :: [Symbol] -> [Symbol] -> Int -> Int -> [Symbol]
insertIntoGene x ins hl pos = (take hl (pre++ins++post))++tX
where
hX = take hl x
tX = drop hl x
pre = take pos x
post = drop pos hX
transposeIS :: [Symbol]
-> Genome
-> Int
-> Int
-> Int
-> Int
-> [Symbol]
transposeIS x genome genenum takepos len putpos =
genesBefore ++ gene' ++ genesAfter
where
geneLen = (geneLength genome)
(genesBefore, gene, genesAfter) = geneExtract x genenum geneLen
iseq = take len (drop takepos gene)
gene' = insertIntoGene gene iseq (headLength genome) putpos
transposeGene :: [Symbol]
-> Genome
-> Int
-> [Symbol]
transposeGene x genome gnum = gene++pregene++postgene
where
geneLen = (headLength genome) + (tailLength genome)
gene = take geneLen (drop (geneLen * gnum) x)
pregene = take (geneLen * gnum) x
postgene = drop (geneLen * (gnum+1)) x