feat(tsp): add move node perturbation
fix(tsp): properly implement binary string -> node permutation fitness
feat(lib): add n consecutive bit flip perturbation for binary string
feat(lib): add two point and n point crossovers
refactor(lib): implement generic evolutionary strategy using .wrapped_mut
Thanks to wrapped_mut now the one_to_five strategy can be implemented
without relying on BoundedPerturbation etc.
feat(tsp): allow crossing bounds in reverse subsequence perturbation
Currently subsequence perturbation was capable only of changes
inside of bounds (left, right), but allow it going through
the right bound, ie. from element 8 to element 1 - swapping
8 with 1, 9 with 0, 10 with 10... this generalizes the perturbation.
Also, change the behavior to generate an index and a length instead
of two indices. This allows for constraining the length of
subsequences.
feat: add possibility to evolve strategy during evolution_algorithm
refactor: generalize apply_to_mutations
refactor(lib): allow modifying mutation perturbation
refactor(lib): add methods to get wrapped perturbations instead of traits.
Remove WrapperPerturbation and ListWrapperPerturbation in favor of
wrapped and wrapped_mut functions on PerturbationOperator. This
allows for easier handling as it's not easy to downcast Any into
WrapperPerturbation or ListWrapperPerturbation. So instead
always return dyn PerturbationOperator instead of dyn Any.
Use dyn Any only for downstasting to concrete types.
This finally allows for apply_to_mutations to be implemented
under MutationPerturbation, allowing to modify the arguments.
feat(tsp): Output csv statistics
chore: do not clone for no reason in local search
chore: remove city ids from chart
feat(tsp): add BinaryString representation of TSP
tests(tsp): add tests for reverse subsequence
fix(tsp): reverse properly in reverse subsequence perturbatio
feat: add loading of optimal cost from solutions.txt
feat: add edge recombination crossover
feat: add into_iter for population