public void PerformsDnaCrossover() { // Arrange const int nInputs = 7; const int nOutputs = 4; const int outputLayerActivationIndex = 3; int[] hiddenLayers = new int[] { 7, 1, 4, 7 }; Dna parent1Dna = Dna.GenerateRandomDnaEncoding(nInputs, hiddenLayers, nOutputs, (ActivationType)outputLayerActivationIndex, true); Dna parent2Dna = Dna.GenerateRandomDnaEncoding(nInputs, hiddenLayers, nOutputs, (ActivationType)outputLayerActivationIndex, true); // Act List <Dna> offspring = Dna.CreateOffspring(parent1Dna, parent2Dna, 5, true); // Assert offspring.Should().HaveCount(2); CheckDnaIsNotReferentiallyEqual(offspring[0], offspring[1]); foreach (var child in offspring) { CheckDnaIsNotReferentiallyEqual(child, parent1Dna); CheckDnaIsNotReferentiallyEqual(child, parent2Dna); child.OutputsPerLayer.Should().Equal(parent1Dna.OutputsPerLayer); child.WeightsAndBiases.Should().HaveCount(parent1Dna.WeightsAndBiases.Count); child.WeightsAndBiases.Should().NotBeEquivalentTo(parent1Dna.WeightsAndBiases); child.WeightsAndBiases.Should().NotBeEquivalentTo(parent2Dna.WeightsAndBiases); child.ActivationIndexes.Should().HaveCount(parent1Dna.ActivationIndexes.Count); child.ActivationIndexes.Should().NotBeEquivalentTo(parent1Dna.ActivationIndexes); child.ActivationIndexes.Should().NotBeEquivalentTo(parent2Dna.ActivationIndexes); child.Heritage.Should().Be(DnaHeritage.Offspring); } double offspringTotalWeights = offspring[0].WeightsAndBiases.Sum() + offspring[1].WeightsAndBiases.Sum(); double parentsTotalWeights = parent1Dna.WeightsAndBiases.Sum() + parent2Dna.WeightsAndBiases.Sum(); parentsTotalWeights.Should().Be(offspringTotalWeights); int offspringTotalActivation = offspring[0].ActivationIndexes.Sum() + offspring[1].ActivationIndexes.Sum(); int parentsTotalActivation = parent1Dna.ActivationIndexes.Sum() + parent2Dna.ActivationIndexes.Sum(); offspringTotalActivation.Should().Be(parentsTotalActivation); }