Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Windows.Forms;
- using System.Windows.Forms.DataVisualization.Charting;
- namespace PSO
- {
- public partial class Form1 : Form
- {
- public Random rand = new Random(10);
- private int n = 4;
- private double rInteracji = 0.2;
- private double rGlob = 0.3;
- private double rLok = 0.3;
- private int xMin = 0;
- private int xMax = 100;
- public int xGlob = -1;
- public List<List<double>> populacja = new List<List<double>>();
- public List<List<double>> optimaLokalne = new List<List<double>>();
- public List<List<double>> predkosci = new List<List<double>>();
- public Form1()
- {
- InitializeComponent();
- chart1.Series.Clear();
- chart1.ChartAreas.Clear();
- ChartArea area = new ChartArea();
- chart1.ChartAreas.Add(area);
- chart1.ChartAreas[0].Position.Width = 100;
- chart1.ChartAreas[0].Position.Height = 100;
- chart1.ChartAreas[0].AxisX.Maximum = 100;
- chart1.ChartAreas[0].AxisX.Minimum = 0;
- chart1.ChartAreas[0].AxisY.Maximum = 100;
- chart1.ChartAreas[0].AxisY.Minimum = 0;
- chart1.ChartAreas[0].AxisX.Interval = 10;
- chart1.ChartAreas[0].AxisY.Interval = 10;
- losujPopulacje();
- }
- //! Wykonanie jednego kroku iteracji
- private void button1_Click(object sender, EventArgs e)
- {
- var interakcja = Convert.ToInt32(textBox1.Text);
- interakcja++;
- textBox1.Text = interakcja.ToString();
- List<double> ocenyOsobnikow = new List<double>();
- double najlepszyWynik = Int32.MinValue;
- for (int j = 0; j < populacja.Count; j++)
- {
- var osobnik = populacja[j];
- ocenyOsobnikow.Add(obliczWartoscFunkcjiF(osobnik[0], osobnik[1]));
- if (najlepszyWynik < ocenyOsobnikow[j])
- {
- xGlob = j;
- najlepszyWynik = ocenyOsobnikow[j];
- }
- }
- for (int j = 0; j < populacja.Count; j++)
- {
- var ocenaLokalna = obliczWartoscFunkcjiF(optimaLokalne[j][0], optimaLokalne[j][1]);
- var ocena = ocenyOsobnikow[j];
- if (ocenaLokalna < ocena)
- {
- var osobnik = populacja[j];
- for (int i = 0; i < osobnik.Count; i++)
- {
- optimaLokalne[j][i] = osobnik[i];
- }
- }
- }
- for (int j = 0; j < populacja.Count; j++)
- {
- double rndGlob = rand.NextDouble();
- double rndLok = rand.NextDouble();
- var osobnik = populacja[j];
- for (int i = 0; i < osobnik.Count; i++)
- {
- var nowaPredkosc = obliczNowaPredkosc(predkosci[j][i], xGlob, osobnik[i], rndGlob, optimaLokalne[j][i], rndLok);
- predkosci[j][i] = nowaPredkosc;
- populacja[j][i] = populacja[j][i] + nowaPredkosc;
- }
- }
- chart1.Series.Clear();
- Series seria = new Series();
- seria.ChartType = SeriesChartType.Point;
- for (int i = 0; i < n; i++)
- {
- seria.Points.AddXY(populacja[i][0], populacja[i][1]);
- }
- Series seria2 = new Series();
- seria2.ChartType = SeriesChartType.Point;
- seria2.Color = Color.Red;
- seria2.Points.AddXY(populacja[xGlob][0], populacja[xGlob][1]);
- chart1.Series.Add(seria);
- chart1.Series.Add(seria2);
- }
- private void losujPopulacje()
- {
- chart1.Series.Clear();
- Series seria = new Series();
- seria.ChartType = SeriesChartType.Point;
- for (int i = 0; i < n; i++)
- {
- int x1 = rand.Next(xMin, xMax + 1);
- int x2 = rand.Next(xMin, xMax + 1);
- populacja.Add(new List<double>() { x1, x2 });
- optimaLokalne.Add(new List<double>() { x1, x2 });
- predkosci.Add(new List<double>() { 0, 0 });
- seria.Points.AddXY(x1, x2);
- }
- chart1.Series.Add(seria);
- }
- private double obliczWartoscFunkcjiF(double x1, double x2)
- {
- return Math.Sin(x1 * 0.05) + Math.Sin(x2 * 0.05) + (0.4 * Math.Sin(x1 * 0.15) * Math.Sin(x2 * 0.15));
- }
- private double obliczNowaPredkosc(double v, double xGlob, double x, double rndGlob, double xLok, double rndLok)
- {
- return v * rInteracji + (xGlob - x) * rGlob * rndGlob + (xLok - x) * rLok * rndLok;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement