Redesign setting/getting fitness of an individual
Currently we set the fitness of an individual like individual.fitness = <value> in the objective function. Internally, this triggers the setter self._fitness[self._objective_idx] = v where _objective_idx is set by the evolutionary algorithm prior to calling the objective. In contrast, getting the fitness, e.g., print(individual.fitness) will trigger the getter sum([f for f in self._fitness if f is not None]). The setter/getter are hence logically incompatible.
I would suggest to drop the setter and replace it with a function set_fitness_for_current_objective(<value>) and make the getter return list(self._fitness). To me this seems like the least confusing approach. what do you think @HenrikMettler @mschmidt87 ?