I've been trying to get the system working to solve tic-tac-toe. I've had problems getting the random programs dependent enough on their inputs to evolve well. I've been try to get the system to perform better so that I can process generations more quickly and or have larger generations. After tightening a few things up, I've moved on to parallelism.
My initial attempt was to do a fine-grained parallelism. I was planning on parallelizing the generation of programs, and then the crossover/evaluation process. I had some problems getting this to work due to the laziness inherent in Haskell - i.e, I was evaluating shallowly in parallel. I think I could have gotten this to work eventually, but I decided to take a different approach.
My plan for parallelization now is to execute the entire evolution process in separate threads/processes. I will exchange, 'migrate', individuals between these separate populations. This will make it possible to parallelize across processes and even machines. This will allow me to leverage the several computers I have lying around my apartment. To this end, I've already played around with various Haskell networking, serialization, and compression libraries. I think they'll tie together nicely.
Up until now, I've had no support for command line options or runtime interaction. I plan on turning Procreator.hs into an entry point that can easily be hooked into by clients of the system to provide common command line option processing and runtime interaction. This is especially necessary now that I will be managing a set of different population pools. I expect to have commands for starting and stopping the process, loading and saving populations, and configuring different options.
I've been busy reorganizing the system so that this will be possible, and am about ready to tie it all together. I've split up 'Session' options that can be configured for every domain at runtime (such as population size) vs 'Domain' options that must be baked in by the client (such as the function set). Also, I removed all uses of the IO monad from the system (outside the entry point). Instead, I created a new 'RandM' monad to make it easy to perform operations that need to consume random numbers. I expect this to make parallelization easier, and it's nice to stay out of IO anyway.
I will be checking in a revision with all of these changes within the next few days (as my work schedule allows), whenever I have things back up and running again.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I've been trying to get the system working to solve tic-tac-toe. I've had problems getting the random programs dependent enough on their inputs to evolve well. I've been try to get the system to perform better so that I can process generations more quickly and or have larger generations. After tightening a few things up, I've moved on to parallelism.
My initial attempt was to do a fine-grained parallelism. I was planning on parallelizing the generation of programs, and then the crossover/evaluation process. I had some problems getting this to work due to the laziness inherent in Haskell - i.e, I was evaluating shallowly in parallel. I think I could have gotten this to work eventually, but I decided to take a different approach.
My plan for parallelization now is to execute the entire evolution process in separate threads/processes. I will exchange, 'migrate', individuals between these separate populations. This will make it possible to parallelize across processes and even machines. This will allow me to leverage the several computers I have lying around my apartment. To this end, I've already played around with various Haskell networking, serialization, and compression libraries. I think they'll tie together nicely.
Up until now, I've had no support for command line options or runtime interaction. I plan on turning Procreator.hs into an entry point that can easily be hooked into by clients of the system to provide common command line option processing and runtime interaction. This is especially necessary now that I will be managing a set of different population pools. I expect to have commands for starting and stopping the process, loading and saving populations, and configuring different options.
I've been busy reorganizing the system so that this will be possible, and am about ready to tie it all together. I've split up 'Session' options that can be configured for every domain at runtime (such as population size) vs 'Domain' options that must be baked in by the client (such as the function set). Also, I removed all uses of the IO monad from the system (outside the entry point). Instead, I created a new 'RandM' monad to make it easy to perform operations that need to consume random numbers. I expect this to make parallelization easier, and it's nice to stay out of IO anyway.
I will be checking in a revision with all of these changes within the next few days (as my work schedule allows), whenever I have things back up and running again.