36#ifdef _GLIBCXX_PARALLEL
71 const std::vector<Interval*>& ranges,
UInt_t seed )
73 fFitterTarget( target ),
80 fPopulationSize(populationSize),
82 fPopulation(ranges, populationSize, seed),
83 fBestFitness(DBL_MAX),
84 fLogger( new
MsgLogger(
"GeneticAlgorithm") )
104 if ( fFirstTime ) fFirstTime =
kFALSE;
138 fBestFitness = DBL_MAX;
139#ifdef _GLIBCXX_PARALLEL
141 const int nt = omp_get_num_threads();
143 for (
int i =0; i < nt; ++i )
144 bests[i] = fBestFitness;
148 int thread_number = omp_get_thread_num();
150 for (
int index = 0; index < fPopulation.GetPopulationSize(); ++index )
154 fFitterTarget.EstimatorFunction(genes->
GetFactors()) );
157 if ( bests[thread_number] > fitness )
158 bests[thread_number] = fitness;
162 fBestFitness = *std::min_element(bests, bests+nt);
166 for (
int index = 0; index < fPopulation.GetPopulationSize(); ++index ) {
169 fFitterTarget.EstimatorFunction(genes->
GetFactors()) );
172 if ( fBestFitness > fitness )
173 fBestFitness = fitness;
194 fPopulation.MakeCopies( 5 );
195 fPopulation.MakeChildren();
197 fPopulation.Mutate( 10, 3,
kTRUE, fSpread, fMirror );
198 fPopulation.Mutate( 40, fPopulation.GetPopulationSize()*3/4 );
221 if ( fBestFitness < fLastResult || fSuccessList.size() <=0 ) {
222 fLastResult = fBestFitness;
223 fSuccessList.push_front( 1 );
226 fSuccessList.push_front( 0 );
230 std::deque<Int_t>::iterator vec = fSuccessList.begin();
231 for (; vec != fSuccessList.end() ; ++vec) {
236 if (
n >= ofSteps ) {
237 fSuccessList.pop_back();
238 if (
sum > successSteps ) {
240 if (GeneticAlgorithm__DEBUG__)
Log() << kINFO <<
">" << std::flush;
242 else if (
sum == successSteps ) {
243 if (GeneticAlgorithm__DEBUG__)
Log() <<
"=" << std::flush;
247 if (GeneticAlgorithm__DEBUG__)
Log() <<
"<" << std::flush;
263 if (fConvCounter < 0) {
264 fConvValue = fBestFitness;
266 if (
TMath::Abs(fBestFitness - fConvValue) <= improvement || steps<0) {
271 fConvValue = fBestFitness;
273 if (GeneticAlgorithm__DEBUG__)
Log() <<
"." << std::flush;
274 if (fConvCounter < steps)
return kFALSE;
Base definition for genetic algorithm.
virtual Double_t SpreadControl(Int_t steps, Int_t ofSteps, Double_t factor)
this function provides the ability to change the stepSize of a mutation according to the success of t...
virtual Bool_t HasConverged(Int_t steps=10, Double_t ratio=0.1)
gives back true if the last "steps" steps have lead to an improvement of the "fitness" of the "indivi...
GeneticPopulation fPopulation
void Init()
calls evolution, but if it is not the first time.
virtual void Evolution()
this function is called from "init" and controls the evolution of the individuals.
virtual ~GeneticAlgorithm()
virtual Double_t CalculateFitness()
starts the evaluation of the fitness of all different individuals of the population.
GeneticAlgorithm(IFitterTarget &target, Int_t populationSize, const std::vector< TMVA::Interval * > &ranges, UInt_t seed=0)
Constructor.
virtual Double_t NewFitness(Double_t oldValue, Double_t newValue)
if the "fitnessFunction" is called multiple times for one set of factors (because i....
Cut optimisation interface class for genetic algorithm.
void SetFitness(Double_t fitness)
std::vector< Double_t > & GetFactors()
Double_t GetFitness() const
void SetRandomSeed(UInt_t seed=0)
the random seed of the random generator
Interface for a fitter 'target'.
ostringstream derivative to redirect and format output
create variable transformations
static long int sum(long int i)