public void CompleteGeneration()
    {
        Generation <G, S> currentGeneration = generations[generationCount];

        currentGeneration.SerializeBest();

        // get fittest dnas & mean fitness
        List <DNA <G> > fittestDNAs = currentGeneration.GetFittestDNAs();

        generationWorstFitness  = currentGeneration.GetWorstFitness();
        generationMeanFitness   = currentGeneration.GetAverageFitness();
        generationBestFitness   = currentGeneration.GetBestFitness();
        generationMedianFitness = currentGeneration.GetMedianFitness();
        Debug.Log($"Mean Fit.: {generationMeanFitness}, Best Fit.: {generationBestFitness}");

        // cleanup
        currentGeneration.Cleanup();

        // keep fittest, procreate and mutate
        dNAs = procreation.BuildNextGeneration(fittestDNAs, generationSize, survivorKeepPercentage, mutationChance, mutationRate, autoProcreation);

        generationCount++;
    }