Ejemplo n.º 1
0
    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);
    }