Changes in PyGAD 2.9.0 (06 December 2020):
1. The fitness values of the initial population are considered in the `best_solutions_fitness` attribute.
2. An optional parameter named `save_best_solutions` is added. It defaults to `False`. When it is `True`, then the best solution after each generation is saved into an attribute named `best_solutions`. If `False`, then no solutions are saved and the `best_solutions` attribute will be empty.
3. Scattered crossover is supported. To use it, assign the `crossover_type` parameter the value `"scattered"`.
4. NumPy arrays are now supported by the `gene_space` parameter.
5. The following parameters (`gene_type`, `crossover_probability`, `mutation_probability`, `delay_after_gen`) can be assigned to a numeric value of any of these data types: `int`, `float`, `numpy.int`, `numpy.int8`, `numpy.int16`, `numpy.int32`, `numpy.int64`, `numpy.float`, `numpy.float16`, `numpy.float32`, or `numpy.float64`.