public Chromosome(IElementProvider elementProvider, IRandomNumberGenerator randomNumberGenerator, Element[] startingElements = null)
        {
            this.randomNumberGenerator = randomNumberGenerator;
            this.elementProvider = elementProvider;

            PopulateElements(startingElements);
            PostInitialisation();
        }
        private void PopulateElements(Element[] startingElements)
        {
            elements = new Element[elementProvider.Size];

            if (startingElements != null)
                startingElements.CopyTo(elements, 0);
            else
            {
                elementProvider.Elements.CopyTo(elements, 0);

                for (int i = 0; i < Elements.Length; i++)
                {
                    if (randomNumberGenerator.NextDouble() < Chromosome.InitialMutationRate)
                        Elements[i].Active = true;
                }
            }
        }
        public IChromosome[] MateWith(IChromosome other)
        {
            Element[] child1 = new Element[elementProvider.Size];
            Element[] child2 = new Element[elementProvider.Size];

            int pivot = randomNumberGenerator.Next(elementProvider.Size);

            for (int i = 0; i < pivot; i++)
            {
                child1[i] = this.Elements[i];
                child2[i] = other.Elements[i];
            }

            for (int i = pivot; i < elementProvider.Size; i++)
            {
                child1[i] = other.Elements[i];
                child2[i] = this.Elements[i];
            }

            return new[] { new Chromosome(elementProvider, randomNumberGenerator, child1), new Chromosome(elementProvider, randomNumberGenerator, child2) };
        }