Переписать функцию без использования битового сдвига - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д