How pairs of actual parents are formed from the mating pool in NSGA-II? I understand the general idea of how NSGA-II works, however even by reading the original article from Deb and al. (https://ieeexplore.ieee.org/document/996017), flow charts, and so on, I don't understand how the mating is actually performed after the tournament selection.
If I understand correctly, given an initial population P0 of size N, N pairs of randomly selected individuals are created for tournament selection (with or without replacement?). After ranking and selecting the best individual in each pairs, this creates N parents in the mating pool for breeding N children on which crossover and mutation will be applied.
My question is: how are the pairs of actual parents formed from the mating pool? also randomly like for tournament selection? or did I misunderstand a step somewhere?

You can pair them randomly from the pool of parents, but in practice, those two steps are usually combined. I don’t actually create a separate array of selected parents to operate on later. Something like this is typical.
for i=0 to n/2
    x1 = pick random individual
    x2 = pick random individual
    parent1 = better of x1 and x2

    x3 = pick random individual
    x4 = pick random individual
    parent2 = better of x3 and x4

    child1, child2 = crossover p1 and p2
    mutate child1 and child2

    add child1 and child2 to offspring population

You just pick the two winning parents and immediately recombine them, skipping the part where you save them in some temporary pool.
There could be algorithms that require that separate pool. If you wanted to do some processing before pairing them off, like maybe you want the two fittest parents to mate, then the next two, etc. Then you’d need to create the parent pool explicitly, sort it, and then do all your operators. But often you just want to pair them randomly, and they’re already coming out of tournament selection randomly, so this works.
