MPI Multistart: saving solutions sent by workers in a eoPop instead of keeping only the best solution.

This commit is contained in:
Benjamin Bouvier 2012-07-26 14:23:07 +02:00
commit 12614faee1

View file

@ -84,7 +84,7 @@ struct MultiStartData
MultiStartData( mpi::communicator& _comm, eoAlgo<EOT>& _algo, int _masterRank, ResetAlgo & _resetAlgo ) MultiStartData( mpi::communicator& _comm, eoAlgo<EOT>& _algo, int _masterRank, ResetAlgo & _resetAlgo )
: :
runs( 0 ), firstIndividual( true ), bestFitness(), pop(), runs( 0 ), pop(), bests(),
comm( _comm ), algo( _algo ), masterRank( _masterRank ), resetAlgo( _resetAlgo ) comm( _comm ), algo( _algo ), masterRank( _masterRank ), resetAlgo( _resetAlgo )
{ {
// empty // empty
@ -92,9 +92,7 @@ struct MultiStartData
// dynamic parameters // dynamic parameters
int runs; int runs;
bool firstIndividual; eoPop< EOT > bests;
typename EOT::Fitness bestFitness;
EOT bestIndividual;
eoPop< EOT > pop; eoPop< EOT > pop;
// static parameters // static parameters
@ -127,13 +125,7 @@ class HandleResponseMultiStart : public HandleResponseFunction< MultiStartData<
EOT individual; EOT individual;
MultiStartData< EOT >& d = *_data; MultiStartData< EOT >& d = *_data;
d.comm.recv( wrkRank, 1, individual ); d.comm.recv( wrkRank, 1, individual );
d.bests.push_back( individual );
if( d.firstIndividual || individual.fitness() > d.bestFitness )
{
d.bestFitness = individual.fitness();
d.bestIndividual = individual;
d.firstIndividual = false;
}
} }
}; };
@ -249,14 +241,9 @@ class MultiStart : public OneShotJob< MultiStartData< EOT > >
store.init( algo.idles(), runs ); store.init( algo.idles(), runs );
} }
EOT& best_individual() eoPop<EOT>& best_individuals()
{ {
return this->store.data()->bestIndividual; return this->store.data()->bests;
}
typename EOT::Fitness best_fitness()
{
return this->store.data()->bestFitness;
} }
}; };
@ -320,9 +307,9 @@ struct GetRandomSeeds : public MultiStartStore<EOT>::GetSeeds
}; };
template<class EOT> template<class EOT>
struct ReusePopEA: public MultiStartStore<EOT>::ResetAlgo struct ReuseOriginalPopEA: public MultiStartStore<EOT>::ResetAlgo
{ {
ReusePopEA( ReuseOriginalPopEA(
eoGenContinue<EOT> & continuator, eoGenContinue<EOT> & continuator,
const eoPop<EOT>& originalPop, const eoPop<EOT>& originalPop,
eoEvalFunc<EOT>& eval) : eoEvalFunc<EOT>& eval) :
@ -372,7 +359,7 @@ int main(int argc, char **argv)
////////////////////////// //////////////////////////
//reproducible random seed: if you don't change SEED above, //reproducible random seed: if you don't change SEED above,
// you'll aways get the same result, NOT a random run // you'll aways get the same result, NOT a random run
rng.reseed(SEED); // rng.reseed(SEED);
// EVAL // EVAL
///////////////////////////// /////////////////////////////
@ -449,22 +436,32 @@ int main(int argc, char **argv)
eval, continuator); eval, continuator);
DynamicAssignmentAlgorithm assignmentAlgo; DynamicAssignmentAlgorithm assignmentAlgo;
ReuseOriginalPopEA< Indi > resetAlgo( continuator, pop, eval );
GetRandomSeeds< Indi > getSeeds( SEED );
MultiStartStore< Indi > store( MultiStartStore< Indi > store(
gga, gga,
DEFAULT_MASTER, DEFAULT_MASTER,
*new ReusePopEA< Indi >( continuator, pop, eval ), resetAlgo,
*new DummyGetSeeds< Indi >()); getSeeds);
MultiStart< Indi > msjob( assignmentAlgo, DEFAULT_MASTER, store, 5 ); MultiStart< Indi > msjob( assignmentAlgo, DEFAULT_MASTER, store, 5 );
msjob.run(); msjob.run();
if( msjob.isMaster() ) if( msjob.isMaster() )
{ {
std::cout << "Global best individual has fitness " << msjob.best_fitness() << std::endl; msjob.best_individuals().sort();
std::cout << "Global best individual has fitness " << msjob.best_individuals().best_element().fitness() << std::endl;
} }
MultiStart< Indi > msjob10( assignmentAlgo, DEFAULT_MASTER, store, 10 ); MultiStart< Indi > msjob10( assignmentAlgo, DEFAULT_MASTER, store, 10 );
msjob10.run(); msjob10.run();
if( msjob10.isMaster() )
{
msjob10.best_individuals().sort();
std::cout << "Global best individual has fitness " << msjob10.best_individuals().best_element().fitness() << std::endl;
}
return 0; return 0;
} }