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);
        }