1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use algorithm::EvaluatedPopulation;
use genetic::{Fitness, Genotype, Offspring};
use operator::{GeneticOperator, MultiObjective, ReinsertionOp, SingleObjective};
use random::{Rng, random_index};
#[allow(missing_copy_implementations)]
#[derive(Clone, Debug, PartialEq)]
pub struct UniformReinserter {
replace_ratio: f64,
}
impl UniformReinserter {
pub fn new(replace_ratio: f64) -> Self {
UniformReinserter {
replace_ratio,
}
}
pub fn replace_ratio(&self) -> f64 {
self.replace_ratio
}
pub fn set_replace_ratio(&mut self, value: f64) {
self.replace_ratio = value;
}
}
impl GeneticOperator for UniformReinserter {
fn name() -> String {
"Uniform-Reinserter".to_string()
}
}
impl SingleObjective for UniformReinserter {}
impl MultiObjective for UniformReinserter {}
impl<G, F> ReinsertionOp<G, F> for UniformReinserter
where G: Genotype, F: Fitness
{
fn combine<R>(&self, offspring: &mut Offspring<G>, evaluated: &EvaluatedPopulation<G, F>,
rng: &mut R) -> Vec<G> where R: Rng + Sized {
let old_individuals = evaluated.individuals();
let population_size = old_individuals.len();
let mut new_population = Vec::with_capacity(population_size);
let num_offspring = (population_size as f64 * self.replace_ratio + 0.5).floor() as usize;
if num_offspring < offspring.len() {
while num_offspring > new_population.len() {
let index = random_index(rng, offspring.len());
new_population.push(offspring.remove(index));
}
} else {
let mut i = 0;
while i < offspring.len() {
new_population.push(offspring.remove(i));
i += 1;
}
}
let num_old_population = population_size - new_population.len();
for _ in 0..num_old_population {
let index = random_index(rng, old_individuals.len());
new_population.push(old_individuals[index].clone());
}
new_population
}
}