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