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