MPI Multistart: saving solutions sent by workers in a eoPop instead of keeping only the best solution.
This commit is contained in:
parent
9a40d6ed04
commit
12614faee1
1 changed files with 21 additions and 24 deletions
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue