1 package net.bmahe.genetics4j.core.spec.selection;
2
3 import java.util.Comparator;
4
5 import org.apache.commons.lang3.Validate;
6 import org.immutables.value.Value;
7
8 import net.bmahe.genetics4j.core.Individual;
9
10 @Value.Immutable
11 public abstract class Tournament<T extends Comparable<T>> implements SelectionPolicy {
12
13 @Value.Parameter
14 public abstract int numCandidates();
15
16 @Value.Default
17 public Comparator<Individual<T>> comparator() {
18 return Comparator.comparing(Individual::fitness);
19 }
20
21 public static class Builder<T extends Comparable<T>> extends ImmutableTournament.Builder<T> {
22 @Override
23 public Tournament<T> build() {
24 final Tournament<T> instance = super.build();
25 Validate.isTrue(instance.numCandidates() > 0, "Number of candidates must be positive");
26 return instance;
27 }
28 }
29
30 public static <U extends Comparable<U>> Tournament<U> of(final int numCandidates) {
31 Validate.isTrue(numCandidates > 0, "Number of candidates must be positive");
32 return ImmutableTournament.of(numCandidates);
33 }
34
35 public static <U extends Comparable<U>> Tournament<U> of(final int numCandidates,
36 final Comparator<Individual<U>> comparator) {
37 Validate.isTrue(numCandidates > 0, "Number of candidates must be positive");
38 return new Builder<U>().numCandidates(numCandidates).comparator(comparator).build();
39 }
40
41 }