fix: properly evaluate nsga population The full population has to be evaluated at once, offsprings cannot be evaluated individually.
Lots of changes I lost track of
fix: implement possibility of best candidate not being found
refactor: add possibility to use different logic for obtaining best candidate
feat: add possibility to map EvolutionResult evaluations
refactor(lib): Allow fitting whole population at once The fitness function gets fit_population function. The default implementation is going over fit() one by one, but it can be reimplemented by specific types.
feat(lib): allow modifying fitness function in evolution_algorithm
chore: move population structs to separate module
feat: add a lot of algorithm showcases
feat(lib): add evaluation count to EA stats
feat: add possibility to evolve strategy during evolution_algorithm
chore: do not pass pairing as mut
tests: tweak one_max parameters
refactor: abstract pairing to n-ary
tests: adjust evolution one_max algorithm to always find optimum
refactor: pass rng as argument Instead of having the Rng stored inside the structs, pass it through the functions. This means it's no longer necessary to pass perturbations etc. as mutable.
tests: add simple test for evolution on one_max
refactor: do perturbation in place instead of cloning
chore: move env to codes/eoa_lib
feat: add evolution algorithm