private static void Main()
        {
            algorithm.NetworksToKeep      = NETWORKS_TO_KEEP;
            algorithm.MutationChance      = MUTATION_CHANCE;
            algorithm.MutationRate        = MUTATION_RATE;
            algorithm.RandomNetworkAmount = RANDOM_NETWORKS_PER_BREEDING;
            algorithm.PoolGenerator       = new FitnessBasedPoolGenerator();

            int generation = 0;

            while (true)
            {
                Dictionary <IWeightedNetwork, SnakeGame> networkAndSnakeGame = SetupAlgorithmDictionary();
                Task[] tasks   = new Task[networkAndSnakeGame.Count];
                int    counter = 0;

                foreach (KeyValuePair <IWeightedNetwork, SnakeGame> networkAndGame in networkAndSnakeGame)
                {
                    KeyValuePair <IWeightedNetwork, SnakeGame> currentNetworkAndGame = networkAndGame;
                    tasks[counter++] = Task.Factory.StartNew(
                        () => RunSnakeGame(currentNetworkAndGame)
                        , TaskCreationOptions.LongRunning);
                }
                Task.WaitAll(tasks);

                Console.SetCursorPosition(15, 5);
                Console.Write($"Generation: {generation}");

                algorithm.SortByFitness();

                double[] fitnesses = algorithm.GetFitnesses();
                for (int i = 0; i < 10; ++i)
                {
                    Console.SetCursorPosition(15, 7 + i);
                    Console.Write($"{i + 1}: {fitnesses[i].ToString().PadLeft(15)} ID: {algorithm.NetworksAndFitness.Where(x => x.Value == fitnesses[i]).Select(x => x.Key.ID).First()}");

                    Console.SetCursorPosition(15, 3);
                    Console.Write($"Average: {fitnesses.Average()}");
                }

                Console.SetCursorPosition(15, 17);
                Console.Write($"{fitnesses.Length}: {fitnesses.Min().ToString().PadLeft(15)} ID: {algorithm.NetworksAndFitness.Where(x => x.Value == fitnesses.LastOrDefault()).Select(x => x.Key.ID).First()}");

                if (generation % 10 == 0)
                {
                    ReplayWithBestNetwork();
                }

                algorithm.BreedBestNetworks();
                ++generation;
            }
        }