private void CalculateTotalFitness() { Genomes.ForEach(g => { g.RebuildModelFollowingGenes(); g.UpdateFitnessScore(); }); TotalFitnessScore = Genomes.Max(g => g.Fitness); }
/// <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); }
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()); }
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++; } }