public override void Crossover(IChromosome pair)
{
DoubleArrayChromosome p = (DoubleArrayChromosome)pair;
var rand = Generator.Random;
// check for correct pair
if ((p != null) && (p.length == length))
{
if (rand.NextDouble() < crossoverBalancer)
{
// crossover point
int crossOverPoint = rand.Next(length - 1) + 1;
// length of chromosome to be crossed
int crossOverLength = length - crossOverPoint;
// temporary array
double[] temp = new double[crossOverLength];
// copy part of first (this) chromosome to temp
Array.Copy(val, crossOverPoint, temp, 0, crossOverLength);
// copy part of second (pair) chromosome to the first
Array.Copy(p.val, crossOverPoint, val, crossOverPoint, crossOverLength);
// copy temp to the second
Array.Copy(temp, 0, p.val, crossOverPoint, crossOverLength);
}
else
{
double[] pairVal = p.val;
double factor = rand.NextDouble();
if (rand.Next(2) == 0)
factor = -factor;
for (int i = 0; i < length; i++)
{
double portion = (val[i] - pairVal[i]) * factor;
val[i] -= portion;
pairVal[i] += portion;
}
}
}
}
}