Exemple #1
0
        /// <summary>
        /// Открытие файла
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog a = new OpenFileDialog();
                a.Filter = "tsp files (*.tsp)|*.tsp|All files (*.*)|*.*"; //только txt файлы
                a.ShowDialog();
                textBox5.Text = a.FileName;
                string path = a.FileName;
                using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default))
                {
                    string line;
                    string Chromosoma = "";
                    int    kol        = 0;
                    bool   check      = true;
                    while ((line = sr.ReadLine()) != "EOF")
                    {
                        if (line.IndexOf("TYPE : TOUR") > -1)
                        {
                            check = false;
                        }
                        if (line.IndexOf("TYPE : TSP") > -1)
                        {
                            ClearPanel_Click(sender, e);
                        }
                        if (check)
                        {
                            if (line[0] >= '0' && line[0] <= '9')
                            {
                                kol++;
                                string[] StrPoint = line.Split(' ');
                                NP.Add(new Point(int.Parse(StrPoint[1]), int.Parse(StrPoint[2])));
                            }
                        }
                        else
                        {
                            if ((line[0] >= '0' && line[0] <= '9') || (line[0] == '+'))
                            {
                                if (line[0] == '+')
                                {
                                    Chromosoma += line;
                                }
                                else
                                {
                                    Chromosoma += ((char)(int.Parse(line) + 96));
                                }
                            }
                        }
                    }

                    if (kol > 200)
                    {
                        throw new Exception();
                    }
                    else
                    {
                        if (check)
                        {
                            CountOfPoints.Value = kol;
                            P   = new Point[NP.Count];
                            Chr = new string[(int)CountOfChr.Value];
                            for (int i = 0; i < NP.Count; i++)
                            {
                                if (Chromosoma == "")
                                {
                                    P[i] = new Point(NP[i].X, NP[i].Y);
                                }
                                else
                                {
                                    P[i] = new Point(NP[i].X, NP[i].Y);
                                }
                            }
                            Generation.GenerateChromosome(ref Chr, NP.Count);
                            Draw.DrawPoint(P);
                        }
                        else
                        {
                            if ((Chromosoma.Length + 1) / 2 != P.Length)
                            {
                                throw new Exception();
                            }
                            else
                            {
                                Draw.DrawPoint(P);
                                Draw.ReadChr(Chromosoma, P);
                            }
                        }
                        NP.Clear();
                    }
                }
            }
            catch
            {
                MessageBox.Show(
                    "Возможные причины:\nОткрыт файл TOUR прежде, чем TSP\nНеверно указан путь к файлу\nНевозможно прочитать файл\nНеверное количество точек\nДля работы алгоритма необходимо минимум 2 точки, максимум 200",
                    "Ошибка при открытие файла",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error,
                    MessageBoxDefaultButton.Button1);
            }
        }
Exemple #2
0
 /// <summary>
 /// Таймер для повтора шагов алгоритма
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void timer1_Tick(object sender, EventArgs e)
 {
     try
     {
         TimeSpan      ts       = time.Elapsed;
         List <string> DopChr   = new List <string>();
         string[]      DopChrom = new string[1];
         textBox4.Text   = $"{ts.Minutes}:{ts.Seconds}:{ts.Milliseconds}";
         timer1.Interval = 1;
         textBox1.Text   = (++CountOfShag).ToString();
         Generation.GenerateChromosome(ref DopChrom, (int)CountOfPoints.Value);
         DopChr.Add(DopChrom[0]);
         string BestChrom = "";
         for (int i = 0; i < Chr[0].Length; i++)
         {
             if (Chr[0][i] != '+')
             {
                 BestChrom += ("(" + (Chr[0][i] - 96) + ")");
             }
             else
             {
                 BestChrom += Chr[0][i];
             }
         }
         textBox2.Text = BestChrom;
         textBox3.Text = $"{Tree.Len(Chr[0], P):F2}";
         if (CountOfShag % 10 == 0 || CountOfShag == 1)
         {
             Draw.ReadChr(Chr[0], P);
         }
         int    CountOfCross = 0;
         string Cr1;
         string Cr2;
         do
         {
             int i1 = rand.Next((int)CountOfChr.Value);
             int i2 = rand.Next((int)CountOfChr.Value);
             int x  = rand.Next(100);
             if (x > 100 - PrOfCross.Value)
             {
                 Cr1 = "";
                 Cr2 = "";
                 Crossover.Crossovering(Chr[i1], Chr[i2], ref Cr1, ref Cr2);
                 x = rand.Next(100);
                 if (x > 100 - PrOfMutate.Value)
                 {
                     Mutate.MutateChr(ref Cr1);
                 }
                 x = rand.Next(100);
                 if (x > 100 - PrOfMutate.Value)
                 {
                     Mutate.MutateChr(ref Cr2);
                 }
                 DopChr.Add(Cr1);
                 DopChr.Add(Cr2);
             }
             CountOfCross++;
         }while (CountOfCross < CountOfChr.Value);
         Tree.Select(ref Chr, DopChr);
         if (CountOfShag == CountOfIt.Value)
         {
             timer1.Stop();
         }
     }
     catch
     {
         timer1.Stop();
         MessageBox.Show(
             "Возможные причины:\nНеверное количество точек\nДля работы алгоритма необходимо минимум 2 точки, максимум 200",
             "Ошибка при работе алгоритма",
             MessageBoxButtons.OK,
             MessageBoxIcon.Error,
             MessageBoxDefaultButton.Button1);
     }
 }