Ejemplo n.º 1
0
        public void GetPopulations(int NumGenerations, int stop)
        {
            bool block = false;//блокировка ограничений на количество итераций, по умолчанию блок выключен
            int  count = 0;

            if (stop > 0)
            {
                block = true;
                count = 0;//счетчик
            }
            //---------объявления-------------
            Day[]  mainPerson = new Day[6]; // основная особь, в начале необходимо скопировать в неё экземпляр из первого поколения
            double mainMark;                // оценка основной особи, с которой происходит сравнение при отборе

            //---------присваивания-------------
            for (int i = 0; i < 6; i++)
            {
                mainPerson[i] = new Day(main.days[i]);
            }

            mainMark    = main.firstmark;
            unicLessons = main.unicLessons;
            generations = main.generations;

            //вырастим numPopulations поколений
            for (int j = 0; j < NumGenerations; j++)
            {
                List <Day[]> population = new List <Day[]>();//популяция из нескольких особей
                string[]     names      = new string[15];
                double[]     marks      = new double[15];

                //возьмем основную особь и составим 15 вариантов её скрещивания по заранее составленной схеме
                for (int i = 0; i < 15; i++)
                {
                    Day[] person = new Day[6];
                    for (int k = 0; k < 6; k++)
                    {
                        person[k] = new Day();
                    }

                    person = GetNewGeneration(mainPerson, i);

                    Rating ratio = new Rating(person, main.maxStack, unicLessons);

                    names[i] = "популяция #" + (j + 1) + "  особь под номером #" + ((j * 15) + (i + 1));
                    marks[i] = ratio.TotalMark();//считаем общую оценку особи
                    person   = ratio.InputMarksAndDays();

                    population.Add(person);
                }

                int index = -1;

                for (int i = 0; i < 15; i++)
                {
                    if (mainMark > marks[i])
                    {
                        mainMark = marks[i];
                        index    = i;
                    }
                }



                if (index != -1)//если родительская особь лучше своих поколений, то все поколение бракуется | иначе назначается новая особь, а результат добавляется в список поколений
                {
                    if (block)
                    {
                        count = 0;       //обнуление счетчика
                    }
                    for (int i = 0; i < 6; i++)
                    {
                        mainPerson[i] = new Day(population[index][i]);
                    }

                    Generations generic = new Generations(names[index]);
                    generic.mark = mainMark;
                    generic.Input(mainPerson);

                    generations.Add(new Generations(generic));//добавляем новую особь в список
                }

                if (block)
                {
                    count++;
                    if (count == stop)
                    {
                        j = NumGenerations;               //если в течение <stop> не было улучшений, то выходим из цикла
                    }
                }
            }
        }