[lab5] Product and mutate operators
This commit is contained in:
parent
1f74d15cad
commit
177c11e67c
3
lab5/src/algo/mod.rs
Normal file
3
lab5/src/algo/mod.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
mod product;
|
||||||
|
mod mutate;
|
||||||
|
mod simulation;
|
||||||
8
lab5/src/algo/mutate.rs
Normal file
8
lab5/src/algo/mutate.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
use rand::Rng;
|
||||||
|
|
||||||
|
pub(super) fn mutate(g: &mut [usize], rng: &mut impl Rng) {
|
||||||
|
let swap_start = rng.random_range(0..(g.len() - 1));
|
||||||
|
let swap_end = rng.random_range(swap_start..g.len());
|
||||||
|
|
||||||
|
g.swap(swap_start, swap_end);
|
||||||
|
}
|
||||||
27
lab5/src/algo/product.rs
Normal file
27
lab5/src/algo/product.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
use rand::Rng;
|
||||||
|
use std::collections::HashSet;
|
||||||
|
/**
|
||||||
|
* OX (Order Crossover)
|
||||||
|
*/
|
||||||
|
pub(super) fn product(p1: &[usize], p2: &[usize], out: &mut [usize], rng: &mut impl Rng) {
|
||||||
|
assert_eq!(p1.len(), p2.len());
|
||||||
|
assert_eq!(p1.len(), out.len());
|
||||||
|
|
||||||
|
let split_start = rng.random_range(0..(p1.len() - 1));
|
||||||
|
let split_end = rng.random_range(split_start..p1.len());
|
||||||
|
|
||||||
|
let used: HashSet<usize> = p1[split_start..split_end].iter().map(|x| *x).collect();
|
||||||
|
for i in split_start..split_end {
|
||||||
|
out[i] = p1[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut j = split_end;
|
||||||
|
for i in 0..p2.len() {
|
||||||
|
let i = i % p2.len();
|
||||||
|
if used.contains(&p2[i]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out[j % out.len()] = p2[i];
|
||||||
|
j += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
0
lab5/src/algo/simulation.rs
Normal file
0
lab5/src/algo/simulation.rs
Normal file
@ -1 +1,3 @@
|
|||||||
|
mod algo;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
Loading…
Reference in New Issue
Block a user