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