/// <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();
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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();
        }
Exemple #4
0
        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();
        }
Exemple #6
0
        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();
        }