Logo ROOT   6.12/07
Reference Guide
TMVAGAexample.C File Reference

Detailed Description

View in nbviewer Open in SWAN This exectutable gives an example of a very simple use of the genetic algorithm of TMVA

0.0133650302887
3.75138807297
Processing /mnt/build/workspace/root-makedoc-v612/rootspi/rdoc/src/v6-12-00-patches/tutorials/tmva/TMVAGAexample.C...
Start Test TMVAGAexample
========================
EXAMPLE
range: 0 15
range: 0 13
range: 0 5
: fitness: -173.083 f_0: 15 f_1: 12.5389 f_2: 5
---
: fitness: -175.583 f_0: 15 f_1: 12.5389 f_2: 2.5
---
: fitness: -175.583 f_0: 15 f_1: 12.5389 f_2: 2.5
---
: fitness: -175.583 f_0: 15 f_1: 12.5389 f_2: 2.5
---
: fitness: -180.385 f_0: 15 f_1: 12.6924 f_2: 0
---
: fitness: -183.752 f_0: 15 f_1: 12.9168 f_2: 0
---
: fitness: -183.752 f_0: 15 f_1: 12.9168 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.545 f_0: 15 f_1: 12.9697 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.685 f_0: 15 f_1: 12.979 f_2: 0
---
: fitness: -184.705 f_0: 15 f_1: 12.9803 f_2: 0
---
: fitness: -184.705 f_0: 15 f_1: 12.9803 f_2: 0
---
: fitness: -184.705 f_0: 15 f_1: 12.9803 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.917 f_0: 15 f_1: 12.9945 f_2: 0
---
: fitness: -184.927 f_0: 15 f_1: 12.9951 f_2: 0
---
: fitness: -184.927 f_0: 15 f_1: 12.9951 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
: fitness: -184.945 f_0: 15 f_1: 12.9963 f_2: 0
---
FACTOR 0 : 15
FACTOR 1 : 12.9963
FACTOR 2 : 0
#include <iostream> // Stream declarations
#include <vector>
using namespace std;
using namespace TMVA;
class MyFitness : public IFitterTarget {
public:
MyFitness() : IFitterTarget() {
}
// the fitness-function goes here
// the factors are optimized such that the return-value of this function is minimized
// take care!! the fitness-function must never fail, .. means: you have to prevent
// the function from reaching undefined values (such as x=0 for 1/x or so)
//
// HINT: to use INTEGER variables, it is sufficient to cast the "factor" in the fitness-function
// to (int). In this case the variable-range has to be chosen +1 ( to get 0..5, take Interval(0,6) )
// since the introduction of "Interval" ranges can be defined with a third parameter
// which gives the number of bins within the interval. With that technique discrete values
// can be achieved easier. The random selection out of this discrete numbers is completly uniform.
//
Double_t EstimatorFunction( std::vector<Double_t> & factors ){
//return (10.- (int)factors.at(0) *factors.at(1) + (int)factors.at(2));
return (10.- factors.at(0) *factors.at(1) + factors.at(2));
//return 100.- (10 + factors.at(1)) *factors.at(2)* TMath::Abs( TMath::Sin(factors.at(0)) );
}
};
class MyGA2nd : public GeneticAlgorithm {
public:
MyGA2nd( IFitterTarget& target, Int_t size, vector<Interval*>& ranges ) : GeneticAlgorithm(target,
size, ranges ){
}
// this method has to be activated if one wants to change the behaviour of the evolution
// works only with the head version
//void Evolution(){
// fSexual = true;
// if (fSexual) {
// fPopulation.MakeCopies( 5 );
// fPopulation.MakeChildren();
// fPopulation.NextGeneration();
// fPopulation.Mutate( 10, 3, kTRUE, fSpread, fMirror );
// fPopulation.Mutate( 40, fPopulation.GetPopulationSize()*3/4 );
// } else {
// fPopulation.MakeCopies( 3 );
// fPopulation.MakeMutants(100,true, 0.1, true);
// fPopulation.NextGeneration();
// }
// }
};
void TMVAGAexample() {
std::cout << "Start Test TMVAGAexample" << std::endl
<< "========================" << std::endl
<< "\nEXAMPLE" << std::endl;
// define all the parameters by their minimum and maximum value
// in this example 3 parameters are defined.
vector<Interval*> ranges;
ranges.push_back( new Interval(0,15,30) );
ranges.push_back( new Interval(0,13) );
ranges.push_back( new Interval(0,5,3) );
for( std::vector<Interval*>::iterator it = ranges.begin(); it != ranges.end(); it++ ){
std::cout << " range: " << (*it)->GetMin() << " " << (*it)->GetMax() << std::endl;
}
IFitterTarget* myFitness = new MyFitness();
// prepare the genetic algorithm with an initial population size of 20
// mind: big population sizes will help in searching the domain space of the solution
// but you have to weight this out to the number of generations
// the extreme case of 1 generation and populationsize n is equal to
// a Monte Carlo calculation with n tries
MyGA2nd mg( *myFitness, 100, ranges );
// mg.SetParameters( 4, 30, 200, 10,5, 0.95, 0.001 );
#define CONVSTEPS 20
#define CONVCRIT 0.0001
#define SCSTEPS 10
#define SCRATE 5
#define SCFACTOR 0.95
do {
// prepares the new generation and does evolution
mg.Init();
// assess the quality of the individuals
mg.CalculateFitness();
mg.GetGeneticPopulation().Print(0);
std::cout << "---" << std::endl;
// reduce the population size to the initially defined one
mg.GetGeneticPopulation().TrimPopulation();
// tricky thing: control the speed of how fast the "solution space" is searched through
// this function basically influences the sigma of a gaussian around the actual value
// of the parameter where the new value will be randomly thrown.
// when the number of improvements within the last SCSTEPS
// A) smaller than SCRATE: divide the preset sigma by SCFACTOR
// B) equal to SCRATE: do nothing
// C) greater than SCRATE: multiply the preset sigma by SCFACTOR
// if you don't know what to do, leave it unchanged or even delete this function call
mg.SpreadControl( SCSTEPS, SCRATE, SCFACTOR );
} while (!mg.HasConverged( CONVSTEPS, CONVCRIT )); // converged if: fitness-improvement < CONVCRIT within the last CONVSTEPS loops
GeneticGenes* genes = mg.GetGeneticPopulation().GetGenes( 0 );
std::vector<Double_t> gvec;
gvec = genes->GetFactors();
int n = 0;
for( std::vector<Double_t>::iterator it = gvec.begin(); it<gvec.end(); it++ ){
std::cout << "FACTOR " << n << " : " << (*it) << std::endl;
n++;
}
}
int main( int argc, char** argv )
{
TMVAGAexample();
}
Author
Andreas Hoecker

Definition in file TMVAGAexample.C.