ROOT  6.06/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 <iostream>
31 
32 #include "TMVA/GeneticFitter.h"
33 #include "TMVA/GeneticAlgorithm.h"
34 #include "TMVA/Interval.h"
35 #include "TMVA/Timer.h"
36 
38 
39 ////////////////////////////////////////////////////////////////////////////////
40 /// constructor
41 
42 TMVA::GeneticFitter::GeneticFitter( IFitterTarget& target,
43  const TString& name,
44  const std::vector<TMVA::Interval*>& ranges,
45  const TString& theOption )
46  : FitterBase( target, name, ranges, theOption )
47 {
48  // default parameters settings for Genetic Algorithm
49  DeclareOptions();
50  ParseOptions();
51 }
52 
53 ////////////////////////////////////////////////////////////////////////////////
54 /// declare GA options
55 
57 {
58  DeclareOptionRef( fPopSize=300, "PopSize", "Population size for GA" );
59  DeclareOptionRef( fNsteps=40, "Steps", "Number of steps for convergence" );
60  DeclareOptionRef( fCycles=3, "Cycles", "Independent cycles of GA fitting" );
61  DeclareOptionRef( fSC_steps=10, "SC_steps", "Spread control, steps" );
62  DeclareOptionRef( fSC_rate=5, "SC_rate", "Spread control, rate: factor is changed depending on the rate" );
63  DeclareOptionRef( fSC_factor=0.95, "SC_factor", "Spread control, factor" );
64  DeclareOptionRef( fConvCrit=0.001, "ConvCrit", "Convergence criteria" );
65 
66  DeclareOptionRef( fSaveBestFromGeneration=1, "SaveBestGen",
67  "Saves the best n results from each generation. They are included in the last cycle" );
68  DeclareOptionRef( fSaveBestFromCycle=10, "SaveBestCycle",
69  "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" );
70 
71  DeclareOptionRef( fTrim=kFALSE, "Trim",
72  "Trim the population to PopSize after assessing the fitness of each individual" );
73  DeclareOptionRef( fSeed=100, "Seed", "Set seed of random generator (0 gives random seeds)" );
74 }
75 
76 ////////////////////////////////////////////////////////////////////////////////
77 /// set GA configuration parameters
78 
80  Int_t nsteps,
81  Int_t popSize,
82  Int_t SC_steps,
83  Int_t SC_rate,
84  Double_t SC_factor,
85  Double_t convCrit)
86 {
87  fNsteps = nsteps;
88  fCycles = cycles;
89  fPopSize = popSize;
90  fSC_steps = SC_steps;
91  fSC_rate = SC_rate;
92  fSC_factor = SC_factor;
93  fConvCrit = convCrit;
94 }
95 
96 ////////////////////////////////////////////////////////////////////////////////
97 /// Execute fitting
98 
99 Double_t TMVA::GeneticFitter::Run( std::vector<Double_t>& pars )
100 {
101  Log() << kINFO << "<GeneticFitter> Optimisation, please be patient "
102  << "... (inaccurate progress timing for GA)" << Endl;
103 
104  GetFitterTarget().ProgressNotifier( "GA", "init" );
105 
106  GeneticAlgorithm gstore( GetFitterTarget(), fPopSize, fRanges);
107  // gstore.SetMakeCopies(kTRUE); // commented out, because it reduces speed
108 
109  // timing of GA
110  Timer timer( 100*(fCycles), GetName() );
111  timer.DrawProgressBar( 0 );
112 
113  Double_t progress = 0.;
114 
115  for (Int_t cycle = 0; cycle < fCycles; cycle++) {
116  GetFitterTarget().ProgressNotifier( "GA", "cycle" );
117  // ---- perform series of fits to achieve best convergence
118 
119  // "m_ga_spread" times the number of variables
120  GeneticAlgorithm ga( GetFitterTarget(), fPopSize, fRanges, fSeed );
121  // ga.SetMakeCopies(kTRUE); // commented out, because it reduces speed
122 
123  if ( pars.size() == fRanges.size() ){
124  ga.GetGeneticPopulation().GiveHint( pars, 0.0 );
125  }
126  if (cycle==fCycles-1) {
127  GetFitterTarget().ProgressNotifier( "GA", "last" );
129  }
130 
131  GetFitterTarget().ProgressNotifier( "GA", "iteration" );
132 
133  ga.CalculateFitness();
135 
136  Double_t n=0.;
137  do {
138  GetFitterTarget().ProgressNotifier( "GA", "iteration" );
139  ga.Init();
140  ga.CalculateFitness();
141  if ( fTrim ) ga.GetGeneticPopulation().TrimPopulation();
142  ga.SpreadControl( fSC_steps, fSC_rate, fSC_factor );
143 
144  // monitor progrss
145  if (ga.fConvCounter > n) n = Double_t(ga.fConvCounter);
146  progress = 100*((Double_t)cycle) + 100*(n/Double_t(fNsteps));
147 
148  timer.DrawProgressBar( (Int_t)progress );
149 
150  // Copy the best genes of the generation
151  ga.GetGeneticPopulation().Sort();
152  for ( Int_t i = 0; i<fSaveBestFromGeneration && i<fPopSize; i++ ) {
155  }
156  } while (!ga.HasConverged( fNsteps, fConvCrit ));
157 
158  timer.DrawProgressBar( 100*(cycle+1) );
159 
160  ga.GetGeneticPopulation().Sort();
161  for ( Int_t i = 0; i<fSaveBestFromGeneration && i<fPopSize; i++ ) {
164  }
165  }
166 
167  // get elapsed time
168  Log() << kINFO << "Elapsed time: " << timer.GetElapsedTime()
169  << " " << Endl;
170 
171  Double_t fitness = gstore.CalculateFitness();
172  gstore.GetGeneticPopulation().Sort();
173  pars.swap( gstore.GetGeneticPopulation().GetGenes(0)->GetFactors() );
174 
175  GetFitterTarget().ProgressNotifier( "GA", "stop" );
176  return fitness;
177 }
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="")
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: Rtypes.h:92
ClassImp(TMVA::GeneticFitter) TMVA
constructor
STL namespace.
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:73
TString GetElapsedTime(Bool_t Scientific=kTRUE)
Definition: Timer.cxx:131
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.
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
#define name(a, b)
Definition: linkTestLib0.cpp:5
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 DrawProgressBar(Int_t, const TString &comment="")
draws progress bar in color or B&W caution:
Definition: Timer.cxx:183
void Init()
calls evolution, but if it is not the first time.
const Int_t n
Definition: legend1.C:16
Definition: math.cpp:60