Beispiel #1
0
        /// <summary>
        /// Setup and solve the TSP.
        /// </summary>
        public void Execute(IExampleInterface app)
        {
            this.app = app;

            var builder = new StringBuilder();

            initCities();

            IPopulation pop = initPopulation();
		
		ICalculateScore score =  new TSPScore(cities);

		genetic = new TrainEA(pop,score);
		
		genetic.AddOperation(0.9,new SpliceNoRepeat(CITIES/3));
		genetic.AddOperation(0.1,new MutateShuffle());

		int sameSolutionCount = 0;
		int iteration = 1;
		double lastSolution = Double.MaxValue;

		while (sameSolutionCount < MAX_SAME_SOLUTION) {
			genetic.Iteration();

			double thisSolution = genetic.Error;

			builder.Length = 0;
			builder.Append("Iteration: ");
			builder.Append(iteration++);
			builder.Append(", Best Path Length = ");
			builder.Append(thisSolution);

			Console.WriteLine(builder.ToString());

			if (Math.Abs(lastSolution - thisSolution) < 1.0) {
				sameSolutionCount++;
			} else {
				sameSolutionCount = 0;
			}

			lastSolution = thisSolution;
		}

		Console.WriteLine("Good solution found:");
		displaySolution();
		genetic.FinishTraining();
        }
        /// <summary>
        /// Create an EPL GA trainer.
        /// </summary>
        /// <param name="method">The method to use.</param>
        /// <param name="training">The training data to use.</param>
        /// <param name="argsStr">The arguments to use.</param>
        /// <returns>The newly created trainer.</returns>
        public IMLTrain Create(IMLMethod method,
                IMLDataSet training, String argsStr)
        {
            PrgPopulation pop = (PrgPopulation)method;

            ICalculateScore score = new TrainingSetScore(training);
            TrainEA train = new TrainEA(pop, score);
            train.Rules.AddRewriteRule(new RewriteConstants());
            train.Rules.AddRewriteRule(new RewriteAlgebraic());
            train.CODEC = new PrgCODEC();
            train.AddOperation(0.8, new SubtreeCrossover());
            train.AddOperation(0.1, new SubtreeMutation(pop.Context, 4));
            train.AddOperation(0.1, new ConstMutation(pop.Context, 0.5, 1.0));
            train.AddScoreAdjuster(new ComplexityAdjustedScore());
            train.Speciation = new PrgSpeciation();
            return train;
        }
        public void Eval(String start, String expect)
        {
            EncogProgramContext context = new EncogProgramContext();
            StandardExtensions.CreateNumericOperators(context);
            PrgPopulation pop = new PrgPopulation(context, 1);
            ICalculateScore score = new ZeroEvalScoreFunction();

            TrainEA genetic = new TrainEA(pop, score);
            genetic.ValidationMode = true;
            genetic.CODEC = new PrgCODEC();
            genetic.AddOperation(0.95, new SubtreeCrossover());
            genetic.AddOperation(0.05, new SubtreeMutation(context, 4));
            genetic.AddScoreAdjuster(new ComplexityAdjustedScore());
            genetic.Rules.AddRewriteRule(new RewriteConstants());
            genetic.Rules.AddRewriteRule(new RewriteAlgebraic());

            EncogProgram expression = new EncogProgram(context);
            expression.CompileExpression(start);
            RenderCommonExpression render = new RenderCommonExpression();
            genetic.Rules.Rewrite(expression);
            Assert.AreEqual(expect, render.Render(expression));
        }
        /// <summary>
        /// Program entry point.
        /// </summary>
        /// <param name="app">Holds arguments and other info.</param>
        public void Execute(IExampleInterface app)
        {
            IMLDataSet trainingData = GenerationUtil.GenerateSingleDataRange(
                (x) => (3 * Math.Pow(x, 2) + (12 * x) + 4)
                , 0, 100, 1);

            EncogProgramContext context = new EncogProgramContext();
            context.DefineVariable("x");

            StandardExtensions.CreateNumericOperators(context);

            PrgPopulation pop = new PrgPopulation(context, 1000);

            MultiObjectiveFitness score = new MultiObjectiveFitness();
            score.AddObjective(1.0, new TrainingSetScore(trainingData));

            TrainEA genetic = new TrainEA(pop, score);
            genetic.ValidationMode = true;
            genetic.CODEC = new PrgCODEC();
            genetic.AddOperation(0.5, new SubtreeCrossover());
            genetic.AddOperation(0.25, new ConstMutation(context, 0.5, 1.0));
            genetic.AddOperation(0.25, new SubtreeMutation(context, 4));
            genetic.AddScoreAdjuster(new ComplexityAdjustedScore(10, 20, 10, 20.0));
            genetic.Rules.AddRewriteRule(new RewriteConstants());
            genetic.Rules.AddRewriteRule(new RewriteAlgebraic());
            genetic.Speciation = new PrgSpeciation();

            (new RampedHalfAndHalf(context, 1, 6)).Generate(new EncogRandom(), pop);

            genetic.ShouldIgnoreExceptions = false;

            EncogProgram best = null;
            genetic.ThreadCount = 1;

            try
            {

                for (int i = 0; i < 1000; i++)
                {
                    genetic.Iteration();
                    best = (EncogProgram)genetic.BestGenome;
                    Console.Out.WriteLine(genetic.IterationNumber + ", Error: "
                            + best.Score + ",Best Genome Size:" + best.Size
                            + ",Species Count:" + pop.Species.Count + ",best: " + best.DumpAsCommonExpression());
                }

                //EncogUtility.evaluate(best, trainingData);

                Console.Out.WriteLine("Final score:" + best.Score
                        + ", effective score:" + best.AdjustedScore);
                Console.Out.WriteLine(best.DumpAsCommonExpression());
                //pop.dumpMembers(Integer.MAX_VALUE);
                //pop.dumpMembers(10);

            }
            catch (Exception t)
            {
                Console.Out.WriteLine(t.ToString());
            }
            finally
            {
                genetic.FinishTraining();
                EncogFramework.Instance.Shutdown();
            }
        }
        /// <summary>
        /// Construct a NEAT (or HyperNEAT trainer.
        /// </summary>
        /// <param name="population">The population.</param>
        /// <param name="calculateScore">The score function.</param>
        /// <returns>The NEAT EA trainer.</returns>
        public static TrainEA ConstructNEATTrainer(NEATPopulation population,
                ICalculateScore calculateScore)
        {
            var result = new TrainEA(population, calculateScore) {Speciation = new OriginalNEATSpeciation()};

            result.Selection = new TruncationSelection(result, 0.3);
            var weightMutation = new CompoundOperator();
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectFixed(1),
                            new MutatePerturbLinkWeight(0.02)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectFixed(2),
                            new MutatePerturbLinkWeight(0.02)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectFixed(3),
                            new MutatePerturbLinkWeight(0.02)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectProportion(0.02),
                            new MutatePerturbLinkWeight(0.02)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectFixed(1),
                            new MutatePerturbLinkWeight(1)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectFixed(2),
                            new MutatePerturbLinkWeight(1)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectFixed(3),
                            new MutatePerturbLinkWeight(1)));
            weightMutation.Components.Add(
                    0.1125,
                    new NEATMutateWeights(new SelectProportion(0.02),
                            new MutatePerturbLinkWeight(1)));
            weightMutation.Components.Add(
                    0.03,
                    new NEATMutateWeights(new SelectFixed(1),
                            new MutateResetLinkWeight()));
            weightMutation.Components.Add(
                    0.03,
                    new NEATMutateWeights(new SelectFixed(2),
                            new MutateResetLinkWeight()));
            weightMutation.Components.Add(
                    0.03,
                    new NEATMutateWeights(new SelectFixed(3),
                            new MutateResetLinkWeight()));
            weightMutation.Components.Add(
                    0.01,
                    new NEATMutateWeights(new SelectProportion(0.02),
                            new MutateResetLinkWeight()));
            weightMutation.Components.FinalizeStructure();

            result.ChampMutation = weightMutation;
            result.AddOperation(0.5, new NEATCrossover());
            result.AddOperation(0.494, weightMutation);
            result.AddOperation(0.0005, new NEATMutateAddNode());
            result.AddOperation(0.005, new NEATMutateAddLink());
            result.AddOperation(0.0005, new NEATMutateRemoveLink());
            result.Operators.FinalizeStructure();

            if (population.IsHyperNEAT)
            {
                result.CODEC = new HyperNEATCODEC();
            }
            else
            {
                result.CODEC = new NEATCODEC();
            }

            return result;
        }