Переписать функцию без использования битового сдвига - 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)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы