{-# LANGUAGE MultiParamTypeClasses,TypeSynonymInstances,FlexibleInstances #-} import Control.Metaheuristics import System.Random import qualified Data.Stream as S import qualified SimpleTSP as TSP import Control.Arrow instance HasQuality TSP.TSP Float where quality (TSP.TSP _ x)= x displaySeries :: [TSP.TSP]->IO() displaySeries [] = print "END" displaySeries (t:tsps) = do print t displaySeries tsps -- TEST Hill climbers testHillClimber = displaySeries $ S.take 100 $ executeMetaheuristic (iterativeImprover (mapArrow TSP.adjacentNeighbourhood )) [s] where (s,g)=TSP.randomSolution (TSP.keyRandGen) testStochasticClimber = displaySeries $ S.take 100 $ executeMetaheuristic (stochasticIterativeImprover g (mapArrow TSP.adjacentNeighbourhood )) [s] where (s,g)=TSP.randomSolution (TSP.keyRandGen) -- TEST hill climber + escape -- Not efficient. We create the neighbourhood twice and make sure it will be valid in the second generation testRestart = displaySeries $ S.take 100 $ executeMetaheuristic (escapeStrategy esTest (stochasticIterativeImprover g2 neiArrow ) (replace (S.fromList ss) ) ) [s] where (g1,g2) = split TSP.keyRandGen (s:ss)=TSP.randomSolutions g1 neiArrow = mapArrow TSP.adjacentNeighbourhood esTest = mapArrow f f s | length ns == 0 = Right s | otherwise = Left s where ns = [ p | p<- TSP.adjacentNeighbourhood s,p