feat(tsp): add MinimalSpanningTree initializer
feat(tsp): add 2opt perturbation for subsequence reversal
feat(tsp): add TSPInstance convertor to GenericGraph
feat(tsp): add minimal spanning tree and filter_edges
feat(tsp): add nearest neighbor initializer
feat(tsp): add cycle, no and partially mapped crossovers
refactor(tsp): split to multiple files out of tsp.rs
fix(lib): do not take mut self in population.iter()
feat(lib): add roulette wheel selection
refactor(tsp): put plotting to main to not repeat code
feat(lib): add random search
feat(tsp): add ea binary algorithm
tests(tsp): adapt to new binarystring -> node permutation implementation
tests(tsp): add test for verify_solution
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.