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 ) {
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" );
142 for(
int i=0; i<evalThreads.size(); i++ ) {
143 delete (evalThreads[i]);
146 for(
int i=0; i<numThreadv; i++ ) {
147 evalThreads.append(
new evaluationThread(
this,
fitfunc ) );
148 evalThreads.last()->eval->initGeneration( 0 );
151 QThreadPool::globalInstance()->setMaxThreadCount( numThreadv );
157 for(
int i=0; i<numThreadv; i++ ) {
158 evalThreads[i]->sequence.clear();
160 for(
int i=0; i<(int)
genome()->
size(); i++ ) {
161 evalThreads[ i%numThreadv ]->sequence.append( i );
163 for(
int i=0; i<numThreadv; i++ ) {
164 evalThreads[i]->idSeq = 0;
165 evalThreads[i]->id = evalThreads[i]->sequence[ evalThreads[i]->idSeq ];
166 evalThreads[i]->eval->setGenome(
genome() );
167 evalThreads[i]->eval->initialize(
genome()->at( evalThreads[i]->
id ) );
168 evalThreads[i]->blocked =
false;
173 nextGeneration =
true;
174 if ( numThreadv == 1 ) {
176 evalThreads[0]->runStep();
178 QFuture<void> future = map( evalThreads, SimpleGA::runStepWrapper );
179 future.waitForFinished();
181 if ( nextGeneration ) {
186 case nextGeneration_pass1:
190 for(
int i=0; i<numThreadv; i++ ) {
191 evalThreads[i]->eval->endGeneration(
generation() );
201 case nextGeneration_pass2: {
211 for(
int i=0; i<numThreadv; i++ ) {
212 evalThreads[i]->eval->initGeneration(
generation() );
221 qFatal(
"Default switch in SimpleGA::gaStep" );
245 : parent(p), id(0), blocked(false) {
246 eval = eProto->
clone();
251 SimpleGA::evaluationThread::~evaluationThread() {
256 void SimpleGA::evaluationThread::runStep() {
261 parent->nextGeneration =
false;
262 eval->evaluateStep();
263 if ( eval->isEvaluationDone() ) {
264 int nextIdSeq = idSeq + 1;
266 eval->genotype()->setRank( eval->genotype()->fitness() );
267 if ( nextIdSeq >= sequence.size() ) {
272 int nextId = sequence[ idSeq ];
274 eval->initialize( parent->genome()->at(
id ) );
278 void SimpleGA::runStepWrapper( SimpleGA::evaluationThread* e ) {