private void button1_Click(object sender, EventArgs e) { button2.Enabled = false; N = Convert.ToInt32(textBox1.Text); //количество складов - A сверху вних M = Convert.ToInt32(textBox2.Text); //количество потребителей - В слева направо cros = Convert.ToInt32(textBox6.Text); mut = Convert.ToInt32(textBox7.Text); end = Convert.ToInt32(textBox8.Text); //критерий остановки kGen = Convert.ToInt32(textBox9.Text); //количество особей в поколении // priceMin = Convert.ToInt32(textBox10.Text); // priceMax = Convert.ToInt32(textBox11.Text); orderW.Add(25); stockW.Add(150); orderW.Add(200); stockW.Add(15); orderW.Add(100); stockW.Add(70); orderW.Add(5); stockW.Add(15); orderW.Add(20); stockW.Add(100); // stockW.Add(50); int sumStock = stockW.Sum(); int sumOrder = orderW.Sum(); bool addS = false; bool addO = false; /* if (stockW.Sum() != orderW.Sum()) * { //задача является открытой * int a = 0; * if (sumStock > sumOrder) * { * a = sumStock - sumOrder; * orderW.Add(a); * M++; * addO=true; * } * else * { * a = sumOrder - sumStock; * stockW.Add(a); * N++; * addS=true; * } * } */ MatrVesov = new int[N, M]; //for (int i = 0; i < N; i++) //формируем матрицу весов //{ // for (int j = 0; j < M; j++) // { // int r = rand.Next(1, 9); // MatrVesov[i, j] = r; //} //} MatrVesov[0, 0] = 2; MatrVesov[0, 1] = 1; MatrVesov[0, 2] = 7; MatrVesov[0, 3] = 3; MatrVesov[0, 4] = 3; MatrVesov[1, 0] = 5; MatrVesov[1, 1] = 8; MatrVesov[1, 2] = 5; MatrVesov[1, 3] = 1; MatrVesov[1, 4] = 5; MatrVesov[2, 0] = 4; MatrVesov[2, 1] = 5; MatrVesov[2, 2] = 4; MatrVesov[2, 3] = 1; MatrVesov[2, 4] = 6; MatrVesov[3, 0] = 6; MatrVesov[3, 1] = 2; MatrVesov[3, 2] = 6; MatrVesov[3, 3] = 4; MatrVesov[3, 4] = 8; MatrVesov[4, 0] = 2; MatrVesov[4, 1] = 2; MatrVesov[4, 2] = 3; MatrVesov[4, 3] = 9; MatrVesov[4, 4] = 8; //if (addO) //{ // int j = M - 1; // for (int i = 0; i < N; i++) // MatrVesov[i, j] = 0; //} //if (addS) //{ // int i = N - 1; // for (int j = 0; j < M; j++) // MatrVesov[i, j] = 0; //} PrintStockOrder(stockW, orderW); PrintMatrV(MatrVesov); //выводим матрицу весов List <Osob> generation = new List <Osob>(); //поколение, состоит из нескольких расписаний StreamWriter sw; FileInfo fi = new FileInfo(path); sw = fi.AppendText(); sw.Write("Начальное поколение: "); sw.WriteLine(); sw.Close(); for (int j = 0; j < kGen; j++) { //заполняем поколение особями Osob osbb = new Osob(); osbb.CreateOsob(stockW, orderW, N, M); osbb.PrintOsob(N, M, path, MatrVesov, richTextBox1); generation.Add(osbb); } // GeneticAlgorithm.Crossover(generation, path, N, M, cros, mut, MatrVesov, stockW, orderW, richTextBox1); Osob min = new Osob(); min = GeneticAlgorithm.osobWhithMinCost(generation, MatrVesov); richTextBox1.Text += "\nМинимальная стоимость перевозки в начальном поколении = " + min.cost(MatrVesov) + "\n"; int k = 0; int kol = 0; Osob min1 = new Osob(); Osob min2 = new Osob(); do { min1 = GeneticAlgorithm.osobWhithMinCost(generation, MatrVesov); //находим мин. особь в поколении //обращаемся к кроссоверу, в нём же и мутацию реализовать GeneticAlgorithm.Crossover(generation, path, N, M, cros, mut, MatrVesov, stockW, orderW, richTextBox1); //печатаем новое поколение с двумя потомками kol++; sw = fi.AppendText(); sw.Write(kol + " поколение"); sw.WriteLine(); sw.Close(); //печать переполненного поколения for (int j = 0; j < generation.Count(); j++) { generation[j].PrintOsob(N, M, path, MatrVesov, richTextBox1); } //обращаемся к редукции do { GeneticAlgorithm.reduction(generation, MatrVesov); }while (generation.Count() != kGen); min2 = GeneticAlgorithm.osobWhithMinCost(generation, MatrVesov); if (min1.SequenceEquals(min2)) //сравниваем по значению предыдущую мин.особь и мин. особь нового поколения { k++; //если равны } else { k = 0; } } while (k != end); min1 = GeneticAlgorithm.osobWhithMinCost(generation, MatrVesov); richTextBox1.Text += "Лучшая особь: \n"; min1.PrintOsobRtb(N, M, MatrVesov, richTextBox1); min1.PrintOsob(N, M, path, MatrVesov, richTextBox1); // richTextBox1.Text += "\nСтоимость перевозки = " + min1.cost(MatrVesov) + "\n"; }
public static void Crossover(List <Osob> generation, string path, int N, int M, int cros, int mut, int[,] matrV, List <int> lstStock, List <int> lstOrder, RichTextBox rch) { Random rand = new Random(); int k = generation.Count(); int parent1, parent2; parent1 = rand.Next(k); do { parent2 = rand.Next(k); }while (parent1 == parent2); StreamWriter sw; FileInfo fi = new FileInfo(path); sw = fi.AppendText(); sw.WriteLine("Для кроссовера выбраны особи: " + parent1 + " и " + parent2); int point = rand.Next(1, N * M); //точка разбиения sw.WriteLine("Точка разбиения = " + point); sw.WriteLine("Родительские особи:"); sw.Close(); generation[parent1].PrintOsob(N, M, path, matrV, rch); generation[parent2].PrintOsob(N, M, path, matrV, rch); if (rand.Next(0, 100) <= cros) //будет кроссовер или нет { sw = fi.AppendText(); sw.WriteLine("Для данных особей кроссовер произошёл"); sw.Close(); Osob child1 = new Osob(N, M); Osob child2 = new Osob(N, M); for (int i = 0; i < generation[parent1].osob.Count; i++) { if (i < point) { child1.osob[i].size = generation[parent1].osob[i].size; child2.osob[i].size = generation[parent2].osob[i].size; } } // child1.addition(lstStock, lstOrder, N, M, point); // child2.addition(lstStock, lstOrder, N, M, point); child1.addition2(generation[parent2], lstStock, lstOrder, N, M, point); child2.addition2(generation[parent1], lstStock, lstOrder, N, M, point); sw = fi.AppendText(); sw.WriteLine("Первый потомок: "); sw.Close(); child1.PrintOsob(N, M, "pract.txt", matrV, rch); sw = fi.AppendText(); sw.WriteLine("Второй потомок: "); sw.Close(); child2.PrintOsob(N, M, "pract.txt", matrV, rch); if (rand.Next(0, 100) <= mut) //будет мутация над потомком { sw = fi.AppendText(); sw.WriteLine("Произошла мутация первого потомка "); sw.Close(); MutationOrder(child1, N, M, lstStock, lstOrder); } if (rand.Next(0, 100) <= mut) //будет мутация над потомком { sw = fi.AppendText(); sw.WriteLine("Произошла мутация второго потомка "); sw.Close(); MutationOrder(child2, N, M, lstStock, lstOrder); } //добавляем потомков generation.Add(child1); generation.Add(child2); } }