Advertisement
Adik28

PSO / A

Jan 22nd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.95 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Windows.Forms.DataVisualization.Charting;
  6.  
  7. namespace PSO
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         public Random rand = new Random(10);
  12.  
  13.         private int n = 4;
  14.         private double rInteracji = 0.2;
  15.         private double rGlob = 0.3;
  16.         private double rLok = 0.3;
  17.         private int xMin = 0;
  18.         private int xMax = 100;
  19.         public int xGlob = -1;
  20.  
  21.         public List<List<double>> populacja = new List<List<double>>();
  22.         public List<List<double>> optimaLokalne = new List<List<double>>();
  23.         public List<List<double>> predkosci = new List<List<double>>();
  24.  
  25.         public Form1()
  26.         {
  27.             InitializeComponent();
  28.  
  29.             chart1.Series.Clear();
  30.             chart1.ChartAreas.Clear();
  31.             ChartArea area = new ChartArea();
  32.             chart1.ChartAreas.Add(area);
  33.             chart1.ChartAreas[0].Position.Width = 100;
  34.             chart1.ChartAreas[0].Position.Height = 100;
  35.             chart1.ChartAreas[0].AxisX.Maximum = 100;
  36.             chart1.ChartAreas[0].AxisX.Minimum = 0;
  37.             chart1.ChartAreas[0].AxisY.Maximum = 100;
  38.             chart1.ChartAreas[0].AxisY.Minimum = 0;
  39.             chart1.ChartAreas[0].AxisX.Interval = 10;
  40.             chart1.ChartAreas[0].AxisY.Interval = 10;
  41.  
  42.             losujPopulacje();
  43.         }
  44.  
  45.         //! Wykonanie jednego kroku iteracji
  46.         private void button1_Click(object sender, EventArgs e)
  47.         {
  48.             var interakcja = Convert.ToInt32(textBox1.Text);
  49.             interakcja++;
  50.             textBox1.Text = interakcja.ToString();
  51.  
  52.             List<double> ocenyOsobnikow = new List<double>();
  53.             double najlepszyWynik = Int32.MinValue;
  54.  
  55.             for (int j = 0; j < populacja.Count; j++)
  56.             {
  57.                 var osobnik = populacja[j];
  58.                 ocenyOsobnikow.Add(obliczWartoscFunkcjiF(osobnik[0], osobnik[1]));
  59.                 if (najlepszyWynik < ocenyOsobnikow[j])
  60.                 {
  61.                     xGlob = j;
  62.                     najlepszyWynik = ocenyOsobnikow[j];
  63.                 }
  64.             }
  65.  
  66.             for (int j = 0; j < populacja.Count; j++)
  67.             {
  68.                 var ocenaLokalna = obliczWartoscFunkcjiF(optimaLokalne[j][0], optimaLokalne[j][1]);
  69.                 var ocena = ocenyOsobnikow[j];
  70.                 if (ocenaLokalna < ocena)
  71.                 {
  72.                     var osobnik = populacja[j];
  73.                     for (int i = 0; i < osobnik.Count; i++)
  74.                     {
  75.                         optimaLokalne[j][i] = osobnik[i];
  76.                     }
  77.  
  78.                 }
  79.             }
  80.  
  81.             for (int j = 0; j < populacja.Count; j++)
  82.             {
  83.                 double rndGlob = rand.NextDouble();
  84.                 double rndLok = rand.NextDouble();
  85.  
  86.                 var osobnik = populacja[j];
  87.                 for (int i = 0; i < osobnik.Count; i++)
  88.                 {
  89.                     var nowaPredkosc = obliczNowaPredkosc(predkosci[j][i], xGlob, osobnik[i], rndGlob, optimaLokalne[j][i], rndLok);
  90.                     predkosci[j][i] = nowaPredkosc;
  91.                     populacja[j][i] = populacja[j][i] + nowaPredkosc;
  92.                 }
  93.             }
  94.  
  95.  
  96.             chart1.Series.Clear();
  97.  
  98.             Series seria = new Series();
  99.             seria.ChartType = SeriesChartType.Point;
  100.             for (int i = 0; i < n; i++)
  101.             {
  102.                 seria.Points.AddXY(populacja[i][0], populacja[i][1]);
  103.             }
  104.  
  105.             Series seria2 = new Series();
  106.             seria2.ChartType = SeriesChartType.Point;
  107.             seria2.Color = Color.Red;
  108.             seria2.Points.AddXY(populacja[xGlob][0], populacja[xGlob][1]);
  109.  
  110.  
  111.             chart1.Series.Add(seria);
  112.             chart1.Series.Add(seria2);
  113.         }
  114.  
  115.         private void losujPopulacje()
  116.         {
  117.             chart1.Series.Clear();
  118.             Series seria = new Series();
  119.             seria.ChartType = SeriesChartType.Point;
  120.  
  121.             for (int i = 0; i < n; i++)
  122.             {
  123.                 int x1 = rand.Next(xMin, xMax + 1);
  124.                 int x2 = rand.Next(xMin, xMax + 1);
  125.  
  126.                 populacja.Add(new List<double>() { x1, x2 });
  127.                 optimaLokalne.Add(new List<double>() { x1, x2 });
  128.  
  129.                 predkosci.Add(new List<double>() { 0, 0 });
  130.  
  131.                 seria.Points.AddXY(x1, x2);
  132.             }
  133.  
  134.             chart1.Series.Add(seria);
  135.         }
  136.  
  137.         private double obliczWartoscFunkcjiF(double x1, double x2)
  138.         {
  139.             return Math.Sin(x1 * 0.05) + Math.Sin(x2 * 0.05) + (0.4 * Math.Sin(x1 * 0.15) * Math.Sin(x2 * 0.15));
  140.         }
  141.  
  142.         private double obliczNowaPredkosc(double v, double xGlob, double x, double rndGlob, double xLok, double rndLok)
  143.         {
  144.             return v * rInteracji + (xGlob - x) * rGlob * rndGlob + (xLok - x) * rLok * rndLok;
  145.         }
  146.     }
  147.  
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement