示例#1
0
        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";
        }
示例#2
0
        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);
            }
        }