コード例 #1
0
        public void Evolve_ManyGenerations_Fast()
        {
            var selection = new EliteSelection();
            var crossover = new ThreeParentCrossover();
            var mutation  = new UniformMutation(true);

            var fitness = new FunctionBuilderFitness(
                new FunctionBuilderInput(
                    new double[] { 1, 2 },
                    3)
                ,
                new FunctionBuilderInput(
                    new double[] { 2, 3 },
                    5)
                );
            var chromosome = new FunctionBuilderChromosome(fitness.AvailableOperations, 3);

            var population = new Population(100, 200, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new OrTermination(new FitnessThresholdTermination(0), new TimeEvolvingTermination(TimeSpan.FromSeconds(15)));
            ga.Start();
            var bestChromosome = ga.BestChromosome as FunctionBuilderChromosome;

            Assert.AreEqual(0.0, bestChromosome.Fitness.Value);
            var actual = fitness.GetFunctionResult(
                bestChromosome.BuildFunction(),
                new FunctionBuilderInput(new double[] { 3, 4 }, 7)
                );

            Assert.AreEqual(7, actual);
        }
コード例 #2
0
        static void Main(string[] args)
        {
            // Problem: Simple addition
            // 1 + 1 = 2
            // 2 + 2 = 4
            // 3 + 2 = 5
            var myInputs = new List <FunctionBuilderInput>
            {
                new FunctionBuilderInput(new List <double> {
                    1, 1
                }, 2),
                new FunctionBuilderInput(new List <double> {
                    2, 2
                }, 4),
                new FunctionBuilderInput(new List <double> {
                    3, 2
                }, 5)
            };
            var myFitness    = new FunctionBuilderFitness(myInputs.ToArray());
            var myChromosome = new FunctionBuilderChromosome(myFitness.AvailableOperations, 5);
            var selection    = new EliteSelection();
            var crossover    = new ThreeParentCrossover();
            var mutation     = new UniformMutation(true);
            var fitness      = myFitness;
            var chromosome   = myChromosome;
            var population   = new Population(100, 200, chromosome)
            {
                GenerationStrategy = new PerformanceGenerationStrategy()
            };
            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new FitnessThresholdTermination(0)
            };

            ga.GenerationRan += delegate
            {
                Console.Clear();
                var bestChromosome = ga.Population.BestChromosome;
                Console.WriteLine("Generations: {0}", ga.Population.GenerationsNumber);
                Console.WriteLine("Fitness: {0,10}", bestChromosome.Fitness);
                Console.WriteLine("Time: {0}", ga.TimeEvolving);
                Console.WriteLine("Speed (gen/sec): {0:0.0000}", ga.Population.GenerationsNumber / ga.TimeEvolving.TotalSeconds);
                var best = bestChromosome as FunctionBuilderChromosome;
                Console.WriteLine("Function: {0}", best.BuildFunction());
            };
            ga.Start();
            Console.WriteLine("Evolved.");
            Console.ReadKey();
        }
コード例 #3
0
        public void Evaluate_AllResultsEquals_MaxFitness()
        {
            var target = new FunctionBuilderFitness(
                new FunctionBuilderInput(new double[] { 1 }, 1),
                new FunctionBuilderInput(new double[] { 2 }, 2));

            var c = new FunctionBuilderChromosome(target.AvailableOperations, 2);

            c.ReplaceGene(0, new Gene("A"));
            c.ReplaceGene(1, new Gene(""));

            var actual = target.Evaluate(c);

            Assert.AreEqual(0, actual);
        }
コード例 #4
0
        public void Evaluate_InvalidFunction_WorstFitness()
        {
            var target = new FunctionBuilderFitness(
                new FunctionBuilderInput(new double[] { 1 }, 2),
                new FunctionBuilderInput(new double[] { 1 }, 3));

            var c = new FunctionBuilderChromosome(target.AvailableOperations, 2);

            c.ReplaceGene(0, new Gene("-"));
            c.ReplaceGene(1, new Gene(""));

            var actual = target.Evaluate(c);

            Assert.AreEqual(double.MinValue, actual);
        }
コード例 #5
0
        public void BuildAvailableOperations_ParametersCount_AvailableOperations()
        {
            var actual = FunctionBuilderChromosome.BuildAvailableOperations(4);

            Assert.AreEqual(10, actual.Count);

            Assert.AreEqual("", actual[0]);
            Assert.AreEqual("+", actual[1]);
            Assert.AreEqual("-", actual[2]);
            Assert.AreEqual("/", actual[3]);
            Assert.AreEqual("*", actual[4]);
            Assert.AreEqual("__INT__", actual[5]);
            Assert.AreEqual("A", actual[6]);
            Assert.AreEqual("B", actual[7]);
            Assert.AreEqual("C", actual[8]);
            Assert.AreEqual("D", actual[9]);
        }