public GeneticAlgorithmFloat(List <DataFP> dataList, int numberOfRules, int totalGenerations,
                                     float crossoverRate, int tournamentSize, float mutationRange, float mutationRate, int?populationSize = null)
        {
            // Condition length inferred from supplied data.
            this.boundryLength = dataList[0].cond.Length;
            // Population defaults to the size of the supplied dataList.
            this.populationSize = populationSize ?? dataList.Count;
            this.numberOfRules  = numberOfRules;

            this.totalGenerations       = totalGenerations;
            this.crossoverRate          = crossoverRate;
            this.mutationRate           = mutationRate;
            this.mutationRange          = mutationRange;
            this.mutationRateOriginal   = mutationRate;
            this.mutationRangeOriginal  = mutationRange;
            this.tournamentSize         = tournamentSize;
            this.tournamentSizeOriginal = tournamentSize;

            // Split up our data into training and evaluation sets.
            IndividualFP.SetTrainingAndEvaluationData(dataList.Take(1000).ToList(),
                                                      dataList.Skip(1000).Take(1000).ToList());
            generationCounter = 1;

            population    = new List <IndividualFP>();
            fitnessLookup = new Dictionary <IndividualFP, int>();
        }