public Population Evolve(Population population)
        {
            population.EncodedProblems = population.GetOrderByMostProfitable();

            var elitePopulation = population.EncodedProblems.Take(EliteSize).ToList();
            var nonElitePopulation = population.EncodedProblems.Skip(EliteSize).Take(NonEliteSize).ToList();

            var evolvedPopulation = new Population(elitePopulation);

            while (evolvedPopulation.CurrentPopulationSize() < PopulationSize)
                evolvedPopulation.EncodedProblems.Add(Mate(GetRandomItem(elitePopulation), GetRandomItem(nonElitePopulation)));

            Generation++;

            return evolvedPopulation;
        }
        public Population Generate()
        {
            var population = new Population();

            var randomGenerator = new Random();
            for (var index = 0; index < PopulationSize; index++)
            {
                EncodedSolution encodedSolution;
                do
                {
                    var randomVector = GenerateRandomVector(AmountOfDestinations, randomGenerator.Next());
                    encodedSolution = new EncodedSolution(ProblemDecoder, randomVector);
                } while (population.EncodedProblems.Any(ep => ep.IsEquivalenteTo(encodedSolution)));

                population.EncodedProblems.Add(encodedSolution);
            }

            return population;
        }