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