36 #ifdef _GLIBCXX_PARALLEL
51 const Bool_t GeneticAlgorithm__DEBUG__ = kFALSE;
54 ClassImp(TMVA::GeneticAlgorithm);
70 TMVA::GeneticAlgorithm::GeneticAlgorithm( IFitterTarget& target, Int_t populationSize,
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") )
86 fPopulation.SetRandomSeed( seed );
89 TMVA::GeneticAlgorithm::~GeneticAlgorithm()
102 void TMVA::GeneticAlgorithm::Init()
104 if ( fFirstTime ) fFirstTime = kFALSE;
124 Double_t TMVA::GeneticAlgorithm::NewFitness( Double_t , Double_t newValue )
136 Double_t TMVA::GeneticAlgorithm::CalculateFitness()
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 )
152 GeneticGenes* genes = fPopulation.GetGenes(index);
153 Double_t fitness = NewFitness( genes->GetFitness(),
154 fFitterTarget.EstimatorFunction(genes->GetFactors()) );
155 genes->SetFitness( fitness );
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 ) {
167 GeneticGenes* genes = fPopulation.GetGenes(index);
168 Double_t fitness = NewFitness( genes->GetFitness(),
169 fFitterTarget.EstimatorFunction(genes->GetFactors()) );
170 genes->SetFitness( fitness );
172 if ( fBestFitness > fitness )
173 fBestFitness = fitness;
191 void TMVA::GeneticAlgorithm::Evolution()
194 fPopulation.MakeCopies( 5 );
195 fPopulation.MakeChildren();
197 fPopulation.Mutate( 10, 3, kTRUE, fSpread, fMirror );
198 fPopulation.Mutate( 40, fPopulation.GetPopulationSize()*3/4 );
218 Double_t TMVA::GeneticAlgorithm::SpreadControl( Int_t ofSteps, Int_t successSteps, Double_t factor )
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;
261 Bool_t TMVA::GeneticAlgorithm::HasConverged( Int_t steps, Double_t improvement )
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;