/// <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); } }
/// <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); } }