/// <summary> /// Constructor. /// </summary> /// <param name="model"></param> /// <param name="crossoverRate"></param> /// <param name="mutationRate"></param> /// <param name="populationSize"></param> /// <param name="generationSize"></param> public GA(IOptimisable model, double crossoverRate, double mutationRate, int populationSize) { DefaultValues(); Model = model; MutationRate = mutationRate; CrossoverRate = crossoverRate; PopulationSize = populationSize; }
/// <summary> /// Constructor. /// </summary> /// <param name="model"></param> /// <param name="n_threads"></param> /// <param name="crossoverRate"></param> /// <param name="mutationRate"></param> /// <param name="populationSize"></param> /// <param name="generationSize"></param> /// <param name="genomeSize"></param> public GA(IOptimisable model, Int32 n_threads, double crossoverRate, double mutationRate, int populationSize) { DefaultValues(); Model = model; NumberOfThreads = n_threads; MutationRate = mutationRate; CrossoverRate = crossoverRate; PopulationSize = populationSize; }
/// <summary> /// Constructor. /// </summary> /// <param name="model"></param> /// <param name="progressReporter"></param> /// <param name="n_threads"></param> /// <param name="crossoverRate"></param> /// <param name="mutationRate"></param> /// <param name="populationSize"></param> /// <param name="generationSize"></param> /// <param name="genomeSize"></param> public GA(IOptimisable model, ProgressReporterDelegate progressReporter, Int32 n_threads, double crossoverRate, double mutationRate, int populationSize, int terminationGenerations, double terminationThreshold) { DefaultValues(); Model = model; ProgressReporter = progressReporter; NumberOfThreads = n_threads; MutationRate = mutationRate; CrossoverRate = crossoverRate; PopulationSize = populationSize; TerminationGenerations = terminationGenerations; TerminationThreshold = terminationThreshold; }
/// <summary> /// Used in multi-threaded mode to calculate the fitness of a Genome. /// </summary> /// <param name="genome"></param> /// <returns></returns> private object DoWork(object genome) { //Borrow a model from the dispatcher IOptimisable model = (IOptimisable)m_modelDispatcher.Borrow(); //Run the model Genome G = (Genome)genome; G.Fitness = model.Fitness(G.Genes()); //Return the model to the dispatcher m_modelDispatcher.Return(model); //Return a result (actually not being used) //except maybe to notify that the thread has finished //return G.Fitness; return(null); }
/// <summary> /// Re-populates the model dispatcher with clones of the model to be /// used on different threads. This should be called if you change /// the model, or if you change the number of threads. /// </summary> private void RebuildModelResources() { //Remember the model we want to clone IOptimisable oldModel = m_models[0]; //Resize the array m_models = new IOptimisable[m_logicalCores]; m_models[0] = oldModel; if (m_models[0] != null) { for (int i = 1; i < m_logicalCores; i++) { m_models[i] = (IOptimisable)m_models[0].DeepClone(); } } //Create a new ObjectDispatcher fitted with the model resources m_modelDispatcher = new ObjectDispatcher(m_models); }