@@ 266,12 266,18 @@ where
}
pub struct ReverseSubsequencePerturbation<D> {
- _phantom: PhantomData<D>
+ _phantom: PhantomData<D>,
+ min_subsequence_len: usize,
+ max_subsequence_len: usize,
}
impl<D> ReverseSubsequencePerturbation<D> {
pub fn new() -> Self {
- Self { _phantom: PhantomData }
+ Self {
+ _phantom: PhantomData,
+ max_subsequence_len: usize::MAX,
+ min_subsequence_len: 0,
+ }
}
}
@@ 284,20 290,31 @@ where
type Chromosome = NodePermutation<D>;
fn perturb(&self, chromosome: &mut Self::Chromosome, rng: &mut dyn RngCore) {
- let first = rng.random_range(0..chromosome.permutation.len());
- let second = rng.random_range(0..chromosome.permutation.len());
-
- let start = first.min(second);
- let end = first.max(second);
+ let len = chromosome.permutation.len();
+ let index = rng.random_range(0..chromosome.permutation.len());
+ let subsequence_len = rng.random_range(
+ self.min_subsequence_len..(chromosome.permutation.len().min(self.max_subsequence_len))
+ );
// Reverse the subsequence between start and end (inclusive)
- let mut left = start;
- let mut right = end;
+ let mut left = index;
+ let mut right = (index + subsequence_len) % len;
- while left < right {
+ while left != right {
chromosome.permutation.swap_rows(left, right);
+
left += 1;
- right -= 1;
+ left %= len;
+
+ if left == right {
+ break;
+ }
+
+ if right > 0 {
+ right -= 1;
+ } else {
+ right = len - 1;
+ }
}
}
}