矢量内部矢量(创建染色体)

时间:2016-04-27 21:10:02

标签: c++ vector genetic-algorithm

我正在尝试构建一个可以采用一定数量变量的遗传算法(比如4),并以某种方式使用它们,这样你就可以得到2a + 3b + c * c + d = 16.我意识到有更有效的计算方法,但我想尝试建立一个遗传算法,以便以后扩展。

我首先尝试创造可以在以后竞争的“有机体”。我所做的就是:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <random>

// Set population size

const int population_size = 10;
const int number_of_variables = 4;


int main()
{
// Generate random number

std::random_device rd;    
std::mt19937 rng(rd());    // random-number engine (Mersenne-Twister in this case)
std::uniform_int_distribution<int> uni(-10, 10); 

// Set gene values.

std::vector<int>chromosome;
std::vector<int>variables;


for (int i = 0; i < number_of_variables; ++i)
{
    double rand_num = uni(rng);
    variables.push_back (rand_num);
    std::cout << variables[i] << "\n";
}



return 0;
}

它会填满number_of_variables向量,并输出这些只是因为这让我很清楚它实际上正在做我打算做的事情。我想要它做的是用一个变量向量填充每个“染色体”,以便例如染色体0具有值{1,5,-5,9}等。

以下代码显然无效,但我希望这样做:

for (int j = 0; j < population_size; ++j)
{
    for (int i = 0; i < number_of_variables; ++i)
    {
        double rand_num = uni(rng);
        variables.push_back(rand_num);
    }

    chromosome.push_back(variables[j]);
    std::cout << chromosome[j] << "\n";
}

意味着它会随机填充变量,然后染色体1将采用“变量”所取的那4个值,然后重复。实际发生的是(我认为)它只取“变量”中的第一个值并将其复制到“染色体”而不是全部4个。

如果有人能帮忙,我会非常感激,我意识到这可能只是一个新手的错误,只是在一个更有经验的载体的人看来是可笑的(这可能是本网站99%的人,哈哈)。

无论如何,谢谢:)。

2 个答案:

答案 0 :(得分:1)

#include <iostream>
#include <vector>
#include <random>

// Set population size

const int population_size = 10;
const int number_of_variables = 4;


int main()
{
// Generate random number

std::random_device rd;    
std::mt19937 rng(rd());    // random-number engine (Mersenne-Twister in this case)
std::uniform_int_distribution<int> uni(-10, 10); 

// Set gene values.

std::vector< std::vector<int>>chromosome;


for( int kp = 0; kp < population_size; kp++ )
{
    std::vector<int>variables;
for (int i = 0; i < number_of_variables; ++i)
{
    double rand_num = uni(rng);
    variables.push_back (rand_num);

}
chromosome.push_back( variables );
}

// display entire population

for( auto c : chromosome )
{
    for( auto v : c )
    {
        std::cout << v << " ";
    }
    std::cout << "\n";
}

// display 4th member of population

for( auto v : chromosone[ 3 ] )
    {
        std::cout << v << " ";
    }
    std::cout << "\n";

return 0;
}

http://ideone.com/2jastĴ

答案 1 :(得分:1)

您可以使用以下语法将矢量放置在矢量中:

std::vector<std::vector<int>>

但是您需要使外部向量足够大以容纳num_variables。

#include <vector>
#include <cstdlib>

using Individual = std::vector<int>;
using Population = std::vector<Individual>;
// short for std::vector<std::vector<int>>;

const size_t number_of_variables = 8;

int main() {
    Population population(10);

    for (auto& individual : population) {
        individual.resize(number_of_variables);
        for (size_t j = 0; j < number_of_variables; ++j) {
            individual[j] = j;  // replace with random number
        }
    }
}

现场演示:http://ideone.com/pfufGt