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()); } }
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); } }
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); } }
public void TerminatorOnNullArgument() { using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters( (a) => { return(a); })) { parameters.Terminator(null); } }
public void CheckNumberOfGenerationsOnDisposedObject() { ExpressionEvolverGeneticAlgorithmParameters parameters = null; using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a)) { } var value = parameters.NumberOfGenerations; }
public void CheckMutationProbabilityOnDisposedObject() { ExpressionEvolverGeneticAlgorithmParameters parameters = null; using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(a => a)) { } var value = parameters.MutationProbability; }
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); } }
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()); }
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); }
public void CopyOnDisposedObject() { ExpressionEvolverGeneticAlgorithmParameters parameters = null; using (parameters = new ExpressionEvolverGeneticAlgorithmParameters( (a) => { return(a); })) { } parameters.Copy(a => a); }
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); }
public void TerminatorOnDisposedObject() { ExpressionEvolverGeneticAlgorithmParameters parameters = null; using (parameters = new ExpressionEvolverGeneticAlgorithmParameters( (a) => { return(a); })) { } parameters.Terminator(null); }
public void CreateViaFunc() { using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters( a => { return(a); })) { Assert.AreEqual(ExpressionEvolverGeneticAlgorithmParameters.ResultGenerationCount, parameters.Results.Count); } }
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))); } }
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); } }
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()); } }