private void GenerateInitailPopulation(double[] populationEvaluation)
        {
            initialPopulationSize = populationEvaluation.Length;
            var initailPopulation = new IChromosome[initialPopulationSize];

            for (int i = 0; i < initailPopulation.Length; i++)
            {
                initailPopulation[i] = A.Fake <IChromosome>();
                A.CallTo(() => initailPopulation[i].ToString()).Returns("Initial Chromosome");
                A.CallTo(() => initailPopulation[i].Evaluate()).Returns(populationEvaluation[i]);
            }
            A.CallTo(() => populationGenerator.GeneratePopulation(A <int> ._)).Returns(initailPopulation);
        }
예제 #2
0
        public void K_PointCrossoverTest(int k)
        {
            var crossoverManager = new K_PointCrossoverManager <int>(k, A.Fake <IMutationManager <int> >(), A.Fake <IEvaluator>());

            for (int i = 0; i < TEST_RUNS; i++)
            {
                var chromosome1   = (VectorChromosome <int>)smallPopulationGenerator1.GeneratePopulation(1).First();
                var chromosome2   = (VectorChromosome <int>)smallPopulationGenerator2.GeneratePopulation(1).First();
                var newChromosome = (VectorChromosome <int>)crossoverManager.Crossover(chromosome1, chromosome2);

                var crossoverPoints = Utils.K_CrossoverGetCrossoverPointsAndAssertThatGenomesAreRight(newChromosome, chromosome2, chromosome1);
                Assert.AreEqual(k, crossoverPoints.Count,
                                $"Found wrong number of crossoverPoints. 1: {chromosome1}; 2 {chromosome2}; newChromosome {newChromosome}");
            }
        }
        public void UniformCrossoverManagerTest()
        {
            var crossoverManager = new UniformCrossoverManager <int>(A.Fake <IMutationManager <int> >(), A.Fake <IEvaluator>());

            for (int i = 0; i < TEST_RUNS; i++)
            {
                var chromosome1   = (VectorChromosome <int>)smallPopulationGenerator1.GeneratePopulation(1).First();
                var chromosome2   = (VectorChromosome <int>)smallPopulationGenerator2.GeneratePopulation(1).First();
                var newChromosome = (VectorChromosome <int>)crossoverManager.Crossover(chromosome1, chromosome2);

                Utils.K_CrossoverGetCrossoverPointsAndAssertThatGenomesAreRight(newChromosome, chromosome2, chromosome1);
            }
        }
예제 #4
0
        //public IList<Constraint> GetSynthesizedModel()
        //{
        //    return SynthesizedModel;
        //}

        //public IList<Constraint> GetReferenceModel()
        //{
        //    return Benchmark.Constraints;
        //}

        public virtual MathModel SynthesizeModel(Point[] trainingPoints)
        {
            var offspringPopulationSize = ExperimentParameters.OffspringPopulationSize;
            var numberOfGenerations     = ExperimentParameters.NumberOfGenerations;

            Evaluator.PositivePoints = trainingPoints.Where(tp => tp.ClassificationType == ClassificationType.Positive).ToArray();
            Evaluator.NegativePoints = trainingPoints.Where(tp => tp.ClassificationType == ClassificationType.Negative).ToArray();

            BasePopulation = PopulationGenerator.GeneratePopulation(ExperimentParameters);

            for (var i = 0; i < offspringPopulationSize; i++)
            {
                OffspringPopulation[i] = new Solution(ExperimentParameters);
            }

            InitialPopulation = BasePopulation.DeepCopyByExpressionTree();

            Stoper.Restart();

            for (var i = 0; i < numberOfGenerations; i++)
            {
                Evolve(offspringPopulationSize);
            }

            Stoper.Stop();

            Statistics.TotalEvolutionTime = Stoper.Elapsed;
            Statistics.MeanSingleGenerationEvolutionTime = TimeSpan.FromTicks(Statistics.TotalEvolutionTime.Ticks / numberOfGenerations);

            Stoper.Restart();

            SynthesizedModel = RedundantConstriantsRemover.ApplyProcessing(BasePopulation.First().GetConstraints(ExperimentParameters));

            Stoper.Stop();

            Statistics.RedundantConstraintsRemovingTime = Stoper.Elapsed;
            Statistics.TotalSynthesisTime = Statistics.TotalEvolutionTime + Stoper.Elapsed;

            Stoper.Reset();

            MathModel = new MathModel(SynthesizedModel, Benchmark);
            return(MathModel);
        }
예제 #5
0
        /// <summary>
        /// Test that the genomes in the chromosome are within range, and that they are dispersed.
        /// </summary>
        public static void TestChromosomes <T>(this IPopulationGenerator populationGenerator, int minGenome, int maxGenome)
        {
            var chromosomes    = populationGenerator.GeneratePopulation(20);
            var recivedGenomes = new HashSet <int>();

            foreach (var chromosome in chromosomes)
            {
                var vectorChromosome = (VectorChromosome <T>)chromosome;
                foreach (var genome in vectorChromosome.GetVector())
                {
                    var intGenome = genome.ToInt();
                    Assert.IsTrue(intGenome >= minGenome, $"Got a genome smaller than {minGenome} ({intGenome})");
                    Assert.IsTrue(intGenome <= maxGenome, $"Got a genome bigger than {maxGenome} ({intGenome})");
                    recivedGenomes.Add(intGenome);
                }
            }
            for (int i = minGenome; i < maxGenome; i++)
            {
                Assert.IsTrue(recivedGenomes.Contains(i), $"Didn't get {i}");
            }
        }
예제 #6
0
        /// <summary>
        /// Starts the algorithm's number (<see cref="Generation"/> + 1) iteration.
        /// </summary>
        private void StartIteration()
        {
            ++Generation;

            if (Generation == 1)
            {
                if (initialChromosomeBrain != null)
                {
                    CurrentPopulation = populationGenerator.GenerateFirstPopulation(PopulationSize, initialChromosomeBrain);
                }
                else
                {
                    CurrentPopulation = populationGenerator.GenerateFirstPopulation(PopulationSize);
                }
            }
            else
            {
                CurrentPopulation = populationGenerator.GeneratePopulation(CurrentPopulation, Generation);
            }

            fitnessEvaluator.StartEvaluation(CurrentPopulation);
        }
예제 #7
0
 private IEnumerable <Individual> InitializePopulation(int size)
 {
     return(_populationGenerator.GeneratePopulation(size, _simulationParameters));
 }
 private IChromosome[] CreateNewGeneration(Population population, int generation, IEnvironment environment)
 {
     return(generation == 0
         ? populationGenerator.GeneratePopulation(options.PopulationSize).ToArray()
         : GenerateChildren(population, generation, environment));
 }