/// <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); }
/// <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); }
/// <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); }
/// <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); }