/// <summary> /// Crossover operator. /// </summary> /// /// <param name="pair">Pair chromosome to crossover with.</param> /// /// <remarks><para>The method performs crossover between two chromosomes interchanging /// range of genes (array elements) between these chromosomes.</para></remarks> /// public override void Crossover(AForge.Genetic.IChromosome pair) { ModelItemArrayChromosome p = (ModelItemArrayChromosome)pair; // check for correct pair if ((p != null) && (p.Mic.Length == Mic.Length)) { // crossover point int crossOverPoint = rand.Next(Mic.Length - 1) + 1; // length of chromosome to be crossed int crossOverLength = Mic.Length - crossOverPoint; // temporary array uint[] temp1 = new uint[crossOverLength]; uint[] temp2 = new uint[crossOverLength]; ObjectItem[] temp3 = new ObjectItem[crossOverLength]; // copy part of first (this) chromosome to temp Array.Copy(start, crossOverPoint, temp1, 0, crossOverLength); Array.Copy(end, crossOverPoint, temp2, 0, crossOverLength); Array.Copy(Micp, crossOverPoint, temp3, 0, crossOverLength); // copy part of second (pair) chromosome to the first Array.Copy(p.start, crossOverPoint, start, crossOverPoint, crossOverLength); Array.Copy(p.end, crossOverPoint, end, crossOverPoint, crossOverLength); Array.Copy(p.Micp, crossOverPoint, Micp, crossOverPoint, crossOverLength); // copy temp to the second Array.Copy(temp1, 0, p.start, crossOverPoint, crossOverLength); Array.Copy(temp2, 0, p.end, crossOverPoint, crossOverLength); Array.Copy(temp3, 0, p.Micp, crossOverPoint, crossOverLength); } }
public double Evaluate(AForge.Genetic.IChromosome chromosome) { uint[] Start = (uint[])((ModelItemArrayChromosome)chromosome).Start; uint[] End = (uint[])((ModelItemArrayChromosome)chromosome).End; ModelItem[] Mic = (ModelItem[])((ModelItemArrayChromosome)chromosome).ModelItems; ModelItemCollection SItems = ((ModelItemArrayChromosome)chromosome).SItems; ObjectItem[] Micp = ((ModelItemArrayChromosome)chromosome).DyamicProperties; int[] t = new int[Mic.Length]; int k; for (k = 0; k < t.Length; k++) { t[k] = k; } Array.Sort((uint[])Start.Clone(), t); uint[] EDTS = (uint[])End.Clone(); Array.Sort(EDTS); Double[] Vol = new double[((ModelItemArrayChromosome)chromosome).Length + 1]; k = 0; for (uint dt = Start[0]; dt <= EDTS[EDTS.Length - 1]; dt++, k++) { Vol[k] = getIntersectsVolume(Mic, Micp, SItems, dt, Start, End, t); } return(-getMaxVolume(Vol)); }