예제 #1
0
        private void CalculateTotalFitness()
        {
            Genomes.ForEach(g =>
            {
                g.RebuildModelFollowingGenes();
                g.UpdateFitnessScore();
            });

            TotalFitnessScore = Genomes.Max(g => g.Fitness);
        }
예제 #2
0
        /// <summary>
        /// If the minimum fitness is less than 0, the absolute value of
        /// it is added to every genome, so that they all have positive fitness.
        /// It may be useful in some computations and it doesn't affect anything.
        /// </summary>
        private void MakeGenomesHaveOnlyPositiveFitnesses()
        {
            var minFitness = Genomes.Min(x => x.Fitness);

            if (minFitness > 0)
            {
                return;
            }

            var absMinFitness = Mathf.Abs(minFitness);

            Genomes.ForEach(x => x.Fitness += absMinFitness);
        }
예제 #3
0
파일: Population.cs 프로젝트: afalz/NEAT
        public void Evaluate(Func <IGenome, double> getFitness)
        {
            // Genome Fitness
            Genomes.ForEach(g => g.Fitness = getFitness(g));

            // Species Fitness
            Species.ForEach(s => s.SetFitness());

            // Population Fitness
            Fitness = Genomes.Sum(g => g.Fitness);

            AverageFitness = Genomes.Average(g => g.Fitness);
            AverageFitness = AverageFitness == 0 ? 1 : AverageFitness;

            // Genome Expected Offspring
            Genomes.ForEach(g => g.ExpectedOffspring = g.Fitness / AverageFitness);

            // Species Expected Offspring
            Species.ForEach(s => s.SetExpectedOffspring());
        }
예제 #4
0
파일: Species.cs 프로젝트: afalz/NEAT
        public void SetFitness()
        {
            int ageDebt = (Age - LastImprovementAge + 1) - SpeciesParameters.DropOffAge;

            ageDebt = ageDebt == 0 ? 1 : ageDebt;

            Genomes.ForEach(g =>
            {
                if (ageDebt >= 1)
                {
                    g.Fitness *= SpeciesParameters.DropOffAgePenaltyFactor;
                }

                if (Age <= 10)
                {
                    g.Fitness *= SpeciesParameters.AgeSignificance;
                }

                if (g.Fitness < 0)
                {
                    g.Fitness = 0.0001;
                }

                g.Fitness /= Genomes.Count;
            });

            Fitness = Genomes.Any() ? Genomes.Average(g => g.Fitness) : 0;

            if (Fitness > MaxFitness)
            {
                MaxFitness         = Fitness;
                LastImprovementAge = 0;
            }
            else
            {
                LastImprovementAge++;
            }
        }