[galib] Parallelize the genome evaluation?

Paul Smith phhs80 at gmail.com
Sat Sep 3 06:15:01 EDT 2011


Thanks, Glenn -- your approach seems very interesting. I am going to
study it, and if I have questions, I will be back. In any case, if you
have a complete working example, it would be very useful if you could
post it here.

Paul


On Sat, Sep 3, 2011 at 4:10 AM, Glenn Sugden <headcrash at mac.com> wrote:
>
> On Sep 2, 2011, at 9:14 AM, galib-request at mit.edu wrote:
>
>> Is it possible to parallelize the genome evaluation?
>
> Here's an old posting of mine that I've updated with some better changes:
>
>        I did this (a pthreaded version) without touching the GALib itself .. it was a tad bit hacky .. but I didn't want to touch the library in case there were updates later on (and I just don't have time to fold .diffs back in).
>
>        Anyway, in a nutshell (this is copy, massaged, and pasted code, so YMMV):
>
>        1) I get ahold of the GA's GAPopulation:
>
>                GAPopulation *pop = const_cast<GAPopulation *>(&ga->population());
>
>        2) I make a copy of the current population*:
>
>                GAPopulation *newpop = pop->clone();
>
>        3) This is optional, but a way to ensure that both populations carry the userData**...
>
>                newpop->userData( ga->userData() );
>
>        4) I install my (threaded) evaluator:
>
>                newpop->evaluator( MyEvaluator );
>
>        5) Now I install the new, modified population into my ga:
>
>                ga->population(*newpop);
>
>        6) Then in my Evaluator:
>
>                extern void MyEvaluator( GAPopulation & p )
>
>        7) I launch threads for each individual***:
>
>                for ( int i = 0; i < p.size(); i++ )
>                        parameters->individual = &p.individual( i );
>                        int rc = pthread_create( &task_threads[i], &attr, thread_function, parameters );
>
>        8) And in my thread / background function:
>
>                static void *thread_function( void *parameters )
>
>        9) I simply evaluate the individual:
>
>                parameters->individual->evaluate();
>
>        10) Then when all of the threads are complete (joined), I pull out the best genome from the population (just so I can display the progress so far):
>                GARealGenome *best_genome = (GARealGenome*)&p.individual(0);
>                double best_score = best_genome->score();
>                for ( int i = 1; i < p.size(); i++ )
>                        GARealGenome* genome = (GARealGenome*)&p.individual(i);
>                        if ( genome->score() > best_score )
>                                best_genome_index = i;
>                                best_genome = genome;
>                                best_score = genome->score();
>
>        11) All of the other magic happens in the outer functionality (e.g. ga->step(), ga->statistics().bestIndividual(), etc.)
>
>
> ::Glenn Sugden
>
>
> * NEW: For optimization purposes (I assume) the population alternates back and forth between the "old" population and the "new" population. This causes galib to clobber the evaluator
> (**as well as userData for the members of the population!). The clone forces the generation of the "other" population so that the evaluator (and userData) are swapped correctly.
>
> *** You may want to queue up your threads, and run n-cores at a time, if you have a large population size.
> _______________________________________________
> galib mailing list
> galib at mit.edu
> http://mailman.mit.edu/mailman/listinfo/galib
>




More information about the galib mailing list