1 package net.bmahe.genetics4j.core.selection;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.stream.Collectors;
6
7 import org.apache.commons.lang3.Validate;
8
9 import net.bmahe.genetics4j.core.Genotype;
10 import net.bmahe.genetics4j.core.Population;
11 import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
12 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
13 import net.bmahe.genetics4j.core.spec.selection.MultiSelections;
14 import net.bmahe.genetics4j.core.spec.selection.SelectionPolicy;
15
16 public class MultiSelectionsPolicyHandler<T extends Comparable<T>> implements SelectionPolicyHandler<T> {
17
18 public MultiSelectionsPolicyHandler() {
19 }
20
21 @Override
22 public boolean canHandle(final SelectionPolicy selectionPolicy) {
23 Objects.requireNonNull(selectionPolicy);
24 return selectionPolicy instanceof MultiSelections;
25 }
26
27 @Override
28 public Selector<T> resolve(final AbstractEAExecutionContext<T> eaExecutionContext,
29 final AbstractEAConfiguration<T> eaConfiguration,
30 final SelectionPolicyHandlerResolver<T> selectionPolicyHandlerResolver,
31 final SelectionPolicy selectionPolicy) {
32 Objects.requireNonNull(selectionPolicy);
33 Validate.isInstanceOf(MultiSelections.class, selectionPolicy);
34
35 final MultiSelections multiSelections = (MultiSelections) selectionPolicy;
36 final List<SelectionPolicy> selectionPolicies = multiSelections.selectionPolicies();
37 Validate.isTrue(selectionPolicies.isEmpty() == false);
38
39 final List<Selector<T>> selectors = selectionPolicies.stream().map(sp -> {
40
41 final SelectionPolicyHandler<T> spHandler = selectionPolicyHandlerResolver.resolve(sp);
42 return spHandler.resolve(eaExecutionContext, eaConfiguration, selectionPolicyHandlerResolver, sp);
43 }).collect(Collectors.toList());
44
45 return new Selector<>() {
46
47 @Override
48 public Population<T> select(final AbstractEAConfiguration<T> eaConfiguration, final long generation,
49 final int numIndividuals, final List<Genotype> population, final List<T> fitnessScore) {
50 final int incrementSelection = numIndividuals / selectors.size();
51
52 final Population<T> selectedIndividuals = new Population<>();
53 for (final Selector<T> selector : selectors) {
54 selectedIndividuals.addAll(
55 selector.select(eaConfiguration, generation, incrementSelection, population, fitnessScore));
56 }
57
58 int i = 0;
59 while (selectedIndividuals.size() < numIndividuals) {
60
61 selectedIndividuals.addAll(
62 selectors.get(i)
63 .select(eaConfiguration, generation, incrementSelection, population, fitnessScore));
64
65 i = (i + 1) % selectors.size();
66 }
67
68 return selectedIndividuals;
69 }
70 };
71 }
72 }