public void ConstructorThrowsExceptionOnMissingConfiguration() { Assert.Throws <ArgumentNullException>( () => new GenomeBuilder( parameterTree: GenomeBuilderTest.BuildParameterTree(), configuration: null)); }
/// <summary> /// Creates a genome builder with a custom <see cref="GenomeBuilder.IsGenomeValid(Genome)"/> function and a /// custom mutation rate. /// </summary> /// <param name="mutationRate">The mutation rate.</param> /// <param name="isValidFunction">What to check for <see cref="GenomeBuilder.IsGenomeValid(Genome)"/>.</param> /// <returns>The genome builder.</returns> private static GenomeBuilder CreateCustomGenomeBuilder(double mutationRate, Func <Genome, bool> isValidFunction) { return(new GenomeBuilders.ConfigurableGenomeBuilder( GenomeBuilderTest.BuildParameterTree(), isValidFunction, mutationRate)); }
public void DefaultGenomeUsesDefaultValues() { var tree = GenomeBuilderTest.BuildParameterTree(true); var builder = new GenomeBuilder( tree, new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder().Build(maximumNumberParallelEvaluations: 1)); var defaultGenome = builder.CreateDefaultGenome(1337); Assert.NotNull(defaultGenome); Assert.Equal(1337, defaultGenome.Age); // GenomeBuilderTest.ContinuousParameter should not be active, since "a" node is the default. var filteredGenes = defaultGenome.GetFilteredGenes(tree); Assert.Equal(3, filteredGenes.Count); Assert.Equal("a", filteredGenes[GenomeBuilderTest.DecisionParameter].GetValue()); Assert.Equal(1, filteredGenes[GenomeBuilderTest.SmallValueParameter].GetValue()); Assert.Equal(42, filteredGenes[GenomeBuilderTest.DiscreteParameter].GetValue()); // GenomeBuilderTest.ContinuousParameter should also have a default value, even though it is not active. var contAllele = defaultGenome.GetGeneValue(GenomeBuilderTest.ContinuousParameter); Assert.NotNull(contAllele); Assert.Equal(0.2, contAllele.GetValue()); }
/// <summary> /// Creates a simple <see cref="GenomeBuilder"/> that has a mutation rate of 0 and uses the parameter tree from /// <see cref="GenomeBuilderTest.BuildParameterTree"/>. /// </summary> /// <returns>The genome builder.</returns> private static GenomeBuilder CreateGenomeBuilderWithoutRandomMutation() { var configuration = new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder() .SetMutationRate(0) .Build(maximumNumberParallelEvaluations: 1); return(new GenomeBuilder(GenomeBuilderTest.BuildParameterTree(), configuration)); }
public void MutateMayChangeEveryParameter() { // Create genome builder with a mutation rate of 1. var configuration = new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder() .SetMutationRate(1) .Build(maximumNumberParallelEvaluations: 1); var genomeBuilder = new GenomeBuilder(GenomeBuilderTest.BuildParameterTree(), configuration); // Create genome. var genome = GenomeBuilderTest.BuildFittingGenome(); // Prepare structure to store which values have been mutated. string[] identifiers = { GenomeBuilderTest.DecisionParameter, GenomeBuilderTest.SmallValueParameter, GenomeBuilderTest.DiscreteParameter, GenomeBuilderTest.ContinuousParameter, }; Dictionary <string, bool> hasBeenMutated = identifiers.ToDictionary( identifier => identifier, identifier => false); Dictionary <string, IAllele> originalValues = identifiers.ToDictionary( identifier => identifier, identifier => genome.GetGeneValue(identifier)); // Do a lot of mutations. for (int i = 0; i < GenomeBuilderTest.loopCountForRandomTests; i++) { genomeBuilder.Mutate(genome); // After each one, check which genes have changed... foreach (string identifier in identifiers) { bool valueChanged = !object.Equals(originalValues[identifier], genome.GetGeneValue(identifier)); if (valueChanged) { // ...and store them. hasBeenMutated[identifier] = true; } } } // Finally check that everything has been changed at least once. Assert.True( hasBeenMutated.All(keyValuePair => keyValuePair.Value), $"Genes {TestUtils.PrintList(hasBeenMutated.Where(keyValuePair => !keyValuePair.Value).Select(keyValuePair => keyValuePair.Key))} have not been mutated."); }
public void MutateChangesGivenGenomeIfMutationRateIs1() { // Create genome builder with a mutation rate of 1. var configuration = new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder() .SetMutationRate(1) .Build(maximumNumberParallelEvaluations: 1); var genomeBuilder = new GenomeBuilder(GenomeBuilderTest.BuildParameterTree(), configuration); // Build a fitting genome and store original description. var genome = GenomeBuilderTest.BuildFittingGenome(); string originalDescription = genome.ToString(); // Call mutate and check genome changed. genomeBuilder.Mutate(genome); Assert.NotEqual( originalDescription, genome.ToString()); }
public void MutateRespectsMutationRate() { // Create genome builder with a mutation rate of 0.35. double mutationRate = 0.35; var configuration = new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder() .SetMutationRate(mutationRate) .Build(maximumNumberParallelEvaluations: 1); var genomeBuilder = new GenomeBuilder(GenomeBuilderTest.BuildParameterTree(), configuration); // Create genome. var genome = GenomeBuilderTest.BuildFittingGenome(); // For a lot of iterations: IAllele oldGeneValue = genome.GetGeneValue(GenomeBuilderTest.ContinuousParameter); int changeCount = 0; int numberLoops = 1000; for (int i = 0; i < numberLoops; i++) { // Mutate the genome ... genomeBuilder.Mutate(genome); // ... compare the continuous parameter gene... IAllele newGeneValue = genome.GetGeneValue(GenomeBuilderTest.ContinuousParameter); if (!object.Equals(newGeneValue, oldGeneValue)) { changeCount++; } // ... and count the number of times it changes. oldGeneValue = newGeneValue; } // Finally compare the number of mutations with the expected number. double expectedNumberMutations = mutationRate * numberLoops; Assert.True( Math.Abs(expectedNumberMutations - changeCount) <= 0.1 * expectedNumberMutations, "Number of mutations was not as expected."); }
/// <summary> /// Creates a simple <see cref="GenomeBuilder"/> that uses the parameter tree from /// <see cref="GenomeBuilderTest.BuildParameterTree"/>. /// </summary> /// <returns>The genome builder.</returns> private static GenomeBuilder CreateGenomeBuilder() { return(new GenomeBuilder( GenomeBuilderTest.BuildParameterTree(), new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder().Build(maximumNumberParallelEvaluations: 1))); }
/// <summary> /// Creates a simple <see cref="GenomeBuilder"/> that uses the parameter tree from /// <see cref="GenomeBuilderTest.BuildParameterTree"/>. /// </summary> /// <param name="includeDefaultValues">Indicates whether to add default values to the domains.</param> /// <returns>The genome builder.</returns> private static GenomeBuilder CreateGenomeBuilder(bool includeDefaultValues = false) { return(new GenomeBuilder( GenomeBuilderTest.BuildParameterTree(includeDefaultValues), new AlgorithmTunerConfiguration.AlgorithmTunerConfigurationBuilder().Build(maximumNumberParallelEvaluations: 1))); }