21 #include "gas/simplega.h"
22 #include "core/reproduction.h"
23 #include "core/genome.h"
24 #include "core/evaluation.h"
25 #include "configurationhelper.h"
26 #include <QThreadPool>
27 #include <QtConcurrentMap>
28 using namespace QtConcurrent;
44 foreach( SimpleGA::evaluationThread* e, evalThreads ) {
73 d.
describeInt(
"numThreads" ).
limits( 1, 32 ).
def(1).
help(
"Number of threads to parallelize the evaluation of individuals" );
74 d.
describeInt(
"ngenerations" ).
limits( 1, INT_MAX ).
def( 1000 ).
help(
"Number of the generations of the evolutionary process" );
81 if ( numThreads < 1 ) {
82 qWarning(
"The number of Threads must be greater than one!!" );
85 "SimpleGA::setNumThreads",
86 "This method can only called before initialize of SimpleGA" );
88 "SimpleGA::setNumThreads",
89 "This method must be called after an Evaluation object has been setted by SimpleGA::setEvaluation" );
100 this->fitfunc->
setGA(
this );
109 QVector<Evaluation*> ev;
110 foreach( SimpleGA::evaluationThread* e, evalThreads ) {
111 ev.append( e->eval );
118 this->reprod->
setGA(
this );
128 "SimpleGA::initialize",
129 "You have to setup the Evaluation object of SimpleGA (Fitness Function)" );
131 "SimpleGA::initialize",
132 "You have to setup the Reproduction operator of SimpleGA" );
141 for(
int i=0; i<evalThreads.size(); i++ ) {
142 delete (evalThreads[i]);
145 for(
int i=0; i<numThreadv; i++ ) {
146 evalThreads.append(
new evaluationThread(
this,
fitfunc ) );
147 evalThreads.last()->eval->initGeneration( 0 );
150 QThreadPool::globalInstance()->setMaxThreadCount( numThreadv );
156 for(
int i=0; i<numThreadv; i++ ) {
157 evalThreads[i]->sequence.clear();
159 for(
int i=0; i<(int)
genome()->
size(); i++ ) {
160 evalThreads[ i%numThreadv ]->sequence.append( i );
162 for(
int i=0; i<numThreadv; i++ ) {
163 evalThreads[i]->idSeq = 0;
164 evalThreads[i]->id = evalThreads[i]->sequence[ evalThreads[i]->idSeq ];
165 evalThreads[i]->eval->setGenome(
genome() );
166 evalThreads[i]->eval->initialize(
genome()->at( evalThreads[i]->
id ) );
167 evalThreads[i]->blocked =
false;
172 nextGeneration =
true;
173 if ( numThreadv == 1 ) {
175 evalThreads[0]->runStep();
177 QFuture<void> future = map( evalThreads, SimpleGA::runStepWrapper );
178 future.waitForFinished();
180 if ( nextGeneration ) {
185 case nextGeneration_pass1:
189 for(
int i=0; i<numThreadv; i++ ) {
190 evalThreads[i]->eval->endGeneration(
generation() );
198 case nextGeneration_pass2: {
208 for(
int i=0; i<numThreadv; i++ ) {
209 evalThreads[i]->eval->initGeneration(
generation() );
218 qFatal(
"Default switch in SimpleGA::gaStep" );
242 : parent(p), id(0), blocked(false) {
243 eval = eProto->
clone();
248 SimpleGA::evaluationThread::~evaluationThread() {
253 void SimpleGA::evaluationThread::runStep() {
258 parent->nextGeneration =
false;
259 eval->evaluateStep();
260 if ( eval->isEvaluationDone() ) {
261 int nextIdSeq = idSeq + 1;
263 eval->genotype()->setRank( eval->genotype()->fitness() );
264 if ( nextIdSeq >= sequence.size() ) {
269 int nextId = sequence[ idSeq ];
271 eval->initialize( parent->genome()->at(
id ) );
275 void SimpleGA::runStepWrapper( SimpleGA::evaluationThread* e ) {