Исследование влияния параметров генетического алгоритма на точность и скорость нахождения решения. Разработка структуры генетического алгоритма для решения задач оптимизации, страница 2

                    genes[j] = (Math.Sqrt(a2 * a2 + 9 * 9 ) / 8) + ((15 - a2 + 0.1 - 0.1) / 10);

                    summa = summa + genes[j];

                    if (bad < genes[j]) bad = genes[j];

                    if (good > genes[j]) good = genes[j];

                }

                if (max < bad) max = bad;

                if (min > good) min = good;

                koef_prisp[i]=summa/population;

                obrsumma = Convert.ToInt32((bad * population - summa) * 1000);

                for (int para=0; para < population; para++)//отбор и скрещивание

                {

                    phenotype[para] = "";

                    roditel1 = 0;

                    roditel2 = 0;

                    r = rand.Next(0, obrsumma);

                    otbor = 0;

                    for (int j = 0; j < population; j++)

                    {

                        otbor = otbor + (bad - genes[j])*1000;

                        if (otbor > r)

                        {

                            roditel1 = j;

                            j = population;

                        }

                    }

                    r = rand.Next(0, obrsumma);

                    otbor = 0;

                    for (int j = 0; j < population; j++)

                    {

                        otbor = otbor + (bad - genes[j]) * 1000;

                        if (otbor > r)

                        {

                            roditel2 = j;

                            j = population;

                        }

                    }

                    //кроссовер

                    r = rand.Next(1, Convert.ToInt32(amountGenes*numericUpDown5.Value)); //точка разрыва

                    char[] ch = pt[roditel1].ToCharArray();

                    for (int j = 0; j < r; j++)

                    {

                        if (rand.Next(0, 10000) <= mut && mut > 0) //мутация

                        {

                            phenotype[para] =phenotype[para]+ rand.Next(0, 2).ToString();

                        }

                        else

                        {

                            phenotype[para] = phenotype[para]+ch[j];

                        }

                    }

                    char[] ch2 = pt[roditel2].ToCharArray();

                    for (int j = r; j < amountGenes * numericUpDown5.Value; j++)

                    {

                        if (rand.Next(0, 10000) <= mut && mut>0) //мутация

                        {

                            phenotype[para] = phenotype[para] + rand.Next(0, 2).ToString();

                        }

                        else

                        {

                            phenotype[para] = phenotype[para] + ch2[j];

                        }

                    }                                         

                }

            }

            double t = 3;

            int p=0;

            int b = 0;

            double c = 0;

            string osobi = "";

            for (int i = 0; i < population; i++)

            {

                char[] ch = pt[i].ToCharArray();

                string osob2="";

                for (int simvol2=0; simvol2 < numericUpDown5.Value; simvol2++) osob2 = osob2 + ch[simvol2];

                b = Convert.ToInt32(osob2, 2);

                int b2 = Convert.ToInt32(b * 15 / (tochnost + 0.001 - 0.001));

                c = (Math.Sqrt(b2 * b2 + 9 * 9) / 8) + (15 - b2 + 0.001 - 0.001) / 10;

                if (t > c) { t = c; p = b; }

                osobi = osobi +(i+1).ToString() + ") " + c.ToString()+" - "+b + "\n";

            }

            richTextBox2.Text = osobi;

            richTextBox2.Text = richTextBox2.Text + "\n" + "Лучшее время: " + t.ToString() + "\n"+

                "Лучшая точка: " + p.ToString() + "\n";

            decimal endLong = DateTime.Now.Ticks;

            decimal time = (endLong - startLong) / 10000000;

            label2.Text = time.ToString();

            string koef = "";

            for (int i = 0; i < koef_prisp.Length; i++)

            {

                koef = koef +(i+1).ToString() + ") " + koef_prisp[i].ToString()+ "\n";

            }

            richTextBox3.Text = koef;

              Bitmap image = new Bitmap(pictureBox1.Width+2, pictureBox1.Height+1);

              label3.Text = max.ToString("F3");

              label4.Text = min.ToString("F3");

              label11.Text = generation.ToString();

              Graphics g = Graphics.FromImage(image);

              Pen pe = new Pen(Color.Red);

              for (int i = 0; i < pictureBox1.Width; i++)

              {

                  image.SetPixel(i, 0, Color.Blue);

                  image.SetPixel(i, pictureBox1.Height-10, Color.Green);

              }

                  int x = 0;

                  int y = 0;

                  int x2 = 0;

                  int y2 = 0;

                  double k = pictureBox1.Width / (koef_prisp.Length + 0.000001-0.000001);

                  for (int i = 0; i < koef_prisp.Length; i++)

                  {

                      x2 = x;

                      y2 = y;

                      x = Convert.ToInt32(i * k) + 1;

                      y = Convert.ToInt32((max - koef_prisp[i]) * pictureBox1.Height / (max - min)) - 10;

                      if (i > 0 && checkBox1.Checked == true) g.DrawLine(pe, x, y, x2, y2);

                      image.SetPixel(x, y, Color.Red);

                      if (y >= pictureBox1.Height - 10)

                      {

                          image.SetPixel(x, y + 5, Color.Yellow);

                          image.SetPixel(x, y + 6, Color.Yellow);

                          image.SetPixel(x, y + 7, Color.Yellow);

                          image.SetPixel(x, y + 8, Color.Yellow);

                      }

                      if (pictureBox1.Width / 2 > koef_prisp.Length)

                      {

                          image.SetPixel(x + 1, y, Color.Red);

                          image.SetPixel(x, y + 1, Color.Red);

                          image.SetPixel(x + 1, y + 1, Color.Red);

                      }

                      if (pictureBox1.Width / 3 > koef_prisp.Length)

                      {

                          image.SetPixel(x - 1, y, Color.Red);

                          image.SetPixel(x, y - 1, Color.Red);

                          image.SetPixel(x - 1, y - 1, Color.Red);

                          image.SetPixel(x + 1, y - 1, Color.Red);

                          image.SetPixel(x - 1, y + 1, Color.Red);

                      }       

              }

            pictureBox1.Image = image;

Результаты работы программы:

Лучшей точкой является точка №207 (15/256*207=12.1 км шоссе от точки шоссе ближайшей к буровой вышке). Если курьер пойдет через эту точку, то он дойдет до населенного пункта за минимальное время (2.175 часа).

Результат исследования влияния начальных параметров на скорость и точность нахождения в виде графиков:

Влияние количества особей:

Наиболее оптимальное число особей в популяции – 20.

Влияние вероятности мутации:

Наиболее оптимальная вероятность мутации – 0,03 %

Результаты решения задачи аналитическим методом и при помощи ГА, а также их процентное отличие:

Лучшее время

аналитическим методом

2,175

ГА

2,175

Расхождение

0

%

Вывод:

Решение задачи оптимизации наиболее легко находится при использовании ГА.