Tournament.java
package net.bmahe.genetics4j.core.spec.selection;
import java.util.Comparator;
import org.apache.commons.lang3.Validate;
import org.immutables.value.Value;
import net.bmahe.genetics4j.core.Individual;
@Value.Immutable
public abstract class Tournament<T extends Comparable<T>> implements SelectionPolicy {
@Value.Parameter
public abstract int numCandidates();
@Value.Default
public Comparator<Individual<T>> comparator() {
return Comparator.comparing(Individual::fitness);
}
public static class Builder<T extends Comparable<T>> extends ImmutableTournament.Builder<T> {
@Override
public Tournament<T> build() {
final Tournament<T> instance = super.build();
Validate.isTrue(instance.numCandidates() > 0, "Number of candidates must be positive");
return instance;
}
}
public static <U extends Comparable<U>> Tournament<U> of(final int numCandidates) {
Validate.isTrue(numCandidates > 0, "Number of candidates must be positive");
return ImmutableTournament.of(numCandidates);
}
public static <U extends Comparable<U>> Tournament<U> of(final int numCandidates,
final Comparator<Individual<U>> comparator) {
Validate.isTrue(numCandidates > 0, "Number of candidates must be positive");
return new Builder<U>().numCandidates(numCandidates).comparator(comparator).build();
}
}