예제 #1
0
        /// <summary>
        /// Simulates a tuner run for the specified number of generations and stores results in a new <see cref="TrainingDataWrapper"/>.
        /// </summary>
        /// <param name="tree"><see cref="ParameterTree"/> to base genomes on.</param>
        /// <param name="encoder">Strategy to convert genomes to double arrays.</param>
        /// <param name="genomeCount">Number of genomes to add to result per generation.</param>
        /// <param name="generations">Number of generations to simulate.</param>
        /// <param name="config"><see cref="AlgorithmTunerConfiguration"/>, required to generate new genomes.</param>
        /// <returns>The created <see cref="TrainingDataWrapper"/>.</returns>
        public static TrainingDataWrapper GenerateTrainingData(
            ParameterTree tree,
            IBulkGenomeTransformation encoder,
            int genomeCount,
            int generations,
            AlgorithmTunerConfiguration config)
        {
            var result = new TrainingDataWrapper(
                new Dictionary <Genome, List <GenomeTournamentRank> >(Genome.GenomeComparer),
                generations - 1);

            // Start with correct number of random genomes.
            var randomGenomes = TestDataUtils.GenerateGenomes(tree, config, genomeCount);

            // Then simulate the correct number of generations.
            for (var currentGen = 0; currentGen < generations; currentGen++)
            {
                var fitness = TestDataUtils.EvaluateTargetFunction(encoder, randomGenomes);

                // add result for every genome
                for (var genomeIndex = 0; genomeIndex < genomeCount; genomeIndex++)
                {
                    var currentGenome = randomGenomes[genomeIndex];
                    if (!result.TournamentResults.ContainsKey(currentGenome))
                    {
                        result.TournamentResults[currentGenome] = new List <GenomeTournamentRank>();
                    }

                    var tournamentResult = new GenomeTournamentRank()
                    {
                        GenerationId   = currentGen,
                        TournamentId   = currentGen,
                        TournamentRank = fitness[genomeIndex],
                    };

                    result.TournamentResults[currentGenome].Add(tournamentResult);
                }

                // swap out some genomes
                var replaceCount      = (int)Math.Ceiling(0.3 * genomeCount);
                var indiciesToReplace = Randomizer.Instance.ChooseRandomSubset(
                    Enumerable.Range(0, genomeCount),
                    replaceCount);

                var newGenomes       = TestDataUtils.GenerateGenomes(tree, config, replaceCount);
                var replacementIndex = 0;
                foreach (var indexToReplace in indiciesToReplace)
                {
                    randomGenomes[indexToReplace] = newGenomes[replacementIndex++];
                }
            }

            return(result);
        }
예제 #2
0
        public override void ReadFromFileDeserializesCorrectly()
        {
            /* Create status. */
            /* (1) population */
            var competitiveGenome = new Genome(2);

            competitiveGenome.SetGene("a", new Allele <int>(6));
            var nonCompetitiveGenome = new Genome(1);

            nonCompetitiveGenome.SetGene("b", new Allele <string>("oh"));
            this._population.AddGenome(competitiveGenome, isCompetitive: true);
            this._population.AddGenome(nonCompetitiveGenome, isCompetitive: false);
            // (2) counters
            int counter    = 12;
            int stagnation = 7;
            /* (3) ranks */
            var result = new GenomeTournamentRank
            {
                TournamentRank = 2,
                GenerationId   = 24,
                TournamentId   = 11,
            };
            var results = new List <GenomeTournamentRank> {
                result
            };
            var ranks = new Dictionary <Genome, List <GenomeTournamentRank> > {
                { new Genome(), results }
            };
            var status = new GgaStatus(this._population, counter, stagnation, ranks);

            /* Write and read it from file. */
            status.WriteToFile(this.StatusFilePath);
            var deserializedStatus = StatusBase.ReadFromFile <GgaStatus>(this.StatusFilePath);

            /* Check it's still the same. */
            /* (a) population */
            Assert.Equal(
                1,
                deserializedStatus.Population.GetCompetitiveIndividuals().Count);
            var deserializedCompetitiveGenome = deserializedStatus.Population.GetCompetitiveIndividuals().First();

            Assert.True(
                Genome.GenomeComparer.Equals(competitiveGenome, deserializedCompetitiveGenome),
                "Expected different competive genome.");
            Assert.Equal(
                competitiveGenome.Age,
                deserializedCompetitiveGenome.Age);
            Assert.Equal(
                1,
                deserializedStatus.Population.GetNonCompetitiveMates().Count);
            var deserializedNonCompetitiveGenome = deserializedStatus.Population.GetNonCompetitiveMates().First();

            Assert.True(
                Genome.GenomeComparer.Equals(nonCompetitiveGenome, deserializedNonCompetitiveGenome),
                "Expected different non-competive genome.");
            Assert.Equal(
                nonCompetitiveGenome.Age,
                deserializedNonCompetitiveGenome.Age);
            // counters
            Assert.Equal(
                counter,
                deserializedStatus.IterationCounter);
            Assert.Equal(
                stagnation,
                deserializedStatus.IncumbentKeptCounter);
            /* (c) ranks */
            var singleResult = deserializedStatus.AllKnownRanks.Single().Value.Single();

            Assert.Equal(result.GenerationId, singleResult.GenerationId);
            Assert.Equal(result.TournamentId, singleResult.TournamentId);
            Assert.Equal(result.TournamentRank, singleResult.TournamentRank);
        }