Как отсортировать вектор int из векторов на основе правильного двойного вектора? - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь реализовать генетический алгоритм в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...