通过构造函数创建的所有对象都具有相同的向量

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)

Ted*_*gmo 5

您使用相同的值为随机数生成器设置种子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)