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); }
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(); }
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); }
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); }
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]); }