public void Run(int generations, double crossoverProbability, double mutationProbability, int populationSize) { _simulationParameters.Items = PickItemsGreedy(); var initialPopulation = InitializePopulation(populationSize).ToList(); initialPopulation = _evaluator.EvaluatePopulation(initialPopulation, _simulationParameters).ToList(); _logger.Log(0, initialPopulation); for (var i = 0; i < generations; i++) { var currentPopulation = _selector.SelectIndividuals(initialPopulation).ToList(); currentPopulation.AddRange(_breeder.CrossOver(currentPopulation, crossoverProbability)); if (currentPopulation.Count != populationSize) { currentPopulation = FixPopulation(currentPopulation, populationSize).ToList(); } currentPopulation = currentPopulation .Select(s => _mutator .MutateIndividualOrNot(s, mutationProbability)) .ToList(); currentPopulation = _evaluator.EvaluatePopulation(currentPopulation, _simulationParameters).ToList(); initialPopulation = currentPopulation; _logger.Log(i + 1, currentPopulation); } }