From db93ac635bbbeac2e8d76c1bd7d9e641561cf1ec Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Thu, 26 Jul 2012 13:58:36 +0200 Subject: [PATCH] MPI Multistart: merged functors ReinitJob and ResetAlgo, as it should in fact be done in the mean while. --- eo/test/mpi/t-mpi-multistart.cpp | 70 ++++++++------------------------ 1 file changed, 17 insertions(+), 53 deletions(-) diff --git a/eo/test/mpi/t-mpi-multistart.cpp b/eo/test/mpi/t-mpi-multistart.cpp index cd9a28f4..e704ab61 100644 --- a/eo/test/mpi/t-mpi-multistart.cpp +++ b/eo/test/mpi/t-mpi-multistart.cpp @@ -115,7 +115,7 @@ struct SerializableBasicType : public eoserial::Persistent template< class EOT > struct MultiStartData { - typedef eoF ResetAlgo; + typedef eoUF< eoPop&, void> ResetAlgo; MultiStartData( mpi::communicator& _comm, eoAlgo& _algo, int _masterRank, ResetAlgo & _resetAlgo ) : @@ -193,7 +193,7 @@ class ProcessTaskMultiStart : public ProcessTaskFunction< MultiStartData< EOT > // std::cout << "POP(" << _data->pop.size() << ") : " << _data->pop << std::endl; - _data->resetAlgo(); + _data->resetAlgo( _data->pop ); _data->algo( _data->pop ); _data->comm.send( _data->masterRank, 1, _data->pop.best_element() ); } @@ -217,21 +217,18 @@ class MultiStartStore : public JobStore< MultiStartData< EOT > > public: typedef typename MultiStartData::ResetAlgo ResetAlgo; - typedef eoUF< eoPop&, void > ReinitJob; typedef eoUF< int, std::vector > GetSeeds; MultiStartStore( eoAlgo & algo, int masterRank, // eoInit* init = 0 - ReinitJob & reinitJob, ResetAlgo & resetAlgo, GetSeeds & getSeeds ) : _data( Node::comm(), algo, masterRank, resetAlgo ), _masterRank( masterRank ), - _getSeeds( getSeeds ), - _reinitJob( reinitJob ) + _getSeeds( getSeeds ) { this->_iff = new IsFinishedMultiStart< EOT >; this->_iff->needDelete(true); @@ -245,11 +242,9 @@ class MultiStartStore : public JobStore< MultiStartData< EOT > > void init( const std::vector& workers, int runs ) { - int nbWorkers = workers.size(); - - _reinitJob( _data.pop ); _data.runs = runs; + int nbWorkers = workers.size(); std::vector< int > seeds = _getSeeds( nbWorkers ); if( Node::comm().rank() == _masterRank ) { @@ -287,7 +282,6 @@ class MultiStartStore : public JobStore< MultiStartData< EOT > > MultiStartData< EOT > _data; GetSeeds & _getSeeds; - ReinitJob & _reinitJob; int _masterRank; }; @@ -376,9 +370,16 @@ struct GetRandomSeeds : public MultiStartStore::GetSeeds }; template -struct RecopyPopEA : public MultiStartStore::ReinitJob +struct ReusePopEA: public MultiStartStore::ResetAlgo { - RecopyPopEA( const eoPop& pop, eoEvalFunc& eval ) : _originalPop( pop ), _eval( eval ) + ReusePopEA( + eoGenContinue & continuator, + const eoPop& originalPop, + eoEvalFunc& eval) : + _initial( continuator.totalGenerations() ), + _continuator( continuator ), + _originalPop( originalPop ), + _eval( eval ) { // empty } @@ -390,49 +391,13 @@ struct RecopyPopEA : public MultiStartStore::ReinitJob { _eval( pop[i] ); } - } - - private: - const eoPop& _originalPop; - eoEvalFunc& _eval; -}; - -template -struct ResetGenContinueEA: public MultiStartStore::ResetAlgo -{ - ResetGenContinueEA( eoGenContinue & continuator ) : - _continuator( continuator ), - _initial( continuator.totalGenerations() ) - { - // empty - } - - void operator()() - { _continuator.totalGenerations( _initial ); } private: unsigned int _initial; eoGenContinue & _continuator; -}; - -template< class EOT > -struct eoInitAndEval : public eoInit -{ - eoInitAndEval( eoInit& init, eoEvalFunc& eval ) : _init( init ), _eval( eval ) - { - // empty - } - - void operator()( EOT & indi ) - { - _init( indi ); - _eval( indi ); - } - - private: - eoInit& _init; + const eoPop& _originalPop; eoEvalFunc& _eval; }; @@ -444,9 +409,9 @@ int main(int argc, char **argv) // all parameters are hard-coded! const unsigned int SEED = 133742; // seed for random number generator const unsigned int VEC_SIZE = 8; // Number of object variables in genotypes - const unsigned int POP_SIZE = 20; // Size of population + const unsigned int POP_SIZE = 100; // Size of population const unsigned int T_SIZE = 3; // size for tournament selection - const unsigned int MAX_GEN = 20; // Maximum number of generation before STOP + const unsigned int MAX_GEN = 100; // Maximum number of generation before STOP const float CROSS_RATE = 0.8; // Crossover rate const double EPSILON = 0.01; // range for real uniform mutation const float MUT_RATE = 0.5; // mutation rate @@ -538,8 +503,7 @@ int main(int argc, char **argv) MultiStartStore< Indi > store( gga, DEFAULT_MASTER, - *new RecopyPopEA< Indi >( pop, eval ), - *new ResetGenContinueEA< Indi >( continuator ), + *new ReusePopEA< Indi >( continuator, pop, eval ), *new DummyGetSeeds< Indi >()); MultiStart< Indi > msjob( assignmentAlgo, DEFAULT_MASTER, store, 5 );