Я пытаюсь реализовать генетический алгоритм в C ++. После того, как я инициализирую свою популяцию (вектор P
), я мгновенно подгоняю сгенерированную хромосому и сохраняю число пригодности в двойном векторе (f
вектор).
Как я могу отсортировать P
вектор на основе отсортированного f
вектора? Я пытался упростить код. Нет подходящего метода, только метод, который генерирует случайные двойные числа.
Мне удалось отсортировать строковой вектор на основе целого вектора, используя zip и unzip. Но я не могу отсортировать вектор типа int по двойному вектору. Я не могу заставить его работать, когда у меня есть вектор int вектора и двойной вектор.
EDIT: Я добавил методы и реализацию кода, который объединяет векторы ирасстегивает молнию на них. Идея состоит в том, что после zip я бы отсортировал векторы, а после их разархивировал. Эти методы и реализация работают, если один вектор является строковым, а другой - двойным или целочисленным (при условии, что они имеют одинаковый размер).
# include <vector>
# include <string>
# include <algorithm>
# include <iostream>
# include <iterator>
# include<sstream>
using namespace std;
//method for zipping
template <typename A, typename B>
void zip(
const std::vector<A> &a,
const std::vector<B> &b,
std::vector<std::pair<A,B>> &zipped)
{
for(size_t i=0; i<a.size(); ++i)
{
zipped.push_back(std::make_pair(a[i], b[i]));
}
}
//method for unzipping
template <typename A, typename B>
void unzip(
const std::vector<std::pair<A, B>> &zipped,
std::vector<A> &a,
std::vector<B> &b)
{
for(size_t i=0; i<a.size(); i++)
{
a[i] = zipped[i].first;
b[i] = zipped[i].second;
}
}
int toInt(std::string str){
int num;
std::stringstreamss(str);
ss >> num;
return num;
}
// variable components / genes
const string GENES = "01";
// bitstring length const
int BITLEN = 100;
// generate random numbers in given range
int gen_rand_number(int start, int end){
int range = (end - start) + 1;
// from 1 to range
int random_int = start + (rand() % range);
return random_int;
}
// random character for random bitstring
char genes(){
int len = GENES.size();
int rn = gen_rand_number(0, len - 1);
return GENES[rn];
}
// string of genes / chromosome
string create_chromosome(){
string chrom = "";
for (int i = 0;i < BITLEN;i++)
chrom += genes();
return chrom;
}
double fRand(double fMin, double fMax){
double f = (double) rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
}
int main()
{
int mu = 1000; //population size
int n = 100; //dimensions
vector < vector < int > > P(mu, vector < int > (n));
vector < double > f;
for (int i=0; i != mu;++i){
P[i].push_back(toInt(create_chromosome()));
}
for (int i=0; i != mu;++i){
f.push_back(fRand(0.1, 4.0));
}
// Zip the vectors together
//if instead of pair<int,double> it had
//pair<std::string,double> and P was an int vector, it would work.
std::vector<std::pair<int,double>> zipped;
zip(P, f, zipped);
// Sort the vector of pairs
std::sort(std::begin(zipped), std::end(zipped),
[&](const auto& a, const auto& b)
{
//sort decreasing order
return a.second < b.second;
});
// Write the sorted pairs back to the original vectors
unzip(zipped, P, f);
return 0;
}