Пример #1
0
        static void Main(string[] args)
        {
            // this form of ANN uses genetic algorithm to produce
            // hidden layer of neurons
            // A NEAT network starts with only an
            // input layer and output layer. The rest is evolved as the training progresses.
            // Connections inside of a NEAT neural network can be feedforward, recurrent,
            // or self - connected.All of these connection types will be tried by NEAT as it
            // attempts to evolve a neural network capable of the given task.
            IMLDataSet     trainingSet = new BasicMLDataSet(XORInput, XORIdeal);
            NEATPopulation pop         = new NEATPopulation(2, 1, 1000);

            pop.Reset();
            pop.InitialConnectionDensity = 1.0; // not required, but speeds processing.
            ICalculateScore score = new TrainingSetScore(trainingSet);
            // train the neural network
            TrainEA train = NEATUtil.ConstructNEATTrainer(pop, score);

            EncogUtility.TrainToError(train, 0.01);

            NEATNetwork network = (NEATNetwork)train.CODEC.Decode(train.BestGenome);

            // TODO no persistance? no means to peek structure?

            // test the neural network
            Console.WriteLine(@"Neural Network Results:");
            EncogUtility.Evaluate(network, trainingSet);
        }
        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));
        }
Пример #3
0
        public TrainEA RunGA(TrainEA geneticAlgorithm, int maxSameSolutionCount)
        {
            try
            {
                var sameSolutionCount = 0;
                var lastSolutionError = double.MaxValue;
                var iteration         = 1;
                while (sameSolutionCount < maxSameSolutionCount)
                {
                    geneticAlgorithm.Iteration();
                    var currentSolutionError = geneticAlgorithm.Error;
                    if (Math.Abs(lastSolutionError - currentSolutionError) < 1.0)
                    {
                        sameSolutionCount++;
                    }
                    else
                    {
                        sameSolutionCount = 0;
                    }

                    lastSolutionError = currentSolutionError;
                    Console.WriteLine($"{iteration++} Iteration - Error {currentSolutionError}");
                }
                geneticAlgorithm.FinishTraining();
                Console.WriteLine("Good Solutions Found");
                return(geneticAlgorithm);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Пример #4
0
        /// <summary>
        /// Create an NEAT 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)
        {
            ICalculateScore score = new TrainingSetScore(training);
            TrainEA         train = NEATUtil.ConstructNEATTrainer((NEATPopulation)method, score);

            return(train);
        }
Пример #5
0
        public int[] Run()
        {
            StringBuilder builder = new StringBuilder();

            IPopulation pop = InitPopulation();


            ICalculateScore score = new FitnessFunction(cities);

            genetic = new TrainEA(pop, score);

            genetic.AddOperation(0.9, new SpliceNoRepeat(cityCount / 3));
            genetic.AddOperation(0.1, new MutateShuffle());

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

            while (sameSolutionCount < maxSameSolition)
            {
                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:");

            IntegerArrayGenome best = (IntegerArrayGenome)genetic.BestGenome;


            genetic.FinishTraining();


            return(best.Data);
        }
        /// <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();
        }
Пример #7
0
 public TrainEA CreateGA(int cityCount, BasicPopulation population, TravellingSalesManFitnessScore tspFitness, double crossOverProbabality, double mutationProbabality)
 {
     try
     {
         var geneticAlgorithm = new TrainEA(population, tspFitness);
         geneticAlgorithm.AddOperation(crossOverProbabality, new SpliceNoRepeat(cityCount / 3));
         geneticAlgorithm.AddOperation(mutationProbabality, new MutateShuffle());
         return(geneticAlgorithm);
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
Пример #8
0
 public TrainEA CreateGA(int powerUnitCount, BasicPopulation population, PowerUnitMaintainanceFitnessFunction maintainanceFitness, double crossOverProbabality, double mutationProbabality)
 {
     try
     {
         var geneticAlgorithm = new TrainEA(population, maintainanceFitness);
         geneticAlgorithm.AddOperation(crossOverProbabality, new CustomCrossOver());
         geneticAlgorithm.AddOperation(mutationProbabality, new CustomMutation());
         return(geneticAlgorithm);
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
Пример #9
0
 public void DisplaySolution(TrainEA geneticAlgorithm, City [] cities)
 {
     try
     {
         var bestChromosome = (IntegerArrayGenome)geneticAlgorithm.Population.BestGenome;
         foreach (var gene in bestChromosome.Data)
         {
             Console.WriteLine($"city - {gene} => X = {cities[gene].X}, Y = {cities[gene].Y}");
         }
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
Пример #10
0
        /// <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);
        }
Пример #11
0
        /// <summary>
        /// Program entry point.
        /// </summary>
        /// <param name="app">Holds arguments and other info.</param>
        public void Execute(IExampleInterface app)
        {
            IMLDataSet     trainingSet = new BasicMLDataSet(XORInput, XORIdeal);
            NEATPopulation pop         = new NEATPopulation(2, 1, 1000);

            pop.Reset();
            pop.InitialConnectionDensity = 1.0; // not required, but speeds processing.
            ICalculateScore score = new TrainingSetScore(trainingSet);
            // train the neural network
            TrainEA train = NEATUtil.ConstructNEATTrainer(pop, score);

            EncogUtility.TrainToError(train, 0.01);

            NEATNetwork network = (NEATNetwork)train.CODEC.Decode(train.BestGenome);

            // test the neural network
            Console.WriteLine(@"Neural Network Results:");
            EncogUtility.Evaluate(network, trainingSet);
        }
Пример #12
0
        static void Main(string[] args)
        {
            var powerUnitRepository = new PowerUnitRepository();

            var powerUnitGALogic     = new PowerUnitGALogic();
            var populationSize       = 500;
            var crossOverProbabality = 0.9;
            var mutationProbabaity   = 0.001;

            const int MaxNumIterationsSameSolution = 25;     // maximum number of iterations which GA could run on a same error rate


            Display("------------ Load Power Unit Details");
            var powerUnits = powerUnitRepository.PowerUnits;

            DisplayPowerUnitData(powerUnits);

            // 1 create initial population
            Display("------------ Create Initial Population");
            var population = powerUnitGALogic.CreateInitialPopulation(populationSize, powerUnits.Count);

            // 2 create fitness function
            Display("\n------------ Create Fitness function - sum of total diatance of cities within the chromosome - distance low --> better chromosome");
            double maxPossiblePower             = powerUnits.Sum(x => x.UnitCapacity);
            var    numberOfIntervals            = new IntervalFitnessDataRepository(maxPossiblePower).GetNumberOfIntervals();
            var    powerUnitMaintainanceFitness = new PowerUnitMaintainanceFitnessFunction(powerUnitRepository.GetAllPowerUnits(), numberOfIntervals, maxPossiblePower);

            // 3 create GA trainer
            Display("\n------------ Create GA Trainer for iterations");
            TrainEA geneticAlgorithm = powerUnitGALogic.CreateGA(powerUnits.Count, population, powerUnitMaintainanceFitness, crossOverProbabality, mutationProbabaity);

            // 4 iterate and create off spring of new solutions
            Display("\n------------ Run GA for iterations until good solutions found");
            geneticAlgorithm = powerUnitGALogic.RunGA(geneticAlgorithm, MaxNumIterationsSameSolution);

            // 5 display GA results
            Display("\n------------ Display Final solution after iterations");
            powerUnitGALogic.DisplaySolution(geneticAlgorithm, powerUnitRepository.GetAllPowerUnits(), maxPossiblePower);

            Display("\n------------ Done");
            Console.ReadKey();
        }
Пример #13
0
        static void Main(string[] args)
        {
            try
            {
                Display("------------ Load City Coodinates");
                var travellingSalesman = new TravellingSalesMan();
                var cities             = travellingSalesman.LoadCities(Config.CityCount, Config.MaxXCordinate, Config.MaxYCordinate);

                // 1 create initial population
                Display("\n------------ Create Initial Solution Population");
                BasicPopulation population = travellingSalesman.CreateInitialPopulation(Config.PopulationSize, Config.CityCount);

                // 2 create fitness function
                Display("\n------------ Create Fitness function - sum of total diatance of cities within the chromosome - distance low --> better chormosome");
                var tspFitness = new TravellingSalesManFitnessScore(cities);

                // 3 create GA trainer
                Display("\n------------ Create GA Trainer for iterations");
                TrainEA geneticAlgorithm = travellingSalesman.CreateGA(Config.CityCount, population, tspFitness, Config.CrossOverProbabality, Config.MutationProbabality);

                // 4 iterate and create off spring of new solutions
                Display("\n------------ Run GA for iterations until good solutions found");
                geneticAlgorithm = travellingSalesman.RunGA(geneticAlgorithm, Config.MaxNumIterationsSameSolution);

                // 5 display GA results
                Display("\n------------ Display Final solution after iterations");
                travellingSalesman.DisplaySolution(geneticAlgorithm, cities);

                Display("\n------------ Fin");
                Console.ReadKey();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Пример #14
0
        /// <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);
        }
Пример #15
0
        /// <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();
            }
        }
Пример #16
0
        public void DisplaySolution(TrainEA geneticAlgorithm, PowerUnit[] powerUnits, double maxPossiblePower)
        {
            try
            {
                var            bestChromosome     = (FourBitCustomGenome)geneticAlgorithm.Population.BestGenome;
                FourBitGene [] bestChomosomeGenes = bestChromosome.Data;

                // display best chromosome genes
                for (var i = 0; i < bestChomosomeGenes.Length; i++)
                {
                    // display chromosome to user
                    var geneBitsString = GetGeneBitString(bestChomosomeGenes[i]);
                    if (i == 0)
                    {
                        Console.Write("Best Chromosome Genes = [ {0}", geneBitsString);
                    }
                    else if (i < bestChomosomeGenes.Length - 1)
                    {
                        Console.Write(", {0}", geneBitsString);
                    }
                    else
                    {
                        Console.Write(", {0}]\n\n", geneBitsString);
                    }
                }

                var intervalFitnessDataRepository = new IntervalFitnessDataRepository(maxPossiblePower);
                var intervalRawData = intervalFitnessDataRepository.IntervalRawData;

                for (int i = 0; i < intervalRawData.Count; i++)
                {
                    IntervalsFitnessData interval = intervalRawData[i];
                    for (int j = 0; j < bestChomosomeGenes.Length; j++)
                    {
                        PowerUnit   powerUnit             = powerUnits[j];
                        FourBitGene fourBitGene           = bestChomosomeGenes[j];
                        int         geneBitIndex          = i;
                        var         isPowerUnitMaintained = fourBitGene.Gene[geneBitIndex] == 1;
                        if (isPowerUnitMaintained)
                        {
                            interval.ReducedAmountOnMaintainance = interval.ReducedAmountOnMaintainance + (1 * powerUnit.UnitCapacity);
                        }
                        else
                        {
                            interval.ReducedAmountOnMaintainance = interval.ReducedAmountOnMaintainance + (0 * powerUnit.UnitCapacity);
                        }
                    }

                    var totalPowerReductionOnMaintanceAndUsage =
                        interval.PowerRequirement + interval.ReducedAmountOnMaintainance;
                    interval.ReserveAfterMaintainance = interval.MaxReserve - totalPowerReductionOnMaintanceAndUsage;
                    if (interval.ReserveAfterMaintainance < 0.0)
                    {
                        // the chromosome is not suitable for out requirement
                        Console.WriteLine("Error - On Interval {0} has net reserve of {1} ", interval.IntervalId, interval.ReserveAfterMaintainance);
                    }
                }

                foreach (var interval in intervalRawData)
                {
                    Console.WriteLine(
                        "Interval Id = {0} , Max Reserve = {1}, Power Requirement = {2} , Reduced on maintainance = {3} , Reserve after Maintainance = {4}",
                        interval.IntervalId, interval.MaxReserve, interval.PowerRequirement,
                        interval.ReducedAmountOnMaintainance, interval.ReserveAfterMaintainance);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }