Переписать функцию без использования битового сдвига - C#
Формулировка задачи:
Здравствуйте , нужно заменить побитовый сдвиг в функции Crossover, так чтобы эта функция вертала тот же результат , что с побитовым сдвигом.
вот код:
static Random random = new Random((int)DateTime.Now.Ticks); static double f(int x) { return x * x; } static void Crossover(ref int a, ref int b) { int pointA = random.Next(0, 5), pointB = random.Next(pointA, 5); int resA = 0, resB = 0; for (int i = 0; i < 5; i++) { if (i < pointA || i > pointB) { resA |= a & (1 << i); resB |= b & (1 << i); } else { resA |= b & (1 << i); resB |= a & (1 << i); } } a = resA; b = resB; } static void Main(string[] args) { int[] chroms = new int[4]; //Создание начальной популяции for (int i = 0; i < 4; i++) chroms[i] = random.Next(0, 32); for (int iteration = 0; iteration < 4; iteration++) { //Вычисление фитнес-функции и весы лице double[] fittness = new double[4]; double[] chance = new double[4]; double sum = 0; for (int i = 0; i < 4; i++) { fittness[i] = f(chroms[i]); sum += fittness[i]; } for (int i = 0; i < 4; i++) chance[i] = fittness[i] / sum; //Выбор новой популяции int[] newChroms = new int[4]; for (int i = 0; i < 4; i++) { double roulette = random.NextDouble(); sum = 0; for (int j = 0; j < 4; j++) { sum += chance[j]; if (roulette < sum) { newChroms[i] = chroms[j]; break; } } } chroms = (int[])newChroms.Clone(); //Кросинговер for (int i = 0; i < 2; i++) Crossover(ref chroms[i], ref chroms[3 - i]); //Mутация int chrom = random.Next(0, 4), pos = random.Next(0, 5); chroms[chrom] ^= (1 << pos); } Console.WriteLine(chroms.Max()); Console.ReadKey();
Решение задачи: «Переписать функцию без использования битового сдвига»
textual
Листинг программы
(int)Math.Pow(2,i)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д