Ejemplo n.º 1
0
        public void CheckProperties()
        {
            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a))
            {
                Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.CrossoverProbabilityValue,
                                parameters.CrossoverProbability);
                Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.MutationProbabilityValue,
                                parameters.MutationProbability);
                Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.RunCountValue,
                                parameters.NumberOfGenerationRuns);
                Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.GenerationCountValue,
                                parameters.NumberOfGenerations);
                Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.PopulationSizeValue,
                                parameters.PopulationSize);
                Assert.AreEqual(Environment.ProcessorCount,
                                parameters.TaskCount);

                try
                {
                    var length = parameters.ChromosomeLength;
                    Assert.Fail();
                }
                catch (NotImplementedException)
                {
                }
                catch
                {
                    Assert.Fail();
                }
            }
        }
        public void Mutate()
        {
            var random = Substitute.For <SecureRandom>();

            var nextCallCount = 0;

            random.Next(Arg.Any <int>()).Returns((_) =>
            {
                var result = 0;

                if (nextCallCount == 0)
                {
                    result = 1;
                }
                else if (nextCallCount == 1)
                {
                    result = 0;
                }
                else
                {
                    throw new InvalidOperationException("Too many Next(int) calls.");
                }

                nextCallCount++;
                return(result);
            });
            random.NextDouble().Returns(0d);

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       new RandomObjectGenerator().Generate <ReadOnlyCollection <ExpressionEvolverResult> >(),
                       random))
            {
                Assert.AreEqual("a => (a + a)", parameters.Mutator(a => 3 + a).ToString());
            }
        }
Ejemplo n.º 3
0
        public void CreateWithFuncReturnNaNAndInfinity()
        {
            const double parameterResult = 3d;

            var count = 0;
            Func <double, double> func = a =>
            {
                var result = 0d;

                if (count == 0)
                {
                    result = double.NaN;
                }
                else if (count == 1)
                {
                    result = double.PositiveInfinity;
                }
                else
                {
                    result = parameterResult;
                }

                count++;
                return(result);
            };

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(func, 1, 1d))
            {
                Assert.AreEqual(3, count);
                Assert.AreEqual(1, parameters.Results.Count);
                Assert.AreEqual(parameterResult, parameters.Results[0].Result);
                Assert.AreEqual(-9.00000000000068E-06, parameters.AcceptableAverageMeanSquareError, 0.00000000001);
                Assert.AreEqual(9, parameters.ExceptionPenaltyFactor, 0.1);
            }
        }
 public void SelectFittestChildrenOnNullArgument()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                (a) => { return(a); }))
     {
         parameters.SelectFittestChildren(null);
     }
 }
Ejemplo n.º 5
0
        public void CheckTaskCountOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a)) { }

            var value = parameters.TaskCount;
        }
 public void CrossoverWithEmptyParents()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => a))
     {
         parameters.Crossover(new List <Chromosome <Expression <Func <double, double> > > >().AsReadOnly());
     }
 }
 public void EvaluateFitnessWithNullArgument()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => a))
     {
         parameters.FitnessEvaluator(null);
     }
 }
 public void CrossoverWithNullParents()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => a))
     {
         parameters.Crossover(null);
     }
 }
Ejemplo n.º 9
0
 public void TerminatorOnNullArgument()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                (a) => { return(a); }))
     {
         parameters.Terminator(null);
     }
 }
Ejemplo n.º 10
0
        public void CheckNumberOfGenerationsOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a)) { }

            var value = parameters.NumberOfGenerations;
        }
Ejemplo n.º 11
0
        public void CheckMutationProbabilityOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a)) { }

            var value = parameters.MutationProbability;
        }
Ejemplo n.º 12
0
        public void CreateViaResultsAndNullRandom()
        {
            var generator = new RandomObjectGenerator();
            var results   = generator.Generate <ReadOnlyCollection <ExpressionEvolverResult> >();

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       results, null)) { }
        }
 public void MutateWithNullArgument()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => a))
     {
         parameters.Mutator(null);
     }
 }
