@Override
	public ISeq<Phenotype<G, C>> select(
		final Seq<Phenotype<G, C>> population,
		final int count,
		final Optimize opt
	) {
		final var random = RandomRegistry.random();

		final CrowdedComparator<Phenotype<G, C>> cc = new CrowdedComparator<>(
			population,
			opt,
			_dominance,
			_comparator,
			_distance,
			_dimension
		);

		final List<Phenotype<G, C>> S = new ArrayList<>();
		while (S.size() < count) {
			final int k = min(2*count - S.size(), population.size());
			final int[] G = Subsets.next(random, population.size(), k);

			for (int j = 0; j < G.length - 1 && S.size() < count; j += 2) {
				final int cmp = cc.compare(G[j], G[j + 1]);
				final int p;
				if (cmp > 0) {
					p = G[j];
				} else if (cmp < 0) {
					p = G[j + 1];
				} else {
					p = random.nextBoolean() ? G[j] : G[j + 1];
				}

				final C fitness = population.get(p).fitness();
				final List<Phenotype<G, C>> list = population.stream()
					.filter(pt -> pt.fitness().equals(fitness))
					.toList();

				S.add(list.get(random.nextInt(list.size())));
			}
		}

		return ISeq.of(S);
	}
Creates a new {@code UFTournamentSelector} with the functions needed for
handling the multi-objective result type {@code C}. For the {@link Vec}
classes, a selector is created like in the following example:
{@snippet lang="java":
new UFTournamentSelector<>(
    Vec<T>::dominance,
    Vec<T>::compare,
    Vec<T>::distance,
    Vec<T>::length
);
}

@see #ofVec()

@param dominance the pareto dominance comparator
@param comparator the vector element comparator
@param distance the vector element distance
@param dimension the dimensionality of vector type {@code C}
jenetics.ext/src/main/java/io/jenetics/ext/moea/UFTournamentSelector.java