Esempio n. 1
0
 private double[] Tablica(IFunkcje funkcja, int wymiar)
 {
     double[] punkty = new double[wymiar];
     for (int i = 0; i < wymiar; i++)
     {
         punkty[i] = Punkt(funkcja.Min, funkcja.Max);
     }
     return(punkty);
 }
Esempio n. 2
0
 private double[] InicjujPopulacje(IFunkcje funkcja, int wymiar)
 {
     double[] tablica = new double[wymiar];
     for (int i = 0; i < wymiar; i++)
     {
         tablica[i] = Punkt(funkcja.Min, funkcja.Max);
     }
     return(tablica);
 }
Esempio n. 3
0
        public double[] Algorytm(IFunkcje funkcja, int iloscKrokow, int wymiar)
        {
            int wielkoscPopulacji = 1000;
            //Generacja populacji poczatkowej
            //W petli
            //Generowanie populacji potomnej => selekcja,krzyzowanie,mutacja
            //Ocena
            //https://towardsdatascience.com/introduction-to-genetic-algorithms-including-example-code-e396e98d8bf3
            List <PunktyFunkcja> populacja = new List <PunktyFunkcja>();

            for (int i = 0; i < wielkoscPopulacji; i++)
            {
                populacja.Add(new PunktyFunkcja(InicjujPopulacje(funkcja, wymiar)));
            }

            for (int i = 0; i < iloscKrokow; i++)
            {
                //Obliczenie wartosci funkcji z punktow w populacji
                foreach (var x in populacja)
                {
                    x.Wartosc = funkcja.ObliczFunkcje(x.Punkty);
                }
                //Posortowanie tablicy rosnaca
                populacja = populacja.OrderBy(x => x.Wartosc).ToList();
                //Wybranie x i usuniecie reszty
                populacja.RemoveRange(30, wielkoscPopulacji - 30);

                List <PunktyFunkcja> noweGeneracja = new List <PunktyFunkcja>();

                while (populacja.Count + noweGeneracja.Count < wielkoscPopulacji)
                {
                    //Crossover
                    //http://edu.pjwstk.edu.pl/wyklady/nai/scb/wyklad12/w12.htm
                    //http://www.rubicite.com/Tutorials/GeneticAlgorithms/CrossoverOperators/Order1CrossoverOperator.aspx
                    noweGeneracja.Add(Crossover(populacja));
                }
                populacja.AddRange(noweGeneracja);
                noweGeneracja.Clear();

                foreach (var x in populacja)
                {
                    Mutacja(x);
                }
            }
            foreach (var x in populacja)
            {
                x.Wartosc = funkcja.ObliczFunkcje(x.Punkty);
            }
            populacja = populacja.OrderBy(x => x.Wartosc).ToList();
            return(populacja[0].Punkty);
        }
Esempio n. 4
0
        public double[] Algorytm(IFunkcje funkcja, int iloscKrokow, int wymiar)
        {
            double[] lider = Tablica(funkcja, wymiar);

            List <Particle> population = new List <Particle>();

            for (int i = 0; i < numParticle; i++)
            {
                double[] position = Tablica(funkcja, wymiar);
                double[] velocity = TablicaDruga(wymiar);
                Particle particle = new Particle(position, velocity);
                population.Add(particle);

                if (funkcja.ObliczFunkcje(particle.BestKnow) < funkcja.ObliczFunkcje(lider))
                {
                    Array.Clear(lider, 0, lider.Length);
                    lider = particle.Position;
                }
            }

            for (int i = 0; i < iloscKrokow; i++)
            {
                foreach (Particle x in population)
                {
                    for (int j = 0; j < wymiar; j++)
                    {
                        double r1 = random.NextDouble();
                        double r2 = random.NextDouble();

                        x.Velocity[j] = (w * x.Velocity[j]) + c1 * r1 * (x.BestKnow[j] - x.Position[j]) + c2 * r2 * (lider[j] * x.Position[j]);
                    }

                    for (int j = 0; j < wymiar; j++)
                    {
                        x.Position[j] += x.Velocity[j];
                    }

                    if (funkcja.ObliczFunkcje(x.Position) < funkcja.ObliczFunkcje(x.BestKnow))
                    {
                        x.BestKnow = x.Position;
                    }

                    if (funkcja.ObliczFunkcje(x.Position) < funkcja.ObliczFunkcje(lider))
                    {
                        Array.Clear(lider, 0, lider.Length);
                        lider = x.Position;
                    }
                }
            }
            return(lider);
        }
