/// <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));
        }