std::vector<std::pair<population::size_type,std::vector<population::individual_type>::size_type> > random_r_policy::select(const std::vector<population::individual_type> &immigrants, const population &dest) const { const population::size_type rate_limit = std::min<population::size_type>(get_n_individuals(dest),boost::numeric_cast<population::size_type>(immigrants.size())); // Temporary vectors to store sorted indices of the populations. std::vector<population::size_type> immigrants_idx(boost::numeric_cast<std::vector<population::size_type>::size_type>(immigrants.size())); std::vector<population::size_type> dest_idx(boost::numeric_cast<std::vector<population::size_type>::size_type>(dest.size())); // Fill in the arrays of indices. iota(immigrants_idx.begin(),immigrants_idx.end(),population::size_type(0)); iota(dest_idx.begin(),dest_idx.end(),population::size_type(0)); // Permute the indices (immigrants). for (population::size_type i = 0; i < rate_limit; ++i) { population::size_type next_idx = i + (m_urng() % (rate_limit - i)); if (next_idx != i) { std::swap(immigrants_idx[i], immigrants_idx[next_idx]); } } // Permute the indices (destination). for (population::size_type i = 0; i < rate_limit; ++i) { population::size_type next_idx = i + (m_urng() % (dest.size() - i)); if (next_idx != i) { std::swap(dest_idx[i], dest_idx[next_idx]); } } // Return value. std::vector<std::pair<population::size_type,std::vector<population::individual_type>::size_type> > retval; for (population::size_type i = 0; i < rate_limit; ++i) { retval.push_back(std::make_pair(dest_idx[i],immigrants_idx[i])); } return retval; }
// Selection implementation. std::vector<std::pair<population::size_type,std::vector<population::individual_type>::size_type> > worst_r_policy::select(const std::vector<population::individual_type> &immigrants, const population &dest) const { const population::size_type rate_limit = std::min<population::size_type>(get_n_individuals(dest),boost::numeric_cast<population::size_type>(immigrants.size())); // Temporary vectors to store sorted indices of the populations. std::vector<population::size_type> immigrants_idx(boost::numeric_cast<std::vector<population::size_type>::size_type>(immigrants.size())); std::vector<population::size_type> dest_idx(boost::numeric_cast<std::vector<population::size_type>::size_type>(dest.size())); // Fill in the arrays of indices. iota(immigrants_idx.begin(),immigrants_idx.end(),population::size_type(0)); iota(dest_idx.begin(),dest_idx.end(),population::size_type(0)); // Sort the arrays of indices. // From best to worst. std::sort(immigrants_idx.begin(),immigrants_idx.end(),indirect_individual_sorter<std::vector<population::individual_type> >(immigrants,dest)); // From worst to best. std::sort(dest_idx.begin(),dest_idx.end(),indirect_individual_sorter<population>(dest,dest)); std::reverse(dest_idx.begin(),dest_idx.end()); // Create the result. std::vector<std::pair<population::size_type,std::vector<population::individual_type>::size_type> > result; for (population::size_type i = 0; i < rate_limit; ++i) { // Similar to fair policy, but replace unconditionally, without checking if the incoming individuals are better. result.push_back(std::make_pair(dest_idx[i],immigrants_idx[i])); } return result; }