Thanks all for the advice -- I ended up extending the NSGA2Breeder to keep
a record of the bred individuals so far and continue to produce individuals
until they were all unique. Indeed this doesn't work with more than one
breed thread, but this is a reasonable limitation as breeding is not a
significant component of the computational time for my workload anyway.

Ngā mihi,
Andrew Lensen

On Fri, 30 Nov 2018 at 15:58, Sean Luke <[log in to unmask]> wrote:

> > On Nov 29, 2018, at 6:58 PM, Andrew Lensen <[log in to unmask]>
> wrote:
> >
> > What is the most ECJ-esque way of going about ensuring that any
> individuals duplicated in a population by the breeder are removed? (using
> NSGA-II, if important). I see ECJ has a UniquePipeline, but this seems to
> stop the new population containing any of the individuals from the old
> population, not within the *same* population.
> Not exactly.  When asked to produce N individuls, UniquePipeline
> repeatedly generates individuals from its source until it has created N
> unique individuals (using a HashSet).
> So if you had a pipeline like this:
>         Mutate <- Crossover <- TournamentSelect
> You could modify it to look like this:
>         UniquePipeline <- Mutate <- Crossover <- TournamentSelect
> ... and it'd do what you want if you have only one breeding thread.  The
> reason is that SimpleBreeder will ask the top-level breeding pipeline to
> create the whole subpopulation's worth at one time.  Let's say that's N
> individuals.  So UniquePipeline will produce N unique individuals by
> repeatedly requesting and testing individuals from the Mutate pipeline.
> If you have multiple threads however, all you'll be able to guarantee is
> that *each thread*'s set of individuals will contain unique individuals,
> not that they're unique across all sets.
> I think UniquePipeline will likely do what you want, since NSGA-II's
> breeder uses the same core breeding mechanism as SimpleBreeder.
> Sean