Dhy*_*eyL 1 c++ oop genetic-algorithm
我是 C++ 的新手,我正在尝试创建一个基本的遗传算法。我创建了一个 Chromosome 类,并想创建一个 Society 类,该类生成这些染色体的向量,其中包含随机生成的“基因”。基因是染色体中的向量,其值为 0 或 1。我正在测试染色体构造函数,所有对象都具有相同的基因向量。如何让构造函数生成随机值?我在下面包含了代码。任何其他编码实践或优化技巧也将不胜感激。
源文件
#include "Chromosome.h"
#include "Society.h"
using namespace std;
int main()
{
Chromosome demo = Chromosome::Chromosome();
Chromosome demo2 = Chromosome::Chromosome();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
染色体.h
#pragma once
#include <vector>
using namespace std;
class Chromosome
{
private:
int fitness;
vector<int> genes;
public:
Chromosome();
void generateGenes();
int calculateFitness(),
getFitness();
vector<int> getGenes();
void setGenes(vector<int> child);
};
Run Code Online (Sandbox Code Playgroud)
染色体.cpp
#include "Chromosome.h"
#include <cstdlib>
#include <ctime>
#include <numeric>
using namespace std;
Chromosome::Chromosome()
{
generateGenes();
Chromosome::fitness = calculateFitness();
}
void Chromosome::generateGenes()
{
srand(time(NULL));
for (unsigned i = 0; i < 10; i++)
{
unsigned chance = rand() % 5;
Chromosome::genes.push_back((!chance)? 1 : 0);
}
}
int Chromosome::calculateFitness()
{
int sum = 0;
for (unsigned i = 0; i < Chromosome::genes.size(); i++)
{
sum += Chromosome::genes[i];
}
return sum;
}
int Chromosome::getFitness()
{
return Chromosome::fitness;
}
vector<int> Chromosome::getGenes()
{
return Chromosome::genes;
}
void Chromosome::setGenes(vector<int> child)
{
Chromosome::genes = child;
}
Run Code Online (Sandbox Code Playgroud)
您使用相同的值为随机数生成器设置种子time(NULL)。彼此之后的两次调用将返回相同的time_t。您将首先生成一组随机数,然后重置随机数生成器并再次生成它们。
在整个程序运行期间只调用srand() 一次。
此外,<random>改用以获得更好/更快的随机数生成器。
而不是rand() % 5;使用<random>:
#include <random>
// A function to return a random number generator.
inline std::mt19937& generator() {
// the generator will only be seeded once since it's static
static std::mt19937 gen(std::random_device{}());
return gen;
}
// A function to generate unsigned int:s in the range [min, max]
int my_rand(unsigned min, unsigned max) {
std::uniform_int_distribution<unsigned > dist(min, max);
return dist(generator());
}
Run Code Online (Sandbox Code Playgroud)
然后调用它:
unsigned chance = my_rand(0, 4);
Run Code Online (Sandbox Code Playgroud)