View Javadoc
1   package net.bmahe.genetics4j.core.spec;
2   
3   import java.util.ArrayList;
4   import java.util.Arrays;
5   import java.util.Collections;
6   import java.util.List;
7   import java.util.ServiceLoader;
8   import java.util.random.RandomGenerator;
9   
10  import org.immutables.value.Value;
11  
12  import net.bmahe.genetics4j.core.chromosomes.Chromosome;
13  import net.bmahe.genetics4j.core.chromosomes.factory.ChromosomeFactoryProvider;
14  import net.bmahe.genetics4j.core.chromosomes.factory.ImmutableChromosomeFactoryProvider;
15  import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorHandler;
16  import net.bmahe.genetics4j.core.combination.PickFirstParentHandler;
17  import net.bmahe.genetics4j.core.combination.erx.EdgeRecombinationCrossoverHandler;
18  import net.bmahe.genetics4j.core.combination.multicombinations.MultiCombinationsHandler;
19  import net.bmahe.genetics4j.core.combination.multipointarithmetic.MultiPointArithmeticCombinationHandler;
20  import net.bmahe.genetics4j.core.combination.multipointcrossover.MultiPointCrossoverCombinationHandler;
21  import net.bmahe.genetics4j.core.combination.ordercrossover.IntOrderCrossoverHandler;
22  import net.bmahe.genetics4j.core.combination.singlepointarithmetic.SinglePointArithmeticCombinationHandler;
23  import net.bmahe.genetics4j.core.combination.singlepointcrossover.SinglePointCrossoverHandler;
24  import net.bmahe.genetics4j.core.evolutionlisteners.EvolutionListener;
25  import net.bmahe.genetics4j.core.mutation.CreepMutationPolicyHandler;
26  import net.bmahe.genetics4j.core.mutation.MultiMutationsPolicyHandler;
27  import net.bmahe.genetics4j.core.mutation.MutationPolicyHandler;
28  import net.bmahe.genetics4j.core.mutation.PartialMutationPolicyHandler;
29  import net.bmahe.genetics4j.core.mutation.RandomMutationPolicyHandler;
30  import net.bmahe.genetics4j.core.mutation.RepeatedMutationPolicyHandler;
31  import net.bmahe.genetics4j.core.mutation.SwapMutationPolicyHandler;
32  import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandler;
33  import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandlerFactory;
34  import net.bmahe.genetics4j.core.mutation.chromosome.creepmutation.DoubleChromosomeCreepMutationHandler;
35  import net.bmahe.genetics4j.core.mutation.chromosome.creepmutation.FloatChromosomeCreepMutationHandler;
36  import net.bmahe.genetics4j.core.mutation.chromosome.creepmutation.IntChromosomeCreepMutationHandler;
37  import net.bmahe.genetics4j.core.mutation.chromosome.randommutation.BitChromosomeRandomMutationHandler;
38  import net.bmahe.genetics4j.core.mutation.chromosome.randommutation.DoubleChromosomeRandomMutationHandler;
39  import net.bmahe.genetics4j.core.mutation.chromosome.randommutation.FloatChromosomeRandomMutationHandler;
40  import net.bmahe.genetics4j.core.mutation.chromosome.randommutation.IntChromosomeRandomMutationHandler;
41  import net.bmahe.genetics4j.core.mutation.chromosome.swapmutation.BitChromosomeSwapMutationHandler;
42  import net.bmahe.genetics4j.core.mutation.chromosome.swapmutation.DoubleChromosomeSwapMutationHandler;
43  import net.bmahe.genetics4j.core.mutation.chromosome.swapmutation.FloatChromosomeSwapMutationHandler;
44  import net.bmahe.genetics4j.core.mutation.chromosome.swapmutation.IntChromosomeSwapMutationHandler;
45  import net.bmahe.genetics4j.core.replacement.ElitismReplacementStrategyHandler;
46  import net.bmahe.genetics4j.core.replacement.GenerationalReplacementStrategyHandler;
47  import net.bmahe.genetics4j.core.replacement.ReplacementStrategyHandler;
48  import net.bmahe.genetics4j.core.selection.MultiSelectionsPolicyHandler;
49  import net.bmahe.genetics4j.core.selection.MultiTournamentsSelectionPolicyHandler;
50  import net.bmahe.genetics4j.core.selection.ProportionalTournamentSelectionPolicyHandler;
51  import net.bmahe.genetics4j.core.selection.RandomSelectionPolicyHandler;
52  import net.bmahe.genetics4j.core.selection.SelectAllPolicyHandler;
53  import net.bmahe.genetics4j.core.selection.SelectionPolicyHandler;
54  import net.bmahe.genetics4j.core.selection.SelectiveRefinementTournamentPolicyHandler;
55  import net.bmahe.genetics4j.core.selection.TournamentSelectionPolicyHandler;
56  
57  /**
58   * Evolutionary Algorithm - Execution Context
59   * <p>This defines how the Evolutionary Algorithm will be executed.
60   *
61   * @param <T> Type of the fitness measurement
62   */
63  public abstract class AbstractEAExecutionContext<T extends Comparable<T>> {
64  	public static final int DEFAULT_POPULATION_SIZE = 100;
65  
66  	@Value.Default
67  	public List<ChromosomeCombinatorHandler<T>> defaultChromosomeCombinatorHandlers() {
68  		return Arrays.asList(
69  				new MultiCombinationsHandler<T>(randomGenerator()),
70  					new IntOrderCrossoverHandler<T>(randomGenerator()),
71  					new MultiPointCrossoverCombinationHandler<T>(randomGenerator()),
72  					new MultiPointArithmeticCombinationHandler<T>(randomGenerator()),
73  					new SinglePointCrossoverHandler<T>(randomGenerator()),
74  					new SinglePointArithmeticCombinationHandler<T>(randomGenerator()),
75  					new EdgeRecombinationCrossoverHandler<T>(randomGenerator()),
76  					new PickFirstParentHandler<T>());
77  	}
78  
79  	public abstract List<ChromosomeCombinatorHandlerFactory<T>> chromosomeCombinatorHandlerFactories();
80  
81  	@SuppressWarnings("unchecked")
82  	@Value.Derived
83  	public List<ChromosomeCombinatorHandler<T>> chromosomeCombinatorHandlers() {
84  
85  		final List<ChromosomeCombinatorHandler<T>> chromosomeCombinatorHandlers = new ArrayList<>();
86  
87  		final List<ChromosomeCombinatorHandler<T>> defaultChromosomeCombinatorHandlers = defaultChromosomeCombinatorHandlers();
88  		if (defaultChromosomeCombinatorHandlers.isEmpty() == false) {
89  			chromosomeCombinatorHandlers.addAll(defaultChromosomeCombinatorHandlers);
90  		}
91  
92  		chromosomeCombinatorHandlerFactories().stream()
93  				.map(factory -> factory.apply(this))
94  				.forEach(cch -> chromosomeCombinatorHandlers.add(cch));
95  
96  		@SuppressWarnings("rawtypes")
97  		final ServiceLoader<ChromosomeCombinatorHandlerFactory> serviceLoader = ServiceLoader
98  				.load(ChromosomeCombinatorHandlerFactory.class);
99  
100 		serviceLoader.stream()
101 				.map(ServiceLoader.Provider::get)
102 				.map(factory -> (ChromosomeCombinatorHandler<T>) factory.apply(this))
103 				.forEach(cch -> chromosomeCombinatorHandlers.add(cch));
104 
105 		return Collections.unmodifiableList(chromosomeCombinatorHandlers);
106 	}
107 
108 	/////////////////////////////////////////
109 
110 	/**
111 	 * Default list of SelectionPolicyHandler
112 	 */
113 	@Value.Default
114 	public List<SelectionPolicyHandler<T>> defaultSelectionPolicyHandlers() {
115 		return Arrays.asList(
116 				new RandomSelectionPolicyHandler<T>(randomGenerator()),
117 					new TournamentSelectionPolicyHandler<T>(randomGenerator()),
118 					new ProportionalTournamentSelectionPolicyHandler<T>(randomGenerator()),
119 					new MultiTournamentsSelectionPolicyHandler<T>(randomGenerator()),
120 					new MultiSelectionsPolicyHandler<T>(),
121 					new SelectAllPolicyHandler<T>(),
122 					new SelectiveRefinementTournamentPolicyHandler<T>(randomGenerator()));
123 	}
124 
125 	public abstract List<SelectionPolicyHandlerFactory<T>> selectionPolicyHandlerFactories();
126 
127 	@SuppressWarnings("unchecked")
128 	@Value.Derived
129 	public List<SelectionPolicyHandler<T>> selectionPolicyHandlers() {
130 
131 		final List<SelectionPolicyHandler<T>> selectionPolicyHandlers = new ArrayList<>();
132 
133 		final List<SelectionPolicyHandler<T>> defaultSelectionPolicyHandlers = defaultSelectionPolicyHandlers();
134 		if (defaultSelectionPolicyHandlers.isEmpty() == false) {
135 			selectionPolicyHandlers.addAll(defaultSelectionPolicyHandlers);
136 		}
137 
138 		selectionPolicyHandlerFactories().stream()
139 				.map(factory -> factory.apply(this))
140 				.forEach(sph -> selectionPolicyHandlers.add(sph));
141 
142 		@SuppressWarnings("rawtypes")
143 		final ServiceLoader<SelectionPolicyHandlerFactory> serviceLoader = ServiceLoader
144 				.load(SelectionPolicyHandlerFactory.class);
145 
146 		serviceLoader.stream()
147 				.map(ServiceLoader.Provider::get)
148 				.map(factory -> (SelectionPolicyHandler<T>) factory.apply(this))
149 				.forEach(cch -> selectionPolicyHandlers.add(cch));
150 
151 		return Collections.unmodifiableList(selectionPolicyHandlers);
152 	}
153 
154 	/////////////////////////////////////////
155 
156 	/**
157 	 * Default list for MutationPolicyHandler
158 	 */
159 	@Value.Default
160 	public List<MutationPolicyHandler<T>> defaultMutationPolicyHandlers() {
161 		return Arrays.asList(
162 				new RandomMutationPolicyHandler<>(randomGenerator()),
163 					new SwapMutationPolicyHandler<>(randomGenerator()),
164 					new MultiMutationsPolicyHandler<>(randomGenerator()),
165 					new PartialMutationPolicyHandler<>(),
166 					new RepeatedMutationPolicyHandler<>(randomGenerator()),
167 					new CreepMutationPolicyHandler<T>(randomGenerator()));
168 	}
169 
170 	public abstract List<MutationPolicyHandlerFactory<T>> mutationPolicyHandlerFactories();
171 
172 	@SuppressWarnings("unchecked")
173 	@Value.Derived
174 	public List<MutationPolicyHandler<T>> mutationPolicyHandlers() {
175 
176 		final List<MutationPolicyHandler<T>> mutationPolicyHandlers = new ArrayList<>();
177 
178 		final List<MutationPolicyHandler<T>> defaultMutationPolicyHandlers = defaultMutationPolicyHandlers();
179 		if (defaultMutationPolicyHandlers.isEmpty() == false) {
180 			mutationPolicyHandlers.addAll(defaultMutationPolicyHandlers);
181 		}
182 
183 		mutationPolicyHandlerFactories().stream()
184 				.map(factory -> factory.apply(this))
185 				.forEach(mph -> mutationPolicyHandlers.add(mph));
186 
187 		@SuppressWarnings("rawtypes")
188 		final ServiceLoader<MutationPolicyHandlerFactory> serviceLoader = ServiceLoader
189 				.load(MutationPolicyHandlerFactory.class);
190 
191 		serviceLoader.stream()
192 				.map(ServiceLoader.Provider::get)
193 				.map(factory -> (MutationPolicyHandler<T>) factory.apply(this))
194 				.forEach(cch -> mutationPolicyHandlers.add(cch));
195 
196 		return Collections.unmodifiableList(mutationPolicyHandlers);
197 	}
198 
199 	/////////////////////////////////////////
200 
201 	/**
202 	 * Default list of ChromosomeMutationPolicyHandler
203 	 */
204 	@Value.Default
205 	public List<ChromosomeMutationHandler<? extends Chromosome>> defaultChromosomeMutationPolicyHandlers() {
206 		return Arrays.asList(
207 				new BitChromosomeRandomMutationHandler(randomGenerator()),
208 					new IntChromosomeRandomMutationHandler(randomGenerator()),
209 					new DoubleChromosomeRandomMutationHandler(randomGenerator()),
210 					new FloatChromosomeRandomMutationHandler(randomGenerator()),
211 					new BitChromosomeSwapMutationHandler(randomGenerator()),
212 					new IntChromosomeSwapMutationHandler(randomGenerator()),
213 					new DoubleChromosomeSwapMutationHandler(randomGenerator()),
214 					new FloatChromosomeSwapMutationHandler(randomGenerator()),
215 					new IntChromosomeCreepMutationHandler(randomGenerator()),
216 					new DoubleChromosomeCreepMutationHandler(randomGenerator()),
217 					new FloatChromosomeCreepMutationHandler(randomGenerator()));
218 	}
219 
220 	public abstract List<ChromosomeMutationHandlerFactory<T>> chromosomeMutationPolicyHandlerFactories();
221 
222 	@SuppressWarnings("unchecked")
223 	@Value.Derived
224 	public List<ChromosomeMutationHandler<? extends Chromosome>> chromosomeMutationPolicyHandlers() {
225 
226 		final List<ChromosomeMutationHandler<? extends Chromosome>> chromosomeMutationPolicyHandlers = new ArrayList<>();
227 
228 		final List<ChromosomeMutationHandler<? extends Chromosome>> defaultChromosomeMutationPolicyHandlers = defaultChromosomeMutationPolicyHandlers();
229 		if (defaultChromosomeMutationPolicyHandlers.isEmpty() == false) {
230 			chromosomeMutationPolicyHandlers.addAll(defaultChromosomeMutationPolicyHandlers);
231 		}
232 
233 		chromosomeMutationPolicyHandlerFactories().stream()
234 				.map(factory -> factory.apply(this))
235 				.forEach(cmh -> chromosomeMutationPolicyHandlers.add(cmh));
236 
237 		@SuppressWarnings("rawtypes")
238 		final ServiceLoader<ChromosomeMutationHandlerFactory> serviceLoader = ServiceLoader
239 				.load(ChromosomeMutationHandlerFactory.class);
240 
241 		serviceLoader.stream()
242 				.map(ServiceLoader.Provider::get)
243 				.map(factory -> (ChromosomeMutationHandler<? extends Chromosome>) factory.apply(this))
244 				.forEach(cch -> chromosomeMutationPolicyHandlers.add(cch));
245 
246 		return Collections.unmodifiableList(chromosomeMutationPolicyHandlers);
247 	}
248 
249 	/////////////////////////////////////////
250 
251 	/**
252 	 * Default list of ReplacementStrategyHandler
253 	 */
254 	@Value.Default
255 	public List<ReplacementStrategyHandler<T>> defaultReplacementStrategyHandlers() {
256 		return List.of(new ElitismReplacementStrategyHandler<>(), new GenerationalReplacementStrategyHandler<>());
257 	}
258 
259 	public abstract List<ReplacementStrategyHandlerFactory<T>> replacementStrategyHandlerFactories();
260 
261 	@SuppressWarnings("unchecked")
262 	@Value.Derived
263 	public List<ReplacementStrategyHandler<T>> replacementStrategyHandlers() {
264 		final List<ReplacementStrategyHandler<T>> replacementStrategyHandlers = new ArrayList<>();
265 
266 		final List<ReplacementStrategyHandler<T>> defaultReplacementStrategyHandlers = defaultReplacementStrategyHandlers();
267 		if (defaultReplacementStrategyHandlers.isEmpty() == false) {
268 			replacementStrategyHandlers.addAll(defaultReplacementStrategyHandlers);
269 		}
270 
271 		replacementStrategyHandlerFactories().stream()
272 				.map(factory -> factory.apply(this))
273 				.forEach(esh -> replacementStrategyHandlers.add(esh));
274 
275 		@SuppressWarnings("rawtypes")
276 		final ServiceLoader<ReplacementStrategyHandlerFactory> serviceLoader = ServiceLoader
277 				.load(ReplacementStrategyHandlerFactory.class);
278 
279 		serviceLoader.stream()
280 				.map(ServiceLoader.Provider::get)
281 				.map(factory -> (ReplacementStrategyHandler<T>) factory.apply(this))
282 				.forEach(cch -> replacementStrategyHandlers.add(cch));
283 
284 		return Collections.unmodifiableList(replacementStrategyHandlers);
285 	}
286 
287 	/////////////////////////////////////////
288 
289 	/**
290 	 * Default Random Generator
291 	 */
292 	@Value.Default
293 	public RandomGenerator randomGenerator() {
294 		return RandomGenerator.getDefault();
295 	}
296 
297 	@Value.Default
298 	public int populationSize() {
299 		return DEFAULT_POPULATION_SIZE;
300 	}
301 
302 	@Value.Default
303 	public ChromosomeFactoryProvider chromosomeFactoryProvider() {
304 		return ImmutableChromosomeFactoryProvider.builder().randomGenerator(randomGenerator()).build();
305 	}
306 
307 	@Value.Default
308 	public List<EvolutionListener<T>> evolutionListeners() {
309 		return Collections.emptyList();
310 	}
311 }