public int run(GeneticRunParameters parameters) { if (!(parameters is FuzzyGeneticsRunParameters)) throw new WrongParameterTypeException("Fuzzy Genetics only accepts Fuzzy Genetics Run Parameters"); FuzzyGeneticsRunParameters fgParameters = (FuzzyGeneticsRunParameters)parameters; subGenetics = fgParameters.algorithm.newInstance(initial, fgParameters.algorithmInstanceParameters); int bestFitness = 0; int periodSinceLastImprovement = 0; LinkedList<int> lastFitnesses = new LinkedList<int>(); for (int n = 0; n < fgParameters.numberToAverageScoreOver; n++) { lastFitnesses.AddFirst(0); } while (periodSinceLastImprovement < fgParameters.waitSinceLastImprovement) { int fitness = subGenetics.run(fgParameters.algorithmRunParameters); lastFitnesses.RemoveFirst(); lastFitnesses.AddLast(fitness); int summedFitness = lastFitnesses.Sum(); periodSinceLastImprovement++; if (bestFitness < summedFitness) { bestFitness = summedFitness; periodSinceLastImprovement = 0; result = subGenetics.getAll(); resultPairs = subGenetics.getAllPairs(); } if (fgParameters.verbose) Console.WriteLine("best of round: " + fitness + ". average = " + summedFitness / fgParameters.numberToAverageScoreOver + " (" + periodSinceLastImprovement + ")"); } return lastFitnesses.Last.Value; }