예제 #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>
        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);
        }