1 package net.bmahe.genetics4j.moo.nsga2.spec;
2
3 import java.util.Comparator;
4 import java.util.Optional;
5 import java.util.function.Function;
6
7 import org.immutables.value.Value;
8
9 import net.bmahe.genetics4j.core.Genotype;
10 import net.bmahe.genetics4j.core.spec.selection.SelectionPolicy;
11 import net.bmahe.genetics4j.moo.FitnessVector;
12 import net.bmahe.genetics4j.moo.ObjectiveDistance;
13
14
15
16
17
18
19
20
21
22
23 @Value.Immutable
24 public abstract class TournamentNSGA2Selection<T extends Comparable<T>> implements SelectionPolicy {
25
26
27
28
29
30
31 @Value.Parameter
32 public abstract int numberObjectives();
33
34
35
36
37
38
39
40
41
42 @Value.Default
43 public Comparator<T> dominance() {
44 return (a, b) -> a.compareTo(b);
45 }
46
47
48
49
50
51
52
53
54 @Value.Default
55 public Optional<Comparator<Genotype>> deduplicate() {
56 return Optional.empty();
57 }
58
59
60
61
62
63
64 @Value.Parameter
65 public abstract Function<Integer, Comparator<T>> objectiveComparator();
66
67
68
69
70
71
72 @Value.Parameter
73 public abstract ObjectiveDistance<T> distance();
74
75
76
77
78
79
80 @Value.Parameter
81 public abstract int numCandidates();
82
83 public static class Builder<T extends Comparable<T>> extends ImmutableTournamentNSGA2Selection.Builder<T> {
84 }
85
86 public static <U extends Comparable<U>> Builder<U> builder() {
87 return new Builder<U>();
88 }
89
90
91
92
93
94
95
96
97
98
99
100
101
102 public static <U extends Number & Comparable<U>> TournamentNSGA2Selection<FitnessVector<U>> ofFitnessVector(
103 final int numberObjectives, final int numberCandidates, final Comparator<Genotype> deduplicate) {
104
105 final var builder = new Builder<FitnessVector<U>>();
106
107 builder.objectiveComparator((m) -> (a, b) -> Double.compare(a.get(m).doubleValue(), b.get(m).doubleValue()))
108 .distance((a, b, m) -> Math.abs(b.get(m).doubleValue() - a.get(m).doubleValue()))
109 .numberObjectives(numberObjectives)
110 .numCandidates(numberCandidates)
111 .deduplicate(Optional.ofNullable(deduplicate));
112
113 return builder.build();
114 }
115
116
117
118
119
120
121
122
123
124
125
126 public static <U extends Number & Comparable<U>> TournamentNSGA2Selection<FitnessVector<U>>
127 ofFitnessVector(final int numberObjectives, final int numberCandidates) {
128
129 return ofFitnessVector(numberObjectives, numberCandidates, null);
130 }
131
132 }