Beispiel #1
0
        public static Particle[] DaneStartowe(Problem problem, Param par, ref BestPosition GlobalBest, IFunkcja funkcja)
        {
            Random random = new Random();

            Particle[] particles         = new Particle[par.nPop];
            bool       PierwszaLiteracja = true;

            for (int i = 0; i < par.nPop; i++)
            {
                particles[i].Position = problem.VarMin + (random.NextDouble() * (problem.VarMax - problem.VarMin));

                particles[i].Velocity = 0;
                particles[i].Cost     = funkcja.Funkcja(particles[i].Position);
                particles[i].Best     = new BestPosition {
                    Position = particles[i].Position, Cost = particles[i].Cost
                };
                if (PierwszaLiteracja)
                {
                    GlobalBest        = particles[i].Best;
                    PierwszaLiteracja = false;
                }
                if ((particles[i].Best.Cost < GlobalBest.Cost))
                {
                    GlobalBest = particles[i].Best;
                }
            }
            return(particles);
        }
Beispiel #2
0
        public static Particle[] MainFloop(Particle[] particles, Problem problem, Param par, ref BestPosition GlobalBest, IFunkcja funkcja)
        {
            Random random      = new Random();
            double MaxVelocity = 0.2 * (problem.VarMax - problem.VarMin);
            double MinVelocity = -MaxVelocity;

            for (int i = 0; i < par.nPop; i++)
            {
                particles[i].Velocity = par.w * particles[i].Velocity                                                       // ustalanie nowego wectora
                                        + par.c1 * random.NextDouble() * particles[i].Best.Position - particles[i].Position // min lokalne
                                        + par.c2 * random.NextDouble() * GlobalBest.Position - particles[i].Position;       // min globalne

                if (particles[i].Velocity > MaxVelocity)                                                                    // sprawdzanie czy wketor wyszedł poza zakres
                {
                    particles[i].Velocity = MaxVelocity;
                }
                else if (particles[i].Velocity < MinVelocity)
                {
                    particles[i].Velocity = MinVelocity;
                }

                particles[i].Position = particles[i].Position + particles[i].Velocity; // utawinie nowej pozycji

                if (particles[i].Position > problem.VarMax)                            // prawdzanie czy pozycja została ustalona poza zakresem
                {
                    particles[i].Position = problem.VarMax;
                }
                else if (particles[i].Position < problem.VarMin)
                {
                    particles[i].Position = problem.VarMin;
                }


                particles[i].Cost = funkcja.Funkcja(particles[i].Position);


                if ((particles[i].Cost < particles[i].Best.Cost))// sprawdzenie czy minimum lokalne jest mniejsze od aktualnego
                {
                    particles[i].Best = new BestPosition {
                        Position = particles[i].Position, Cost = particles[i].Cost
                    };

                    if ((particles[i].Best.Cost < GlobalBest.Cost))// sprawdzenie czy minimum globalne jest mniejsze od aktualnego
                    {
                        GlobalBest = particles[i].Best;
                    }
                }
            }
            return(particles);
        }
Beispiel #3
0
        public void Nowywatek()
        {
            Inicjalizacja();
            ClearWykres();

            Particle[] particles = PSO_algorithm.DaneStartowe(problem, par, ref GlobalBest, funkcja);
            for (int j = 0; j < par.MaxIterations; j++)
            {
                particles = PSO_algorithm.MainFloop(particles, problem, par, ref GlobalBest, funkcja);

                par.w    = par.w * par.wdamp;
                spisw[j] = GlobalBest;
            }



            int maxprogressBar = (Convert.ToInt32(max_fun_nud.Value) - Convert.ToInt32(min_fun_nud.Value));

            ClearProressBar(maxprogressBar);


            for (int i = Convert.ToInt32(min_fun_nud.Value); i <= Convert.ToInt32(max_fun_nud.Value); i++)
            {
                if (progressBar.Value < maxprogressBar)
                {
                    progressBar.Invoke((Action)(() => progressBar.Value++));
                }

                wykres_funkcji.Invoke((Action)(() => wykres_funkcji.Series[0].Points.AddXY(i, funkcja.Funkcja(i))));
            }

            //wynik[0] = GlobalBest.Cost;
            // wynik[1] = GlobalBest.Position;

            int k = 0;

            double[] wynik = PSO_algorithm.Main_PSO(problem, par, ref spisw, funkcja);

            ClearProressBar(spisw.Length);


            foreach (var item in spisw)
            {
                progressBar.Invoke((Action)(() => progressBar.Value++));


                wykres_funkcji.Invoke((Action)(() => wykres_funkcji.Series[1].Points.Clear()));
                wykres_funkcji.Invoke((Action)(() => wykres_funkcji.Series[1].Points.AddXY(item.Position, funkcja.Funkcja(item.Position))));


                string napis = "Literacja nr " + (++k) + " Y : " + item.Cost.ToString("0.00000000") + " X = " + item.Position.ToString("0.00000") + "\n";

                richTextBox.Invoke((Action)(() => richTextBox.Text += napis));

                wykres_wynikow.Invoke((Action)(() => wykres_wynikow.Series[0].Points.AddXY(k, funkcja.Funkcja(item.Position))));
            }
            string wynik_napis = "Najlepsza literacja Y : " + wynik[0].ToString("0.00000000") + " X = " + wynik[1].ToString("0.00000");


            richTextBox.Invoke((Action)(() => richTextBox.Text += wynik_napis));

            wykres_funkcji.Invoke((Action)(() => wykres_funkcji.Series[1].Points.AddXY(wynik[1], funkcja.Funkcja(wynik[1]))));

            ClearProressBar(0);
            progressBar.Invoke((Action)(() => progressBar.Visible = false));
            this.Invoke((Action)(() => this.Height -= progressBar.Height));
            progressBar.Invoke((Action)(() => progressBar.Height = 0));
            groupBox1.Invoke((Action)(() => groupBox1.Enabled = true));
        }