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
59
60
61
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
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
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
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
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
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 }