Ejemplo n.º 14
0
        public void CheckPopulationSizeOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a)) { }

            var value = parameters.PopulationSize;
        }
        public void MutateOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       a => a)) { }

            parameters.Mutator(null);
        }
        public void CrossoverOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       a => a)) { }

            parameters.Crossover(new List <Chromosome <Expression <Func <double, double> > > >().AsReadOnly());
        }
Ejemplo n.º 17
0
        static void Main()
        {
            //a => ((Math.Pow(a, 0.5) * a * a) + a);
            //a => (a + a) * ((a + a) / (a * a));
            //a => a * a * a;
            //a => a + a + a + Math.Pow(a, 0.5) + (a * a * a);
            //a => a - (a - Math.Pow(a,  0.5) + (a * a * Math.Pow(a, 0.5)) - a);
            //a => a - (Math.Pow(a, 0.5));
            //a => (4 - a) + (Math.Pow(a, 0.5) * 3);
            //a => (4 - a) + 3;
            //a => ((a / 4) - a) + (Math.Pow((33 * a), 0.5));
            //a => (1000 / Math.Pow(a, 0.5) * (a / 54));
            //a => (((47 + (a * a) / (3 - a) + (Math.Pow(2, a)))));
            //a => (-2 * Math.Pow(a, 3)) - (15 * Math.Pow(a, 2)) - (6 * a) + 7;
            //a => (a - 1) * Math.Pow((a - 4), 2);
            //a => (2 * Math.Pow(a, 4)) - (11 * Math.Pow(a, 3)) - (6 * Math.Pow(a, 2)) + (64 * a) + 32;

            Console.Out.WriteLine("Baking expression...");

            var baker = new Baker <Func <double, double> >(
                "a => (4 - a) + (Math.Pow(a, 0.5) * 3)");
            var func = baker.Bake();

            Console.Out.WriteLine("Target expression: " + func.ToString());

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(func.Compile()))
            {
                var ga = new GeneticAlgorithm <Expression <Func <double, double> > >(parameters);

                var generationCount    = 1;
                var generationRunCount = 1;

                var generationRunCompletedHandler = new EventHandler <EventArgs <Population <Expression <Func <double, double> > > > >(
                    (sender, e) =>
                {
                    Program.PrintPopulation(e.Value, generationRunCount, "Run");
                    generationRunCount++;
                });
                var generationCompletedHandler = new EventHandler <EventArgs <Population <Expression <Func <double, double> > > > >(
                    (sender, e) =>
                {
                    Program.PrintPopulation(e.Value, generationCount, "Generation");
                    generationCount++;
                });

                ga.GenerationCompleted    += generationCompletedHandler;
                ga.GenerationRunCompleted += generationRunCompletedHandler;
                ga.Run();
                ga.GenerationCompleted    -= generationCompletedHandler;
                ga.GenerationRunCompleted -= generationRunCompletedHandler;
                Console.Out.WriteLine(ga.WasOptimalSolutionFound);
                var best = (from chromosome in ga.Final.Chromosomes
                            orderby chromosome.Fitness descending
                            select chromosome).Take(1).FirstOrDefault();
                Console.Out.WriteLine(best.Value.ToString());
            }
        }
        public void GeneratePopulationOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       (a) => { return(a); })) { }

            parameters.GeneratePopulation();
        }
        public void SelectFittestChildrenOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       (a) => { return(a); })) { }

            parameters.SelectFittestChildren(null);
        }
Ejemplo n.º 20
0
        public void CopyOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       (a) => { return(a); })) { }

            parameters.Copy(a => a);
        }
Ejemplo n.º 21
0
 public void Copy()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                (a) => { return(a); }))
     {
         Expression <Func <double, double> > expression = a => a;
         Assert.AreSame(expression, parameters.Copy(expression));
     }
 }
        public void EvaluateFitnessOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       a => a)) { }

            parameters.FitnessEvaluator(null);
        }
