Currently, each optimizer takes care of ordering the individuals according to their fitness to later operate on this ordered list. This can be done after the results of the execution is finished in the runner function instead of having different implementations in each Optimizer.