我正在尝试构建一个可以采用一定数量变量的遗传算法(比如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%的人,哈哈)。
无论如何,谢谢:)。
答案 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;
}
答案 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
}
}
}