Here's the basic framework of a genetic algorithm.
N = population size
P = create parent population by randomly creating N individuals
while not done
C = create empty child population
while not enough individuals in C
parent1 = select parent ***** HERE IS WHERE YOU DO TOURNAMENT SELECTION *****
parent2 = select parent ***** HERE IS WHERE YOU DO TOURNAMENT SELECTION *****
child1, child2 = crossover(parent1, parent2)
mutate child1, child2
evaluate child1, child2 for fitness
insert child1, child2 into C
P = combine P and C somehow to get N new individuals
There's a little more to it than this basic skeleton, as there are things like crossover rates where you might not always do crossover, opportunities for additional operators, etc., but this is the basic idea at least.
Most often, the "while not enough individuals in C" can be thought of as "while size(C) < N"; that is, you want the same number of offspring as parents. There are plenty of other ways, but that's a good way to start at least. I'm not sure if this is what you mean by having 20% of the chromosomes in the next iteration or what, but for now, just go with it.
So then the question of how to do tournament selection can be addressed. Note that selection is only that one step of the process where we pick individuals out of the population to serve as parents of new offspring. To do so with tournament selection, you have to pick some number of possible parents, and then choose the best one as the winner. How many possible parents should be allowed to compete is the value of
k I mentioned earlier.
func tournament_selection(pop, k):
best = null
for i=1 to k
ind = pop[random(1, N)]
if (best == null) or fitness(ind) > fitness(best)
best = ind
k=1. Looking at the pseudocode, this yields purely random selection. You pick one individual at random and return it.
k=10*N. Now we have a pretty high probability of picking every member of the population at least once, so almost every time, we're going to end up returning the best individual in the population.
Neither of these options would work very well. Instead, you want something that returns good individuals more often than bad ones, but not so heavily that it keeps picking the same few individuals over and over again. Binary tournament selection (
k=2) is most often used.
In this basic framework, you can't end up with an empty population. You'll always have
N individuals in the population and you'll always generate
N offspring. At the end of each generation, you'll take those
2N individuals and prune them down to
N again. You can either throw all the parents away and just do
P = C (generational replacement), you can keep a few members of
P and replace the rest with members of
C (elitist replacement), you can merge them together and take the best
N of the
2N total (truncation replacement), or whatever other scheme you come up with.