Example #1
0
        void PrintOsob(Osob osob)
        {
            StreamWriter sw;
            FileInfo     fi = new FileInfo(path);

            sw = fi.AppendText();
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < M; j++)
                {
                    richTextBox1.Text += osob.osob[M * i + j].size + "   ";
                    sw.Write(osob.osob[M * i + j].size + "   ");
                }
                richTextBox1.Text += "\n";
                sw.WriteLine();
            }
            sw.Write("Стоимость перевозки по данному маршруту: " + osob.cost(MatrVesov));
            richTextBox1.Text += "Стоимость перевозки по данному маршруту: " + osob.cost(MatrVesov);
            richTextBox1.Text += "\n";
            sw.WriteLine();
            sw.Close();
        }
Example #2
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";
        }