1 package net.bmahe.genetics4j.core.replacement;
2
3 import java.util.Comparator;
4 import java.util.List;
5 import java.util.Objects;
6 import java.util.stream.IntStream;
7
8 import org.apache.commons.lang3.Validate;
9
10 import net.bmahe.genetics4j.core.Genotype;
11 import net.bmahe.genetics4j.core.Population;
12 import net.bmahe.genetics4j.core.selection.Selector;
13 import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
14 import net.bmahe.genetics4j.core.spec.replacement.DeleteNLast;
15
16 public class DeleteNLastImpl<T extends Comparable<T>> implements ReplacementStrategyImplementor<T> {
17
18 private final DeleteNLast deleteNLastSpec;
19 private final Selector<T> offspringSelector;
20
21 public DeleteNLastImpl(final DeleteNLast _deleteNLastSpec, final Selector<T> _offspringSelector) {
22 Objects.requireNonNull(_deleteNLastSpec);
23 Objects.requireNonNull(_offspringSelector);
24
25 this.deleteNLastSpec = _deleteNLastSpec;
26 this.offspringSelector = _offspringSelector;
27 }
28
29 @Override
30 public Population<T> select(final AbstractEAConfiguration<T> eaConfiguration, final long generation,
31 final int numIndividuals, final List<Genotype> population, final List<T> populationScores,
32 final List<Genotype> offsprings, final List<T> offspringScores) {
33 Objects.requireNonNull(eaConfiguration);
34 Validate.isTrue(generation >= 0);
35 Validate.isTrue(numIndividuals > 0);
36 Objects.requireNonNull(population);
37 Objects.requireNonNull(populationScores);
38 Validate.isTrue(population.size() == populationScores.size());
39 Objects.requireNonNull(offsprings);
40 Objects.requireNonNull(offspringScores);
41 Validate.isTrue(offsprings.size() == offspringScores.size());
42
43 final Comparator<T> populationComparator = eaConfiguration.fitnessComparator();
44
45 final Population<T> selected = new Population<>();
46
47 final int weakestN = (int) (numIndividuals * deleteNLastSpec.weakRatio());
48
49 IntStream.range(0, populationScores.size())
50 .boxed()
51 .sorted((a, b) -> populationComparator.compare(populationScores.get(a), populationScores.get(b)))
52 .skip(weakestN)
53 .forEach(index -> {
54 selected.add(population.get(index), populationScores.get(index));
55 });
56
57 final Population<T> selectedOffspring = offspringSelector
58 .select(eaConfiguration, generation, weakestN, offsprings, offspringScores);
59 selected.addAll(selectedOffspring);
60
61 return selected;
62 }
63 }