Similar to , the genetic algorithm used here uses the partially-mapped crossover operator as a combination scheme and mutations are introduced with a probability of 0.3. Mutations consist of moving a random slice in the sequence to another random location. After each generation, sequences are paired up based on an assigned probability proportional to a Boltzmann distribution on the cost function (eq. 2) with k B T = 0.7, which is scaled by 0.7 every 200 optimisation steps. Each run of the algorithm produces an initial population of 1,500 random sequences, which is evolved using the crossover and mutation operators described above. A total of 600 generations is used for each optimisation and the best overall individual (lowest value of L) is selected as the result. Further details are provided in SI 7.2.