public int run(GeneticRunParameters parameters) { if (!(parameters is RandomRestartRunParameters)) throw new WrongParameterTypeException("Random Restart Genetics can only be run using Random Restart Parameters"); RandomRestartRunParameters rrParameters = (RandomRestartRunParameters)parameters; int bestFitness = 0; List<GeneStringFitnessPair> bestResults = new List<GeneStringFitnessPair>(); do { subGenetics = rrParameters.algorithm.newInstance(initial, rrParameters.algorithmInstanceParameters); int maxfitness = runUntilRepeating(rrParameters.algorithmRunParameters, rrParameters.numRepeatsBeforeRestart, rrParameters.verbose); GeneStringFitnessPair bestOfGeneration = subGenetics.getBestPair(); bestResults.Add(bestOfGeneration); if (maxfitness > bestFitness) bestFitness = maxfitness; if (rrParameters.verbose) { Console.WriteLine(); Console.Write("Local Max at " + maxfitness); } goalValue = (1000 - rrParameters.promilleGoalDecreasePerRound) * goalValue / 1000; if (rrParameters.verbose) Console.WriteLine(", restarting with goal at " + goalValue + " best = " + bestFitness); } while (bestFitness < goalValue); return runChampionRound(rrParameters, bestResults); }