1 package net.bmahe.genetics4j.core.spec;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.Comparator;
6 import java.util.List;
7 import java.util.Optional;
8 import java.util.function.Function;
9 import java.util.function.Supplier;
10
11 import org.apache.commons.lang3.Validate;
12 import org.immutables.value.Value;
13
14 import net.bmahe.genetics4j.core.Genotype;
15 import net.bmahe.genetics4j.core.Population;
16 import net.bmahe.genetics4j.core.combination.AllCasesGenotypeCombinator;
17 import net.bmahe.genetics4j.core.combination.GenotypeCombinator;
18 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
19 import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
20 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
21 import net.bmahe.genetics4j.core.spec.replacement.Elitism;
22 import net.bmahe.genetics4j.core.spec.replacement.ReplacementStrategy;
23 import net.bmahe.genetics4j.core.spec.selection.SelectionPolicy;
24 import net.bmahe.genetics4j.core.spec.selection.Tournament;
25 import net.bmahe.genetics4j.core.termination.Termination;
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public abstract class AbstractEAConfiguration<T extends Comparable<T>> {
40
41
42
43 public static final double DEFAULT_OFFSPRING_RATIO = 1.0;
44
45
46
47
48 public static final Optimization DEFAULT_OPTIMIZATION = Optimization.MAXIMIZE;
49
50
51
52
53
54
55 public abstract List<ChromosomeSpec> chromosomeSpecs();
56
57
58
59
60
61
62
63 public abstract SelectionPolicy parentSelectionPolicy();
64
65
66
67
68
69
70 public abstract CombinationPolicy combinationPolicy();
71
72
73
74
75
76
77 public abstract List<MutationPolicy> mutationPolicies();
78
79
80
81
82
83
84
85
86
87
88
89
90
91 @Value.Default
92 public ReplacementStrategy replacementStrategy() {
93 final var replacementStrategyBuilder = Elitism.builder();
94
95 replacementStrategyBuilder.offspringRatio(Elitism.DEFAULT_OFFSPRING_RATIO)
96 .offspringSelectionPolicy(Tournament.of(3))
97 .survivorSelectionPolicy(Tournament.of(3));
98
99 return replacementStrategyBuilder.build();
100 }
101
102
103
104
105
106
107
108
109 public abstract Optional<Function<Population<T>, Population<T>>> postEvaluationProcessor();
110
111
112
113
114
115
116 public abstract Termination<T> termination();
117
118
119
120
121
122
123
124
125 public abstract Optional<Supplier<Genotype>> genotypeGenerator();
126
127
128
129
130
131
132 @Value.Default
133 public Collection<Genotype> seedPopulation() {
134 return Collections.emptyList();
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 @Value.Default
151 public GenotypeCombinator genotypeCombinator() {
152 return new AllCasesGenotypeCombinator();
153 }
154
155
156
157
158
159
160
161 @Value.Default
162 public double offspringGeneratedRatio() {
163 return DEFAULT_OFFSPRING_RATIO;
164 }
165
166
167
168
169
170
171
172 @Value.Default
173 public Optimization optimization() {
174 return DEFAULT_OPTIMIZATION;
175 }
176
177
178
179
180 @Value.Check
181 protected void check() {
182 Validate.isTrue(chromosomeSpecs().size() > 0, "No chromosomes were specified");
183 Validate.inclusiveBetween(0.0d, 1.0d, offspringGeneratedRatio());
184 }
185
186
187
188
189
190
191
192 public ChromosomeSpec getChromosomeSpec(final int index) {
193 Validate.isTrue(index >= 0);
194 Validate.isTrue(index < chromosomeSpecs().size());
195
196 return chromosomeSpecs().get(index);
197 }
198
199
200
201
202
203
204 public int numChromosomes() {
205 return chromosomeSpecs().size();
206 }
207
208
209
210
211
212
213 public Comparator<T> fitnessComparator() {
214
215 return switch (optimization()) {
216 case MAXIMIZE -> Comparator.naturalOrder();
217 case MINIMIZE -> Comparator.reverseOrder();
218 };
219 }
220 }