public CataclysmModule(PopulationInitialization initialization, int percentage, int epochs) { epochCount = 0; epochThreshold = epochs; Action = population => { if (epochCount++ != epochThreshold) { return; } epochCount = 0; int populationSize = population.Length; int eliminated = populationSize - populationSize * (100 - percentage) / 100; int[][] newIndividuals = initialization.InitializePopulation(population[0], populationSize, population[0][0]); var populationAfterCataclysm = population.Take(populationSize - eliminated).Concat(newIndividuals).ToArray(); for (int i = 0; i < populationSize; i++) { for (int j = 0; j < population[0].Length; j++) { population[i][j] = populationAfterCataclysm[i][j]; } } }; }
public static PopulationInitialization CreatePopulationInitialization(PopulationInitializationMethod method, Random random) { PopulationInitialization initialization = method switch { PopulationInitializationMethod.UniformInitialization => new UniformInitialization(random), PopulationInitializationMethod.NonUniformInitialization => new NonUniformInitialization(random), PopulationInitializationMethod.StandardPathInitialization => new StandardPathInitialization(random), PopulationInitializationMethod.PreferedCloseDistancePathInitialization => new PreferedCloseDistancePathInitialization(random), _ => throw new ArgumentException("Wrong population initialization method name") }; return(initialization); }