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