Ejemplo n.º 23
0
        public void TerminatorOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       (a) => { return(a); })) { }

            parameters.Terminator(null);
        }
Ejemplo n.º 24
0
 public void CreateViaFunc()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => { return(a); }))
     {
         Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.ResultGenerationCount,
                         parameters.Results.Count);
     }
 }
Ejemplo n.º 25
0
        public void CreateViaResults()
        {
            var generator = new RandomObjectGenerator();
            var results   = generator.Generate <ReadOnlyCollection <ExpressionEvolverResult> >();

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(results))
            {
                CollectionAssert.AreEquivalent(results, parameters.Results);
            }
        }
        public void EvaluateFitness()
        {
            var results = new List <ExpressionEvolverResult> {
                new ExpressionEvolverResult(1d, 1d)
            }.AsReadOnly();

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       results))
            {
                Assert.AreEqual(0d, parameters.FitnessEvaluator(a => a));
            }
        }
        public void EvaluateFitnessWithExceptionAndResultExpectationIsException()
        {
            var results = new List <ExpressionEvolverResult> {
                new ExpressionEvolverResult(0d, new ArithmeticException())
            }.AsReadOnly();

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       results))
            {
                Assert.AreEqual(0d, parameters.FitnessEvaluator(a => (double)(1 / (int)a)));
            }
        }
Ejemplo n.º 28
0
        public void CreateViaFuncAndRandom()
        {
            var random = new SecureRandom();

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       (a) => { return(a); }, random))
            {
                Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.ResultGenerationCount,
                                parameters.Results.Count);
                Assert.AreSame(random, parameters.Random);
            }
        }
Ejemplo n.º 29
0
        public void Evolve()
        {
            this.IsEvolveEnabled = false;

            var baker = new Baker <Func <double, double> >(this.Expression);
            var func  = baker.Bake();

            var parameters      = new ExpressionEvolverGeneticAlgorithmParameters(func.Compile());
            var generationCount = 1;

            this.AcceptableFitnessValue = parameters.AcceptableAverageMeanSquareError.ToString("#.00");
            this.BaseLine = this.GetPoints(parameters.Results);

            this.worker = new BackgroundWorker();
            this.worker.WorkerReportsProgress = true;
            this.worker.RunWorkerCompleted   += (s, e) =>
            {
                var args = e.Result as Population <Expression <Func <double, double> > >;
                this.PrintPopulation(args, generationCount, parameters.Results);

                parameters.Dispose();
                this.IsEvolveEnabled = true;
            };

            this.worker.ProgressChanged += (ps, pe) =>
            {
                if (generationCount % 10 == 0)
                {
                    var args = pe.UserState as EventArgs <Population <Expression <Func <double, double> > > >;
                    this.PrintPopulation(args.Value, generationCount, parameters.Results);
                }

                generationCount++;
            };

            this.worker.DoWork += (s, e) =>
            {
                var ga = new GeneticAlgorithm <Expression <Func <double, double> > >(parameters);

                var generationCompletedHandler = new EventHandler <EventArgs <Population <Expression <Func <double, double> > > > >(
                    (gs, ge) =>
                {
                    this.worker.ReportProgress(0, ge);
                });
                ga.GenerationCompleted += generationCompletedHandler;
                ga.Run();
                ga.GenerationCompleted -= generationCompletedHandler;
                e.Result = ga.Final;
            };

            this.worker.RunWorkerAsync();
        }
        public void MutateWithNoMutation()
        {
            var random = Substitute.For <SecureRandom>();

            random.NextDouble().Returns(1d);

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       new RandomObjectGenerator().Generate <ReadOnlyCollection <ExpressionEvolverResult> >(),
                       random))
            {
                Assert.AreEqual("a => (3 + a)", parameters.Mutator(a => 3 + a).ToString());
            }
        }