Esempio n. 5
0
        public double[] Algorytm(IFunkcje funkcja, int iloscKrokow, int wymiar)
        {
            List <double[]> populacja = new List <double[]>();

            for (int i = 0; i < iloscAgentow; i++)
            {
                populacja.Add(UtworzAgenta(funkcja, wymiar));
            }

            for (int j = 0; j < iloscKrokow; j++)
            {
                for (int k = 0; k < populacja.Count; k++)
                {
                    double[][] wybraniAgenci = DobierzAgentow(populacja, populacja[k]);

                    double[] y = new double[wymiar];
                    for (int i = 0; i < wymiar; i++)
                    {
                        double r = random.NextDouble();
                        if (r < CR)
                        {
                            y[i] = wybraniAgenci[0][i] + F * (wybraniAgenci[1][i] - wybraniAgenci[2][i]);
                        }
                        else
                        {
                            y[i] = populacja[k][i];
                        }
                    }
                    if (funkcja.ObliczFunkcje(y) <= funkcja.ObliczFunkcje(populacja[k]))
                    {
                        populacja[k] = y;
                    }
                }
            }
            //Znalezienie najlepszego rozwiazania -> czyli najmniejsza wartosc funkcji
            double[] najlepszeRozw = populacja[0];
            foreach (double[] x in populacja)
            {
                if (funkcja.ObliczFunkcje(x) <= funkcja.ObliczFunkcje(najlepszeRozw))
                {
                    najlepszeRozw = x;
                }
            }

            return(najlepszeRozw);
        }
Esempio n. 6
0
        public double[] Algorytm(IFunkcje funkcja, int iloscKrokow, int wymiar)
        {
            List <Robaczki> population = new List <Robaczki>();

            for (int i = 0; i < populationNum; i++)
            {
                population.Add(new Robaczki(funkcja, Tablica(funkcja, wymiar)));
            }
            double[] lider = population.OrderBy(x => x.I).First().Position;
            for (int i = 0; i < iloscKrokow; i++)
            {
                for (int j = 0; j < populationNum; j++)
                {
                    for (int k = 0; k < populationNum; k++)
                    {
                        if (population[j].I > population[i].I)
                        {
                            for (int l = 0; l < wymiar; l++)
                            {
                                population[i].Position[l] += Attractiveness(population[i], population[j]) * (population[j].Position[l] - population[i].Position[l]);
                                population[i].Position[l] += gamma * (random.NextDouble() - 0.5);
                                if (population[i].Position[l] < funkcja.Min)
                                {
                                    population[i].Position[l] = Punkt(funkcja.Min, funkcja.Max);
                                }
                                if (population[i].Position[l] > funkcja.Max)
                                {
                                    population[i].Position[l] = Punkt(funkcja.Min, funkcja.Max);
                                }
                            }
                        }
                    }
                }
                //Odswiezenie wartosci funkcji
                for (int l = 0; l < populationNum; l++)
                {
                    population[l].I = funkcja.ObliczFunkcje(population[l].Position);
                }
                double[] temp = population.OrderBy(x => x.I).First().Position;
                if (funkcja.ObliczFunkcje(temp) < funkcja.ObliczFunkcje(lider))
                {
                    lider = temp;
                }
            }
            return(lider);
        }
        public double[] Algorytm(IFunkcje funkcja, int iloscKrokow, int wymiar)
        {
            double coolingRate = 0.034;

            double[] s = PunktStartowy(funkcja, wymiar);
            double   T = funkcja.Max;

            for (int i = 0; i < iloscKrokow; i++)
            {
                double[] sNew = Sasiedzi(s, funkcja.Min, funkcja.Max, wymiar, Punkt(-0.1, 0.1));
                if (AkceptowanePrawdopodobienstwo(energy(s, funkcja), energy(sNew, funkcja), T) > random.NextDouble())
                {
                    s = sNew;
                }
                T *= 1 - coolingRate;
            }
            return(s);
        }
