[galib] MultiThread + Functor

Glenn Sugden headcrash at mac.com
Fri May 21 01:36:30 EDT 2010

	I did it (a threaded version) without touching the GALib itself .. it was a bit hacky .. but I just didn't want to touch the library in case there were updates later on (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 subvert the evaluator with my own:
		pop->evaluator( MyEvaluator );

	3) Then in my Evaluator:
		extern void MyEvaluator( GAPopulation & p )

	4) I launch some 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 );

	5) And in my thread:
		static void *thread_function( void *parameters )

	6) I evaluate the individual:

	7) Then when all of the threads are complete, 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();

	8) All of the other magic happens in the outer shell (e.g. ga->step(), ga->statistics().bestIndividual(), etc.)

	Let me know if you can use some help if you decide to implement it this way. I think it's the best way to keep the GALib pristine and get the (multi-threaded) job done! ;-)


More information about the galib mailing list