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