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 }