Пример #1
0
        /// <summary>
        /// Скрещивание при целочисленном кодировании
        /// </summary>
        /// <param name="Input">Популяция</param>
        /// <returns>Возвращает популяцию потомков</returns>
        private Population CrossoverINT(Population Input)
        {
            int        numBit, numGen, numInd1 = 0, numInd2 = 0;
            Population Result = new Population();

            while (Result.GetCountInd() < CountInd)
            {
                //Генерация бита, с которого начнется одноточечное скрещивание
                numBit = GeneticAlgorithm.rand.Next(GenLen);
                numGen = GeneticAlgorithm.rand.Next(CountParam);
                do
                {
                    //генерация номеров особей, который будут скрещиваться
                    numInd1 = GeneticAlgorithm.rand.Next(CountInd);
                    numInd2 = GeneticAlgorithm.rand.Next(CountInd);
                } while (numInd1 == numInd2);

                //если особи скрещиваются
                if (GeneticAlgorithm.rand.NextDouble() < Pc)
                {
                    Result.add(new Individual(CountParam, Input.individuals[numInd1]));
                    Result.add(new Individual(CountParam, Input.individuals[numInd2]));

                    for (int i = numBit; i < GenLen; i++)
                    {
                        Swap(ref Result.individuals[Result.GetCountInd() - 1].chromosome[numGen].code[numBit], ref Result.individuals[Result.GetCountInd() - 2].chromosome[numGen].code[numBit]);
                    }

                    for (int i = numGen + 1; i < CountParam; i++)
                    {
                        for (int j = 0; j < GenLen; j++)
                        {
                            Swap(ref Result.individuals[Result.GetCountInd() - 1].chromosome[i].code[j], ref Result.individuals[Result.GetCountInd() - 2].chromosome[i].code[j]);
                        }
                    }

                    Result.individuals[Result.GetCountInd() - 1].CalcFitness();
                    Result.individuals[Result.GetCountInd() - 2].CalcFitness();
                }

                //Если особи не скрещиваются
                else
                {
                    Result.add(new Individual(CountParam, Input.individuals[numInd1]));
                    Result.add(new Individual(CountParam, Input.individuals[numInd2]));
                }
            }

            return(Result);
        }
Пример #2
0
        /// <summary>
        /// Оператор популяционного всплеска
        /// </summary>
        /// <param name="Input">Исходная популяция</param>
        /// <returns>Возвращает популяцию после популяционного всплеска</returns>
        Population PopulationOutbreak(Population Input)
        {
            Population Result = new Population();

            for (int i = 0; i < (int)(CountInd / 2); i++)
            {
                Result.add(Input.individuals[i]);
            }

            for (int i = (int)(CountInd / 2); i < CountInd; i++)
            {
                if (intcode)
                {
                    Result.add(new Individual(CountParam, GenLen, Xmin, Xmax, func));
                }
                else
                {
                    Result.add(new Individual(CountParam, Xmin, Xmax, func));
                }
            }

            return(Result);
        }
Пример #3
0
        /// <summary>
        /// Селекция
        /// </summary>
        /// <param name="input">Популяция</param>
        /// <returns>Возвращает отобранные особи</returns>
        private Population Selection(Population input)
        {
            Population Result = new Population();

            int[] numberInd = new int[tournament];
            while (Result.GetCountInd() < CountInd)
            {
                //Выбор номеров особей для турнира
                for (int i = 0; i < tournament; i++)
                {
                    numberInd[i] = GeneticAlgorithm.rand.Next(CountInd);
                }

                Result.add(input.individuals[Min(numberInd)]);
            }

            return(Result);
        }
Пример #4
0
        /// <summary>
        /// Уплотнение сетки целочисленного кодирования
        /// </summary>
        /// <param name="p">Исходная популяция</param>
        /// <returns>Возвращает новую популяцию</returns>
        private Population MeshSeal(Population Input)
        {
            Population Result = new Population();

            this.GenLen = this.GenLen + this.Ubit;
            double value;

            for (int i = 0; i < CountInd; i++)
            {
                Result.add(Input.individuals[i]);
                for (int j = 0; j < CountParam; j++)
                {
                    value = Result.individuals[i].chromosome[j].GetValue();
                    Result.individuals[i].chromosome[j] = new Gene(value, GenLen, Xmin, Xmax);
                    value = value = Result.individuals[i].chromosome[j].GetValue();
                }
            }
            return(Result);
        }