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