Abstract class to be used as the base for GAs.
Evolution function works as follows.
Set the mutation rate of the algorithm
Set the crossover rate
Set the number of generations between printing statistics
Set the random seed to be used by the algorithm
Set the value at which the evolution will terminate
Get a handle to the recorded statistics for this genome
Stores the population being evolved
Register a function to call when the evolution is ended.
Register a function to be called every generation
Method invoked to create the initial population
Method invoked to select the individuals to be parents to the next generation
Method invoked to create the next generation of the population
Method invoked to create variation in the population
Prints the statistics of the last generation
Print the score of the historically best individual as well as the individual if it is printable