private void TrainIndividual(XorIndividual individual) { for (int i = 0; i < _populationParameters.TrainIterations; i++) { individual.Genome.Network.Train(_truthTable, TrainSpeed, TrainMoment); } }
private void MutateIndividual(XorIndividual individual, Random random) { var chance = random.NextDouble(); if (chance < _mutationParameters.IndividualMutationChance) { individual.Genome.MutateStructure(); } }
public int Search(int maxIteration, double treshhold) { Parallel.ForEach(_population, individual => TrainIndividual(individual)); Random rand = new Random(); int iteration = 0; while (iteration < maxIteration) { Parallel.ForEach(_population, individual => individual.EvaluateError(_truthTable)); _population.Sort(); BestIndividual = _population[0]; Console.WriteLine($"I: {iteration} -> {BestIndividual}"); if (BestIndividual.Error <= treshhold) { break; } var archiveChilds = _population .Take(_populationParameters.ArchiveSize) .ToList(); var bestChilds = new List <XorIndividual>(_populationParameters.BestChildCount); bestChilds.AddRange( Enumerable.Range(1, _populationParameters.BestChildCount) .AsParallel() .Select(i => new XorIndividual(NeatGenome.Crossover(BestIndividual.Genome, _population[i].Genome))) .ToList() ); var randomChildCount = _populationParameters.PopulationSize - (_populationParameters.BestChildCount + _populationParameters.ArchiveSize); var randomChilds = Enumerable.Range(0, randomChildCount) .AsParallel() .Select(_ => { XorIndividual randomChild = null; var individual1 = _population[rand.Next(_population.Count)]; var individual2 = _population[rand.Next(_population.Count)]; if (individual1 == individual2) { randomChild = individual1; //randomChild.Genome.MutateStructure(); } else { randomChild = new XorIndividual(NeatGenome.Crossover(individual1.Genome, individual2.Genome)); } return(randomChild); }) .ToList(); _population = new List <XorIndividual>(_populationParameters.PopulationSize); _population.AddRange(bestChilds); _population.AddRange(randomChilds); _population.AddRange(archiveChilds); // Apply mutations Parallel.ForEach(bestChilds, individual => MutateIndividual(individual, rand)); Parallel.ForEach(randomChilds, individual => MutateIndividual(individual, rand)); // Train population Parallel.ForEach(_population, individual => TrainIndividual(individual)); iteration++; } return(iteration); }