Пример #1
0
 private void TrainIndividual(XorIndividual individual)
 {
     for (int i = 0; i < _populationParameters.TrainIterations; i++)
     {
         individual.Genome.Network.Train(_truthTable, TrainSpeed, TrainMoment);
     }
 }
Пример #2
0
        private void MutateIndividual(XorIndividual individual, Random random)
        {
            var chance = random.NextDouble();

            if (chance < _mutationParameters.IndividualMutationChance)
            {
                individual.Genome.MutateStructure();
            }
        }
Пример #3
0
        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);
        }