Esempio n. 8
0
 private double[] RandomWalk(double[] cuckoo, IFunkcje funkcja)
 {
     double[] temp = new double[cuckoo.Length];
     cuckoo.CopyTo(temp, 0);
     for (int i = 0; i < 10; i++)
     {
         for (int j = 0; j < cuckoo.Length; j++)
         {
             temp[j] += Punkt(-1.0, 1.0);
             if (temp[j] < funkcja.Min)
             {
                 temp[j] = Punkt(funkcja.Min, funkcja.Max);
             }
             if (temp[j] > funkcja.Max)
             {
                 temp[j] = Punkt(funkcja.Min, funkcja.Max);
             }
         }
     }
     return(temp);
 }
 private double energy(double[] x, IFunkcje funkcja)
 {
     return(COEF * funkcja.ObliczFunkcje(x));
 }
Esempio n. 10
0
 public Robaczki(IFunkcje funkcja, double[] position)
 {
     Position = position;
     I        = funkcja.ObliczFunkcje(Position);
 }
Esempio n. 11
0
        public double[] Algorytm(IFunkcje funkcja, int iloscKrokow, int wymiar)
        {
            List <MyBat> population = new List <MyBat>();

            for (int i = 0; i < populationNum; i++)
            {
                MyBat x = new MyBat(Tablica(funkcja, wymiar));
                x.Frequency   = Punkt(frequency[0], frequency[1]);
                x.Loud        = random.NextDouble();
                x.ImpulsRatio = random.NextDouble();
                x.Result      = funkcja.ObliczFunkcje(x.Position);

                population.Add(x);
            }
            //Znalezienie lidera stada => czyli nietoperz o najmniejszej wartosci funkcji
            population = population.OrderBy(x => x.Result).ToList();
            MyBat lider = population[0];

            for (int i = 0; i < iloscKrokow; i++)
            {
                foreach (var x in population)
                {
                    //Liczenie nowej czestotliwosci
                    x.Frequency = Punkt(frequency[0], frequency[1]);
                    //Liczenie predkosci czyli Velocity
                    //Aktualizacja polozenia
                    for (int j = 0; j < wymiar; j++)
                    {
                        x.Velocity[j] = x.Velocity[j] + (x.Position[j] - lider.Position[j]) * x.Frequency;
                        x.Position[j] = x.Position[j] + x.Velocity[j];
                    }

                    double[] bestPos = x.Position;

                    if (random.NextDouble() > x.ImpulsRatio)
                    {
                        for (int j = 0; j < wymiar; j++)
                        {
                            bestPos[j] = lider.Position[j] + (Punkt(-1, 1) * population.Average(y => y.Loud));
                        }
                        bestPos = RandomWalk(bestPos, funkcja);
                    }



                    if (funkcja.ObliczFunkcje(bestPos) < funkcja.ObliczFunkcje(x.Position) && random.NextDouble() < x.Loud)
                    {
                        x.Position    = bestPos;
                        x.Loud        = alfa * x.Loud;
                        x.ImpulsRatio = (1 - Math.Exp(-1 * gamma * x.ImpulsRatio));
                    }

                    x.Result = funkcja.ObliczFunkcje(x.Position);
                    if (funkcja.ObliczFunkcje(x.Position) < funkcja.ObliczFunkcje(lider.Position))
                    {
                        lider = x;
                    }
                }
            }
            return(lider.Position);
        }