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