/// <summary> /// Konstruktor inicjalizujący parametry algorytmu /// </summary> /// <param name="populationSize">Rozmiar populacji</param> /// <param name="numberOfGenerations">Ilość Generacji</param> /// <param name="mutationRate">współczynnik mutacji</param> /// <param name="reproductionRate">Współczynnik reprodukcji</param> /// <param name="crossoverRate">Współczynnik krzyżowania</param> /// <param name="genotypeSize">Ilość wymiarów badanej funkcji</param> /// <param name="tournamentSize">Wielkość turnieju</param> /// <param name="eliteSize">Wielkość elity</param> /// <param name="function">Delegat wskazujący na badaną funkcję</param> public GeneticAlgorithm(int populationSize, int numberOfGenerations, float mutationRate, float reproductionRate, float crossoverRate, int genotypeSize, int tournamentSize, int eliteSize, FunctionToOptimize function) { if (function == null) throw new ArgumentNullException("Function can't be null"); if (populationSize % 2 != 0) throw new ArgumentException("population size must be even"); if (eliteSize > populationSize / 2) throw new ArgumentOutOfRangeException("eliteSize is too big. must be less than populationSize/2"); if (mutationRate >= 1.0 || mutationRate <= 0) throw new ArgumentOutOfRangeException("mutationRate must be between 0 and 1"); if (reproductionRate >= 1.0 || reproductionRate <= 0) throw new ArgumentOutOfRangeException("reproductionRate must be between 0 and 1"); if (crossoverRate >= 1.0 || crossoverRate <= 0) throw new ArgumentOutOfRangeException("crossoverRate must be between 0 and 1"); PopulationSize = populationSize; NumberOfGenerations = numberOfGenerations; MutationRate = mutationRate; ReproductionRate = reproductionRate; CrossoverRate = crossoverRate; GenotypeSize = genotypeSize; TournamentSize = tournamentSize; EliteSize = eliteSize; EvaluateFunction = function; //tworzenie nowego generatora pseudolosowego z nowym ziarnem(konstruktor domyślny bierze pod uwagę aktualną datę random = new Random(); }
public EvolutionStrategy( int mu, int lambda, int numberOfGenerations, float mutationRate, float crossoverRate, int genotypeSize, FunctionToOptimize function) { if (mu % 2 != 0) { throw new ArgumentException("Population size must be even!"); } if (lambda % 2 != 0) { throw new ArgumentException("Next population size must be even!"); } if (mutationRate >= 1.0 || mutationRate <= 0) { throw new ArgumentOutOfRangeException("mutationRate must be between 0 and 1"); } if (crossoverRate >= 1.0 || crossoverRate <= 0) { throw new ArgumentOutOfRangeException("crossoverRate must be between 0 and 1"); } PopulationSize = mu; LambdaPopulationSize = lambda; NumberOfGenerations = numberOfGenerations; MutationRate = mutationRate; CrossoverRate = crossoverRate; GenotypeSize = genotypeSize; EvaluateFunction = function; Random = new Random(); }
public EvolutionStrategy( int mu, int lambda, int numberOfGenerations, float mutationRate, float crossoverRate, int genotypeSize, FunctionToOptimize function ) { if (mu % 2 != 0) throw new ArgumentException("Population size must be even!"); if (lambda % 2 != 0) throw new ArgumentException("Next population size must be even!"); if (mutationRate >= 1.0 || mutationRate <= 0) throw new ArgumentOutOfRangeException("mutationRate must be between 0 and 1"); if (crossoverRate >= 1.0 || crossoverRate <= 0) throw new ArgumentOutOfRangeException("crossoverRate must be between 0 and 1"); PopulationSize = mu; LambdaPopulationSize = lambda; NumberOfGenerations = numberOfGenerations; MutationRate = mutationRate; CrossoverRate = crossoverRate; GenotypeSize = genotypeSize; EvaluateFunction = function; Random = new Random(); }
static void Main(string[] args) { int mu = 70; //liczba osobnikow w populacji P, parametr μ, mu int lambda = 230; // liczba osobnikow w populacji O, parametr sigma int generationSize = 250; //liczba mozliwych generacji populacji int genotypeSize = 2; //rozmiar genotypu, ilość wymiarów funkcji float mutationRate = 0.8F; //współczynnik mutacji float crossoverRate = 0.8F; //wspołczynnik krzyżowania var argsCount = args.Count(); if (argsCount >= 1) { if (args[0] == "-help") { Console.WriteLine("#### Optimization of Rosenbrock function. Enjoy! ####"); Console.WriteLine("Please use space between your parameters."); Console.WriteLine("1. Size of population (μ parameter)"); Console.WriteLine("2. Size of next population (lambda parameter)"); Console.WriteLine("3. Size of generation"); Console.WriteLine("4. Size of genotype"); Console.WriteLine("5. Mutation rate <0,1>"); Console.WriteLine("6. Crossover rate <0,1>"); return; } else if (argsCount > 6 || argsCount < 0) { Console.WriteLine("Wrong q-ty of given parameters. Type -help to see help msg."); return; } else { mu = Convert.ToInt32(args[0]); lambda = Convert.ToInt32(args[1]); generationSize = Convert.ToInt32(args[2]); genotypeSize = Convert.ToInt32(args[3]); mutationRate = Convert.ToSingle(args[4]); crossoverRate = Convert.ToSingle(args[5]); } } Console.WriteLine("Start #Rosenbrock function optymalization. Use standard values...."); //zmienne tymczasowe var function = new FunctionToOptimize(Function); var BestGenotypes = new List<double>(); Console.WriteLine("Otrzymalem dane: "); Console.WriteLine("1. Rozmiar pierwszej populacji (mu): " + mu); Console.WriteLine("2. Rozmiar populacji potomków (sigma): " + lambda); Console.WriteLine("3. Liczba generacji: " + generationSize); Console.WriteLine("4. Prawdopodobieństwo mutacji <0,1>: " + mutationRate); Console.WriteLine("5. Prawdopodobieństwo krzyżowania: " + crossoverRate); Console.WriteLine("6. Rozmiar genotypu (argumentów funkcji): " + genotypeSize); var algorithm = new EvolutionStrategy(mu, lambda, generationSize, mutationRate, crossoverRate, genotypeSize, function); Program.results.WriteLine("Data: {0} Parametry: mu: {1} lambda: {2}", DateTime.Now.ToString("yyyy-MM-dd HH_mm_ss"), mu, lambda); //wykonanie algorytmu dokladnie 10 razy for (int i = 1; i <= 10; i++) { Console.WriteLine(); Console.WriteLine("Iteracja numer: " + i); Program.results.WriteLine("Iteracja numer: {0}. Poniżej najlepsze genotypy", i); algorithm.Run(); Program.results.WriteLine(" BEST: {0}", algorithm.BestGenotype.Min().ToString("0.000000000")); Console.WriteLine("\t\tBEST: {0}", algorithm.BestGenotype.Min().ToString("0.000000000")); BestGenotypes.Add(algorithm.BestGenotype.Min()); } Program.results.WriteLine("KONIEC: Najgorszy: {0}", BestGenotypes.Max().ToString("0.000000000")); Program.results.WriteLine("KONIEC: Średni: {0}", BestGenotypes.Average().ToString("0.000000000")); Program.results.WriteLine("KONIEC: Najlepszy: {0}", BestGenotypes.Min().ToString("0.000000000")); //zamkniecie pliku results.WriteLine(); results.Close(); }
static void Main(string[] args) { // domyślne parametry int populationSize = 100; int numberOfGenerations = 1000; float mutationRate = 0.8F; float reproductionRate = 0.8F; float crossoverRate = 0.8F; int genotypeSize = 2; int tournamentSize = 10; int eliteSize = 20; // czytanie parametrów podanych przy wywołaniu var argsCount = args.Count(); if (argsCount >= 1) { if (args[0] == "-help") { Console.WriteLine("Parametry do podania nalezy podawać po kolei oddzielone spacjami"); Console.WriteLine("1. rozmiar populacji integer"); Console.WriteLine("2. ilość generacji integer"); Console.WriteLine("3. prawdopodobieństwo mutacji float np. 0,8"); Console.WriteLine("4. prawdopodobieństwo reprodukcji float"); Console.WriteLine("5. prawdopodobieństwo krzyżowania float"); Console.WriteLine("6. rozmiar genotypu (ilość wymiarów funkcji) integer"); Console.WriteLine("7. Wielkość turnieju integer"); Console.WriteLine("8. Wielkość elity integer"); return; } else if (argsCount != 8) { Console.WriteLine("nie prawidłowa ilość parametrów. skorzystaj z opcji -help"); return; } else { populationSize = Convert.ToInt32(args[0]); numberOfGenerations = Convert.ToInt32(args[1]); mutationRate = Convert.ToSingle(args[2]); reproductionRate = Convert.ToSingle(args[3]); crossoverRate = Convert.ToSingle(args[4]); genotypeSize = Convert.ToInt32(args[5]); tournamentSize = Convert.ToInt32(args[6]); eliteSize = Convert.ToInt32(args[7]); } } // zmienne tymczasowe var function = new FunctionToOptimize(Function); var bestGenotypes = new List<Genotype>(); var bestGenotypesGeneration = new List<int>(); // wykonanie algorytmu dziesięciokrotnie for (int i = 0; i < 10; i++) { var algorithm = new GeneticAlgorithm(populationSize, numberOfGenerations, mutationRate, reproductionRate, crossoverRate, genotypeSize, tournamentSize, eliteSize, function); algorithm.Run(); // zapis najlepszych osobników bestGenotypes.Add(algorithm.BestGenotype); bestGenotypesGeneration.Add(algorithm.BestGenotypeGeneration); } // zapis do pliku FileStream fs = new FileStream(DateTime.Now.ToString("HH_mm_ss") + ".csv", FileMode.Create); StreamWriter sw = new StreamWriter(fs); Console.SetOut(sw); Console.WriteLine("Generacja najlepszego Genotypu; Wartość najlepszego Genotypu;"); for (int i = 0; i < 10; i++) { Console.WriteLine("{0};{1}", bestGenotypesGeneration[i], bestGenotypes[i].FunctionValue.ToString("0.000000000")); } Console.WriteLine("Średnia wartość;Nalepsza wartość;Najgorsza wartość"); Console.WriteLine("{0};{1};{2}", bestGenotypes.Average(g => g.FunctionValue), bestGenotypes.Min(g => g.FunctionValue), bestGenotypes.Max(g => g.FunctionValue)); Console.WriteLine("Średnia ilość epok;Nalepsza ilość epok;Najgorsza ilość epok"); Console.WriteLine("{0};{1};{2}", bestGenotypesGeneration.Average(), bestGenotypesGeneration.Min(), bestGenotypesGeneration.Max()); sw.Flush(); fs.Flush(true); fs.Close(); }
static void Main(string[] args) { int mu = 70; //liczba osobnikow w populacji P, parametr μ, mu int lambda = 230; // liczba osobnikow w populacji O, parametr sigma int generationSize = 250; //liczba mozliwych generacji populacji int genotypeSize = 2; //rozmiar genotypu, ilość wymiarów funkcji float mutationRate = 0.8F; //współczynnik mutacji float crossoverRate = 0.8F; //wspołczynnik krzyżowania var argsCount = args.Count(); if (argsCount >= 1) { if (args[0] == "-help") { Console.WriteLine("#### Optimization of Rosenbrock function. Enjoy! ####"); Console.WriteLine("Please use space between your parameters."); Console.WriteLine("1. Size of population (μ parameter)"); Console.WriteLine("2. Size of next population (lambda parameter)"); Console.WriteLine("3. Size of generation"); Console.WriteLine("4. Size of genotype"); Console.WriteLine("5. Mutation rate <0,1>"); Console.WriteLine("6. Crossover rate <0,1>"); return; } else if (argsCount > 6 || argsCount < 0) { Console.WriteLine("Wrong q-ty of given parameters. Type -help to see help msg."); return; } else { mu = Convert.ToInt32(args[0]); lambda = Convert.ToInt32(args[1]); generationSize = Convert.ToInt32(args[2]); genotypeSize = Convert.ToInt32(args[3]); mutationRate = Convert.ToSingle(args[4]); crossoverRate = Convert.ToSingle(args[5]); } } Console.WriteLine("Start #Rosenbrock function optymalization. Use standard values...."); //zmienne tymczasowe var function = new FunctionToOptimize(Function); var BestGenotypes = new List <double>(); Console.WriteLine("Otrzymalem dane: "); Console.WriteLine("1. Rozmiar pierwszej populacji (mu): " + mu); Console.WriteLine("2. Rozmiar populacji potomków (sigma): " + lambda); Console.WriteLine("3. Liczba generacji: " + generationSize); Console.WriteLine("4. Prawdopodobieństwo mutacji <0,1>: " + mutationRate); Console.WriteLine("5. Prawdopodobieństwo krzyżowania: " + crossoverRate); Console.WriteLine("6. Rozmiar genotypu (argumentów funkcji): " + genotypeSize); var algorithm = new EvolutionStrategy(mu, lambda, generationSize, mutationRate, crossoverRate, genotypeSize, function); Program.results.WriteLine("Data: {0} Parametry: mu: {1} lambda: {2}", DateTime.Now.ToString("yyyy-MM-dd HH_mm_ss"), mu, lambda); //wykonanie algorytmu dokladnie 10 razy for (int i = 1; i <= 10; i++) { Console.WriteLine(); Console.WriteLine("Iteracja numer: " + i); Program.results.WriteLine("Iteracja numer: {0}. Poniżej najlepsze genotypy", i); algorithm.Run(); Program.results.WriteLine(" BEST: {0}", algorithm.BestGenotype.Min().ToString("0.000000000")); Console.WriteLine("\t\tBEST: {0}", algorithm.BestGenotype.Min().ToString("0.000000000")); BestGenotypes.Add(algorithm.BestGenotype.Min()); } Program.results.WriteLine("KONIEC: Najgorszy: {0}", BestGenotypes.Max().ToString("0.000000000")); Program.results.WriteLine("KONIEC: Średni: {0}", BestGenotypes.Average().ToString("0.000000000")); Program.results.WriteLine("KONIEC: Najlepszy: {0}", BestGenotypes.Min().ToString("0.000000000")); //zamkniecie pliku results.WriteLine(); results.Close(); }