36 #ifdef _GLIBCXX_PARALLEL
73 fFitterTarget( target ),
80 fPopulationSize(populationSize),
82 fPopulation(ranges, populationSize, seed),
83 fBestFitness(DBL_MAX),
86 fPopulation.SetRandomSeed( seed );
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;
static long int sum(long int i)
virtual Double_t CalculateFitness()
starts the evaluation of the fitness of all different individuals of the population.
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...
Cut optimisation interface class for genetic algorithm.
void SetFitness(Double_t fitness)
The TMVA::Interval Class.
Base definition for genetic algorithm.
virtual ~GeneticAlgorithm()
Double_t GetFitness() const
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...
std::vector< Double_t > & GetFactors()
ostringstream derivative to redirect and format output
virtual void Evolution()
this function is called from "init" and controls the evolution of the individuals.
virtual Double_t NewFitness(Double_t oldValue, Double_t newValue)
if the "fitnessFunction" is called multiple times for one set of factors (because i...
Interface for a fitter 'target'.
void Init()
calls evolution, but if it is not the first time.