public void AdditionByZeroTest() { GetConverter(out var varX, out _); var prog1 = new AdditionFunction(varX, Constant.Zero); var prog2 = varX; var simp = prog1.Simplify(); Console.WriteLine($"{prog1}->{simp}, {prog2}"); Assert.AreEqual(simp, prog2, $"{prog1} simplification ({simp}) should be equal to {prog2}"); }
public void NotEqualsSimilarTest() { var converter = GetConverter(); var prog1 = converter.FromNormalNotation("(((2+x)/y)^cos(5))"); var prog2 = new AdditionFunction(prog1, Constant.One); foreach (var measure in SimilarityMeasures) { var similarity = measure.Calculate(prog1, prog2); Console.WriteLine($"{prog1}, {prog2}: {similarity}"); Assert.AreNotEqual(similarity, 1d, 1E-10, $"{prog1} similarity with {prog2} should not be 1."); Assert.AreNotEqual(similarity, 0d, 1E-10, $"{prog1} similarity with {prog2} should not be 0."); } }
public void EqualsButDiffRefsTestProgram() { var const1 = new Constant(0); var const2 = new Constant(1); var const3 = new Constant(3); var addition = new AdditionFunction(const1, const3); var subtr = new SubtractionFunction(const2, addition); var log1 = new LogarithmFunction(subtr, const1); var log2 = new LogarithmFunction(subtr, const1); Console.WriteLine($"{log1}, {log2}"); Assert.AreEqual(log1, log2, $"{log1} should be equal to {log2}."); Assert.AreNotSame(log1, log2, $"{log1} should not be the same as {log2}."); }
private static MathProgram CreateProgram() { var a = new Variable("a"); var b = new Variable("b"); var c = new Variable("c"); var d = new Variable("d"); var e = new Variable("e"); var addition = new AdditionFunction(a, a); var subtr = new SubtractionFunction(a, a); var primitives = new PrimitiveSet <MathProgram>( new HashSet <Terminal> { a, b, c, d, e }, new HashSet <MathProgram> { addition, subtr }); var converter = new MathExpressionConverter(primitives); return(converter.FromPrefixNotation("(+ (- a b) (- c (+ d e)))")); }
public static void Main(string[] args) { const uint popSize = 200; const uint maxDepth = 4; const uint maxGenerations = 2000; const uint maxElementLength = 20; const uint maxNoImproveGen = (uint)(maxGenerations * 0.5); const string solutionExp = "(+ (+ x x) (+ (* 3 (* x x)) 1))"; var variable = new Variable("x"); var primitives = new PrimitiveSet <MathProgram>( new HashSet <Terminal> { variable, new Constant(0), new Constant(1), new Constant(3) }, new HashSet <MathProgram>()); primitives.Add(MathPrimitiveSets.Default); var fitnessFunction = new FitnessFunction(x => 2 * x + 3 * x * x + 1, variable, 100, -50, 50); var solution = new MathExpressionConverter(primitives).FromPrefixNotation(solutionExp); Console.WriteLine("==================================="); Console.WriteLine("Fitness: {0} | {1}", fitnessFunction.Evaluate(solution), solution); solution.ToGraphvizFile(Path.GetFullPath("."), "solution", GraphvizImageType.Png); Console.WriteLine("==================================="); var seed = new AdditionFunction(new Constant(1), variable); var elementGenerator = new StochasticProgramGenerator <MathProgram, double>( new List <IProgramGenerator <MathProgram, double> > { new GrowProgramGenerator <MathProgram, double>(), new FullProgramGenerator <MathProgram, double>() }); var selection = new TournamentSelection <MathProgram>(fitnessFunction, (uint)(popSize * 0.05)); var crossover = new StochasticCrossover <MathProgram>( new List <ICrossoverOperator <MathProgram> > { new SubtreeCrossover <MathProgram, double>(), new OnePointCrossover <MathProgram, double>(), new ContextPreservingCrossover <MathProgram, double>(), new UniformCrossover <MathProgram, double>() }); var mutation = new StochasticMutation <MathProgram>( new List <IMutationOperator <MathProgram> > { new SubtreeMutation <MathProgram, double>(elementGenerator, primitives, 1), new PointMutation <MathProgram, double>(primitives), //new ShrinkMutation(primitives), new SimplifyMutation(), new HoistMutation <MathProgram, double>() }); var pop = new Population <MathProgram, double>( popSize, primitives, elementGenerator, fitnessFunction, selection, crossover, mutation, maxDepth, maxElementLength); pop.Init(new HashSet <MathProgram> { seed }); MathProgram best = null; var numNoImproveGens = -1; for (var i = 0u; i < maxGenerations && numNoImproveGens < maxNoImproveGen; i++) { pop.Step(); var newBest = pop.BestProgram; if (best == null) { best = newBest; } var diff = fitnessFunction.Evaluate(newBest) - fitnessFunction.Evaluate(best); numNoImproveGens = diff.Equals(0) && best.Equals(newBest) ? numNoImproveGens + 1 : 0; best = newBest; Print(pop, i, fitnessFunction, diff); } best.ToGraphvizFile(Path.GetFullPath("."), "best", GraphvizImageType.Png); Console.WriteLine("==================================="); Console.WriteLine($"Best: {pop.BestProgram}, fitness: {fitnessFunction.Evaluate(pop.BestProgram):0.000}"); Console.ReadKey(); }