public string GetBest(int length,
string geneSet,
Func<string, int> getFitness,
Action<int, int, string> displayChild)
{
int maxIndividualsInPool = geneSet.Length * 3;
int generationCount = 1;
var uniqueIndividuals = new HashSet<string>();
var parents = GenerateParents(length, geneSet)
.Where(x => uniqueIndividuals.Add(x.Genes))
.Take(maxIndividualsInPool)
.ToList();
foreach (var individual in parents)
{
individual.Fitness = getFitness(individual.Genes);
}
parents = parents.OrderBy(x => x.Fitness).ToList();
displayChild(generationCount, parents.Last().Fitness, parents.Last().Genes);
int worstParentFitness = parents.Last().Fitness;
var children = GenerateChildren(parents, Crossover, geneSet);
do
{
var improved = new List<Individual>();
foreach (var child in children.Where(x => uniqueIndividuals.Add(x.Genes)))
{
child.Fitness = getFitness(child.Genes);
if (worstParentFitness >= child.Fitness)
{
improved.Add(child);
if (worstParentFitness > child.Fitness)
{
displayChild(generationCount, child.Fitness, child.Genes);
worstParentFitness = child.Fitness;
}
}
}
generationCount++;
if (improved.Any())
{
parents = parents
.Concat(improved)
.OrderBy(x => x.Fitness)
.Take(maxIndividualsInPool)
.ToList();
children = GenerateChildren(parents, Crossover, geneSet);
}
else
{
children = GenerateChildren(parents, Mutate, geneSet);
}
} while (parents[0].Fitness > 0);
return parents[0].Genes;
}