void Queen::defaultAction(float frameTime){ if(cooldown == 0){ Reproduce(*getCenter(),species); cooldown += queenNS::BIRTH_RATE; } if(pher == nullptr) { pher = world->spawnPher(*getCenter(),Signal(SignalType::queen,*getCenter(),species)); } else { pher->refresh(); pher->setSignal(Signal(SignalType::queen,*getCenter(),species)); } }
double CNE::Optimize(DecomposableFunctionType& function, arma::mat& iterate) { // Make sure for evolution to work at least four candidates are present. if (populationSize < 4) { throw std::logic_error("CNE::Optimize(): population size should be at least" " 4!"); } // Find the number of elite canditates from population. numElite = floor(selectPercent * populationSize); // Making sure we have even number of candidates to remove and create. if ((populationSize - numElite) % 2 != 0) numElite--; // Terminate if two parents can not be created. if (numElite < 2) { throw std::logic_error("CNE::Optimize(): unable to select two parents. " "Increase selection percentage."); } // Terminate if at least two childs are not possible. if ((populationSize - numElite) < 2) { throw std::logic_error("CNE::Optimize(): no space to accomodate even 2 " "children. Increase population size."); } // Set the population size and fill random values [0,1]. population = arma::randu(iterate.n_rows, iterate.n_cols, populationSize); // Store the number of elements in a cube slice or a matrix column. elements = population.n_rows * population.n_cols; // initializing helper variables. fitnessValues.set_size(populationSize); Log::Info << "CNE initialized successfully. Optimization started." << std::endl; // Find the fitness before optimization using given iterate parameters. size_t lastBestFitness = function.Evaluate(iterate); // Iterate until maximum number of generations is obtained. for (size_t gen = 1; gen <= maxGenerations; gen++) { // Calculating fitness values of all candidates. for (size_t i = 0; i < populationSize; i++) { // Select a candidate and insert the parameters in the function. iterate = population.slice(i); // Find fitness of candidate. fitnessValues[i] = function.Evaluate(iterate); } Log::Info << "Generation number: " << gen << " best fitness = " << fitnessValues.min() << std::endl; // Create next generation of species. Reproduce(); // Check for termination criteria. if (tolerance >= fitnessValues.min()) { Log::Info << "CNE::Optimize(): terminating. Given fitness criteria " << tolerance << " > " << fitnessValues.min() << "." << std::endl; break; } // Check for termination criteria. if (lastBestFitness - fitnessValues.min() < objectiveChange) { Log::Info << "CNE::Optimize(): terminating. Fitness history change " << (lastBestFitness - fitnessValues.min()) << " < " << objectiveChange << "." << std::endl; break; } // Store the best fitness of present generation. lastBestFitness = fitnessValues.min(); } // Set the best candidate into the network parameters. iterate = population.slice(index(0)); return function.Evaluate(iterate); }