<div id="_htmlarea_default_style_" style="font:10pt arial,helvetica,sans-serif">We have done that at our research project using a thread-safe Epanet
as the Genome Evaluator.<br>An example follows below:<br><br>#include &lt;pthread.h&gt;<br><br>int main(int argc, char* argv[])
{<br>&nbsp;&nbsp;&nbsp; GARandomSeed();<br><br>&nbsp;&nbsp;&nbsp; GARealAlleleSetArray alleles;<br>&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;
numberOfGenes; i++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alleles.add(your minimum value, your maximum value);<br>&nbsp;&nbsp;&nbsp;
}<br><br>&nbsp;&nbsp;&nbsp; GARealGenome genome(alleles,&nbsp; objective);<br>&nbsp;&nbsp;&nbsp; genome.initializer(::
initializer);<br>&nbsp;&nbsp;&nbsp; GASteadyStateGA ga(genome);<br>&nbsp;&nbsp;&nbsp; GASigmaTruncationScaling trunc;<br>&nbsp;&nbsp;&nbsp;
ga.minimize();<br>&nbsp;&nbsp;&nbsp; ga.populationSize(initialPopulation);<br>&nbsp;&nbsp;&nbsp; ga.nGenerations (generations);<br>&nbsp;&nbsp;&nbsp;
ga.pCrossover (crossoverProb);<br>&nbsp;&nbsp;&nbsp; ga.pMutation (mutationProb);<br>&nbsp;&nbsp;&nbsp; ga.pReplacement
(replacementProb);<br>&nbsp;&nbsp;&nbsp; ga.scaling(trunc);<br>&nbsp;&nbsp;&nbsp; ga.scoreFrequency(10);<br>&nbsp;&nbsp;&nbsp;
ga.flushFrequency(10);<br>&nbsp;&nbsp;&nbsp; ga.selectScores(GAStatistics::AllScores);<br><br>&nbsp;&nbsp;&nbsp; GAPopulation *pop = const_cast&lt;
GAPopulation *&gt; ( &amp;(ga.population()) );<br>&nbsp;&nbsp;&nbsp; pop-&gt;evaluator(myEvaluator);<br><br>&nbsp;&nbsp;&nbsp; while(!ga.done())
{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ga.step();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; genome =
ga.statistics().bestIndividual();<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br><br><br>static void *thread_function(void *parameters) {<br>&nbsp;&nbsp;&nbsp;
((GARealGenome *)parameters)-&gt;evaluate();<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>void myEvaluator(GAPopulation&amp; p)
{<br><br>&nbsp;&nbsp;&nbsp; // this could be used to limit the maximum number of threads according to the number of cores you have, for
example<br>&nbsp;&nbsp;&nbsp; const int MAXTHREADS = 4; // or p.size()<br><br>&nbsp;&nbsp;&nbsp; pthread_t
task_threads[MAXTHREADS];<br><br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;p.size(); ) {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int nParallel =
MAXTHREADS;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((p.size() - i) &lt; MAXTHREADS)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
nParallel = p.size()- i;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int j=0; j &lt; nParallel; j++) {<br><br>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int pCreate = pthread_create(&amp;task_threads[j], NULL, thread_function, (void *)
(GARealGenome*)&amp;p.individual(i));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(pCreate != 0) {<br>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "pthread_create ERROR: " &lt;&lt; pCreate &lt;&lt;
std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
i++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int j=0; j &lt; nParallel; j++)
{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int pJoin = pthread_join(task_threads[j], NULL);<br>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(pJoin != 0) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr
&lt;&lt; "pthread_join ERROR: " &lt;&lt; pJoin &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>float objective(GAGenome&amp; g) {<br><br>&nbsp;&nbsp;&nbsp; GARealGenome &amp; genome =
(GARealGenome&nbsp; &amp;)g;<br>&nbsp;&nbsp;&nbsp; long double fitness = your-thread-safe-evaluation-function(genome);<br>&nbsp;&nbsp;&nbsp; // or
implement your evaluation here<br><br>&nbsp;&nbsp;&nbsp; return(fitness);<br>}<br><br>void initializer(GAGenome&amp; g) {<br>&nbsp;&nbsp;&nbsp;
GARealGenome &amp; genome = (GARealGenome &amp;)g;<br><br>&nbsp;&nbsp;&nbsp; // generate random values for coefficients<br>&nbsp;&nbsp;&nbsp; for(int
i = 0 ; i &lt; numberOfGenes; i++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; genome.gene(i, GARandomFloat(your minimum value, your maximum
value));<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>
-- 
<br>M.Sc. Ramon Hugo de Souza<br>Engenheiro de Software @ Projeto
SCADAPlus<br>www.scadaplus.com.br<br></div>