public String geneticAlgorithm(Set<String> population,
FitnessFunction fitnessFn, GoalTest goalTest)
{
String bestIndividual = null;
validatePopulation(population);
clearInstrumentation();
setPopulationSize(population.Count);
// repeat
int cnt = 0;
do
{
bestIndividual = ga(population, fitnessFn);
cnt++;
// until some individual is fit enough, or enough time has elapsed
} while (!goalTest.isGoalState(bestIndividual));
setIterations(cnt);
// return the best individual in population, according to FITNESS-FN
return bestIndividual;
}