00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PARALLELGA_H
00021 #define PARALLELGA_H
00022
00023 #include "gaconfig.h"
00024 #include "core/geneticalgo.h"
00025 #include <QList>
00026 #include <QFuture>
00027
00028 namespace farsa {
00029
00030 class Evaluation;
00031 class Reproduction;
00032
00044 class FARSA_GA_API ParallelGA : public GeneticAlgo {
00045 public:
00047 ParallelGA();
00049 virtual ~ParallelGA();
00053 void setNumThreads( int numThreads );
00055 int numThreads();
00057 void setEvaluation( Evaluation* fitfunc );
00062 virtual Evaluation* evaluationPrototype();
00064 virtual QVector<Evaluation*> evaluationPool();
00066 void setReproduction( Reproduction* reproduct );
00068 Reproduction* reproduction();
00071 virtual void initialize();
00073 virtual void gaStep();
00075 virtual void finalize();
00076
00081 virtual void skipEvaluation();
00082
00090 virtual void configure( ConfigurationParameters& params, QString prefix );
00097 virtual void save( ConfigurationParameters& params, QString prefix );
00099 static void describe( QString type );
00100
00101 protected:
00103 Evaluation* fitfunc;
00105 Reproduction* reprod;
00107 typedef enum { initEvaluation, evaluating, nextGeneration_pass1, nextGeneration_pass2, endEvolution } GAPhases;
00109 GAPhases currPhase;
00111 bool isInitialized;
00113 bool isFinalized;
00114
00115 private:
00117 bool nextGeneration;
00118
00123 class evaluationThread {
00124 public:
00125
00126 evaluationThread( Evaluation* eProto );
00127
00128 ~evaluationThread();
00129
00130 Evaluation* eval;
00131
00132 int id;
00133
00134 void runStep();
00135
00136 QVector<int> sequence;
00137
00138 int idSeq;
00139 };
00140
00142 QList<evaluationThread*> evalThreads;
00144 int numThreadv;
00146 static void runStepWrapper( ParallelGA::evaluationThread* e );
00148 QFuture<void>* future;
00149 };
00150
00151 }
00152
00153 #endif