public void Init()
        {
            if (this.Initialised)
            {
                return;
            }
            //Dividimos los padres entre los threads
            int sizePopThread    = Convert.ToInt32(ParentsSize / NumThreads);
            int sizePopThreadAll = Convert.ToInt32(PopulationSize / NumThreads);

            GeneticWorkerThreads = new Thread[NumThreads];
            GeneticWorkers       = new GeneticWorker[NumThreads];
            GeneticWorkerEvents  = new AutoResetEvent[NumThreads];

            for (int i = 0; i < NumThreads; i++)
            {
                GeneticWorkerEvents[i] = new AutoResetEvent(false);
                GeneticWorkers[i]      = new GeneticWorker()
                {
                    Model         = this.Model,
                    MutationProb  = this.MutationProbability,
                    StartIndex    = sizePopThread * i,
                    EndIndex      = sizePopThread * (i + 1),
                    StartIndexAll = sizePopThreadAll * i,
                    EndIndexAll   = sizePopThreadAll * (i + 1),
                    FinishedEvent = GeneticWorkerEvents[i]
                };
            }
            //Añadimos al último la diferencia de la división
            GeneticWorkers[NumThreads - 1].EndIndex    += ParentsSize % NumThreads;
            GeneticWorkers[NumThreads - 1].EndIndexAll += PopulationSize % NumThreads;

            Initialised = true;
        }
 private void MutateParents(Population parents)
 {
     if (!this.MultiThread)
     {
         Stats.TotalMutations += GeneticWorker.MutateParents(parents, MutationProbability, 0, parents.Members.Length, Model.GenValues.Count);
     }
     else
     {
         Stats.TotalCrosses += GeneticWorkersManager.StartMultiThreadJob(parents, GeneticWorker.GeneticJob.Mutate);
     }
 }
 private void CrossParents(Population parents)
 {
     if (!this.MultiThread)
     {
         Stats.TotalCrosses += GeneticWorker.CrossParents(parents, 0, parents.Members.Length);
     }
     else
     {
         Stats.TotalCrosses += GeneticWorkersManager.StartMultiThreadJob(parents, GeneticWorker.GeneticJob.Cross);
     }
 }
 private void EvaluateAll(Population pop)
 {
     if (!this.MultiThread)
     {
         GeneticWorker.Evaluate(pop, Model, 0, pop.Members.Length);
     }
     else
     {
         GeneticWorkersManager.StartMultiThreadJob(pop, GeneticWorker.GeneticJob.EvaluateAll);
     }
 }