public override void Crossover( IChromosome pair )
{
DoubleArrayChromosome p = (DoubleArrayChromosome) pair;
// 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;
}
}
}
}
}