Logo ROOT   6.07/09
Reference Guide
GeneticFitter.cxx
Go to the documentation of this file.
1 // @(#)root/tmva $Id$
2 // Author: Peter Speckmayer
3 
4 /**********************************************************************************
5  * Project: TMVA - a Root-integrated toolkit for multivariate data analysis *
6  * Package: TMVA *
7  * Class : GeneticFitter *
8  * Web : http://tmva.sourceforge.net *
9  * *
10  * Description: *
11  * Implementation *
12  * *
13  * Authors (alphabetical): *
14  * Peter Speckmayer <speckmay@mail.cern.ch> - CERN, Switzerland *
15  * *
16  * Copyright (c) 2005: *
17  * CERN, Switzerland *
18  * MPI-K Heidelberg, Germany *
19  * *
20  * Redistribution and use in source and binary forms, with or without *
21  * modification, are permitted according to the terms listed in LICENSE *
22  * (http://tmva.sourceforge.net/LICENSE) *
23  **********************************************************************************/
24 
25 //_______________________________________________________________________
26 //
27 // Fitter using a Genetic Algorithm
28 //_______________________________________________________________________
29 
30 #include "TMVA/GeneticFitter.h"
31 
32 #include "TMVA/Configurable.h"
33 #include "TMVA/GeneticAlgorithm.h"
34 #include "TMVA/Interval.h"
35 #include "TMVA/FitterBase.h"
36 #include "TMVA/MsgLogger.h"
37 #include "TMVA/Timer.h"
38 #include "TMVA/Types.h"
39 
40 #include "Rtypes.h"
41 #include "TString.h"
42 
43 #include <iostream>
44 
46 
47 ////////////////////////////////////////////////////////////////////////////////
48 /// constructor
49 
51  const TString& name,
52  const std::vector<TMVA::Interval*>& ranges,
53  const TString& theOption )
54 : FitterBase( target, name, ranges, theOption )
55 {
56  // default parameters settings for Genetic Algorithm
57  DeclareOptions();
58  ParseOptions();
59 }
60 
61 ////////////////////////////////////////////////////////////////////////////////
62 /// declare GA options
63 
65 {
66  DeclareOptionRef( fPopSize=300, "PopSize", "Population size for GA" );
67  DeclareOptionRef( fNsteps=40, "Steps", "Number of steps for convergence" );
68  DeclareOptionRef( fCycles=3, "Cycles", "Independent cycles of GA fitting" );
69  DeclareOptionRef( fSC_steps=10, "SC_steps", "Spread control, steps" );
70  DeclareOptionRef( fSC_rate=5, "SC_rate", "Spread control, rate: factor is changed depending on the rate" );
71  DeclareOptionRef( fSC_factor=0.95, "SC_factor", "Spread control, factor" );
72  DeclareOptionRef( fConvCrit=0.001, "ConvCrit", "Convergence criteria" );
73 
74  DeclareOptionRef( fSaveBestFromGeneration=1, "SaveBestGen",
75  "Saves the best n results from each generation. They are included in the last cycle" );
76  DeclareOptionRef( fSaveBestFromCycle=10, "SaveBestCycle",
77  "Saves the best n results from each cycle. They are included in the last cycle. The value should be set to at least 1.0" );
78 
79  DeclareOptionRef( fTrim=kFALSE, "Trim",
80  "Trim the population to PopSize after assessing the fitness of each individual" );
81  DeclareOptionRef( fSeed=100, "Seed", "Set seed of random generator (0 gives random seeds)" );
82 }
83 
84 ////////////////////////////////////////////////////////////////////////////////
85 /// set GA configuration parameters
86 
88  Int_t nsteps,
89  Int_t popSize,
90  Int_t SC_steps,
91  Int_t SC_rate,
92  Double_t SC_factor,
93  Double_t convCrit)
94 {
95  fNsteps = nsteps;
96  fCycles = cycles;
97  fPopSize = popSize;
98  fSC_steps = SC_steps;
99  fSC_rate = SC_rate;
100  fSC_factor = SC_factor;
101  fConvCrit = convCrit;
102 }
103 
104 ////////////////////////////////////////////////////////////////////////////////
105 /// Execute fitting
106 
107 Double_t TMVA::GeneticFitter::Run( std::vector<Double_t>& pars )
108 {
109  Log() << kHEADER << "<GeneticFitter> Optimisation, please be patient "
110  << "... (inaccurate progress timing for GA)" << Endl;
111 
112  GetFitterTarget().ProgressNotifier( "GA", "init" );
113 
115  // gstore.SetMakeCopies(kTRUE); // commented out, because it reduces speed
116 
117  // timing of GA
118  Timer timer( 100*(fCycles), GetName() );
119  if (fIPyMaxIter) *fIPyMaxIter = 100*(fCycles);
120  timer.DrawProgressBar( 0 );
121 
122  Double_t progress = 0.;
123 
124  for (Int_t cycle = 0; cycle < fCycles; cycle++) {
125  if (fIPyCurrentIter) *fIPyCurrentIter = 100*(cycle);
126  if (fExitFromTraining && *fExitFromTraining) break;
127  GetFitterTarget().ProgressNotifier( "GA", "cycle" );
128  // ---- perform series of fits to achieve best convergence
129 
130  // "m_ga_spread" times the number of variables
132  // ga.SetMakeCopies(kTRUE); // commented out, because it reduces speed
133 
134  if ( pars.size() == fRanges.size() ){
135  ga.GetGeneticPopulation().GiveHint( pars, 0.0 );
136  }
137  if (cycle==fCycles-1) {
138  GetFitterTarget().ProgressNotifier( "GA", "last" );
140  }
141 
142  GetFitterTarget().ProgressNotifier( "GA", "iteration" );
143 
144  ga.CalculateFitness();
146 
147  Double_t n=0.;
148  do {
149  GetFitterTarget().ProgressNotifier( "GA", "iteration" );
150  ga.Init();
151  ga.CalculateFitness();
154 
155  // monitor progrss
156  if (ga.fConvCounter > n) n = Double_t(ga.fConvCounter);
157  progress = 100*((Double_t)cycle) + 100*(n/Double_t(fNsteps));
158 
159  timer.DrawProgressBar( (Int_t)progress );
160 
161  // Copy the best genes of the generation
162  ga.GetGeneticPopulation().Sort();
163  for ( Int_t i = 0; i<fSaveBestFromGeneration && i<fPopSize; i++ ) {
166  }
167  } while (!ga.HasConverged( fNsteps, fConvCrit ));
168 
169  timer.DrawProgressBar( 100*(cycle+1) );
170 
171  ga.GetGeneticPopulation().Sort();
172  for ( Int_t i = 0; i<fSaveBestFromGeneration && i<fPopSize; i++ ) {
175  }
176  }
177 
178  // get elapsed time
179  Log() << kINFO << "Elapsed time: " << timer.GetElapsedTime()
180  << " " << Endl;
181 
182  Double_t fitness = gstore.CalculateFitness();
183  gstore.GetGeneticPopulation().Sort();
184  pars.swap( gstore.GetGeneticPopulation().GetGenes(0)->GetFactors() );
185 
186  GetFitterTarget().ProgressNotifier( "GA", "stop" );
187  return fitness;
188 }
const std::vector< TMVA::Interval * > fRanges
Definition: FitterBase.h:91
UInt_t * fIPyCurrentIter
Definition: FitterBase.h:100
MsgLogger & Endl(MsgLogger &ml)
Definition: MsgLogger.h:162
void GiveHint(std::vector< Double_t > &hint, Double_t fitness=0)
add an individual (a set of variables) to the population if there is a set of variables which is know...
virtual Double_t CalculateFitness()
starts the evaluation of the fitness of all different individuals of the population.
GeneticPopulation & GetGeneticPopulation()
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...
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
MsgLogger & Log() const
Definition: FitterBase.h:95
bool * fExitFromTraining
Definition: FitterBase.h:101
void DrawProgressBar(Int_t, const TString &comment="")
draws progress bar in color or B&W caution:
Definition: Timer.cxx:186
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: Rtypes.h:92
UInt_t * fIPyMaxIter
Definition: FitterBase.h:100
STL namespace.
TString GetElapsedTime(Bool_t Scientific=kTRUE)
Definition: Timer.cxx:129
void AddPopulation(GeneticPopulation *strangers)
add another population (strangers) to the one of this GeneticPopulation
TStopwatch timer
Definition: pirndm.C:37
Double_t Run()
estimator function interface for fitting
Definition: FitterBase.cxx:80
virtual void ProgressNotifier(TString, TString)
Definition: IFitterTarget.h:59
const char * GetName() const
Returns name of object.
Definition: FitterBase.h:76
IFitterTarget & GetFitterTarget() const
Definition: FitterBase.h:70
void TrimPopulation()
trim the population to the predefined size
GeneticGenes * GetGenes(Int_t index)
gives back the "Genes" of the population with the given index.
#define ClassImp(name)
Definition: Rtypes.h:279
double Double_t
Definition: RtypesCore.h:55
void Sort()
sort the genepool according to the fitness of the individuals
Double_t GetFitness() const
Definition: GeneticGenes.h:54
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()
Definition: GeneticGenes.h:51
void SetParameters(Int_t cycles, Int_t nsteps, Int_t popSize, Int_t SC_steps, Int_t SC_rate, Double_t SC_factor, Double_t convCrit)
set GA configuration parameters
void DeclareOptions()
declare GA options
Abstract ClassifierFactory template that handles arbitrary types.
void Init()
calls evolution, but if it is not the first time.
const Int_t n
Definition: legend1.C:16
char name[80]
Definition: TGX11.cxx:109