/// <summary> /// Demonstrate the mutate peterb operator. An offspring will be created by randomly changing each /// gene. /// </summary> public static void MutatePeterb() { Console.WriteLine("Mutate Perturb"); IGenerateRandom rnd = new MersenneTwisterGenerateRandom(); // Create a new population. IPopulation pop = new BasicPopulation(); pop.GenomeFactory = new DoubleArrayGenomeFactory(5); // Create a trainer with a very simple score function. We do not care // about the calculation of the score, as they will never be calculated. IEvolutionaryAlgorithm train = new BasicEA(pop, new NullScore()); var opp = new MutatePerturb(0.1); train.AddOperation(1.0, opp); // Create a peterb operator. Use it 1.0 (100%) of the time. var parents = new DoubleArrayGenome[1]; parents[0] = (DoubleArrayGenome)pop.GenomeFactory.Factor(); parents[0].Population = pop; for (int i = 1; i <= 5; i++) { parents[0].Data[i - 1] = i; } // Create an array to hold the offspring. var offspring = new DoubleArrayGenome[1]; offspring[0] = new DoubleArrayGenome(5); // Perform the operation opp.PerformOperation(rnd, parents, 0, offspring, 0); // Display the results Console.WriteLine("Parent: " + string.Join(",", parents[0].Data)); Console.WriteLine("Offspring: " + string.Join(",", offspring[0].Data)); }
private BasicPopulation InitPopulation() { BasicPopulation result = new BasicPopulation(populationSize, null); BasicSpecies defaultSpecies = new BasicSpecies() { Population = result }; for (int i = 0; i < populationSize; i++) { IntegerArrayGenome genome = RandomGenome(); defaultSpecies.Members.Add(genome); } result.GenomeFactory = new IntegerArrayGenomeFactory(cities.Length); result.Species.Add(defaultSpecies); return(result); }
/// <summary> /// Construct a neat trainer with a new population. /// </summary> /// <param name="calculateScore">The score calculation object.</param> /// <param name="inputCount">The input neuron count.</param> /// <param name="outputCount">The output neuron count.</param> /// <param name="populationSize">The population size.</param> public NEATTraining(ICalculateScore calculateScore, int inputCount, int outputCount, int populationSize) { this.inputCount = inputCount; this.outputCount = outputCount; CalculateScore = new GeneticScoreAdapter(calculateScore); Comparator = new GenomeComparator(CalculateScore); Population = new BasicPopulation(populationSize); // create the initial population for (int i = 0; i < populationSize; i++) { Population.Add( new NEATGenome(this, Population.AssignGenomeID(), inputCount, outputCount)); } Init(); }
/// <summary> /// The entry point for this example. If you would like to make this example /// stand alone, then add to its own project and rename to Main. /// </summary> /// <param name="args">Not used.</param> public static void ExampleMain(string[] args) { // Create a new population. IPopulation pop = new BasicPopulation(); ISpecies species = pop.CreateSpecies(); // Create 1000 genomes, assign the score to be the index number. for (int i = 0; i < 1000; i++) { IGenome genome = new IntegerArrayGenome(1); genome.Score = i; genome.AdjustedScore = i; pop.Species[0].Add(genome); } IGenerateRandom rnd = new MersenneTwisterGenerateRandom(); // Create a trainer with a very simple score function. We do not care // about the calculation of the score, as they will never be calculated. // We only care that we are maximizing. IEvolutionaryAlgorithm train = new BasicEA(pop, new NullScore()); // Perform the test for round counts between 1 and 10. for (int roundCount = 1; roundCount <= 10; roundCount++) { var selection = new TournamentSelection(train, roundCount); int sum = 0; int count = 0; for (int i = 0; i < 100000; i++) { int genomeID = selection.PerformSelection(rnd, species); IGenome genome = species.Members[genomeID]; sum += (int)genome.AdjustedScore; count++; } sum /= count; Console.WriteLine("Rounds: " + roundCount + ", Avg Score: " + sum); } }
public BasicPopulation CreateInitialPopulation(int populationSize, int geneCountPerChromosome) { try { var genomeFactory = new IntegerArrayGenomeFactory(geneCountPerChromosome); var population = new BasicPopulation(populationSize, genomeFactory); var defaultSpecies = new BasicSpecies(); for (var i = 1; i <= populationSize; i++) { Console.Write($"\n {i} Chomosome - "); IntegerArrayGenome genome = CreateRandomGenome(geneCountPerChromosome); defaultSpecies.Members.Add(genome); } population.Species.Add(defaultSpecies); return(population); } catch (Exception e) { Console.WriteLine(e); throw; } }
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; } }