View Javadoc
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  }