c++ - 我的数组是导致 CPU 和内存快速增加的原因吗?

标签 c++ ram genetic-algorithm

我的 MCVC 正在编译但未按预期运行。目标是执行基础知识的遗传算法,即交叉、变异、进化。在我提供的代码中,应该打印出良好的工作陈述,但事实并非如此。我是一个新程序员,对不起。 我的问题是:

1) cpu 和 ram 被加速,这个数组声明和实现是不受控制的尖峰的原因吗?

std::array<std::auto_ptr<Individual>,50>myarray;

2) 我的 2.53 GHz Intel Core 2 Duo 不适合吗?

3) 我应该减少循环次数吗?

随时欢迎任何帮助!

个人.h

#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <array>
#include <iostream>
class Individual
{
public:

    inline int getRandomNumber(int min = 0, int max = 1)
    {
        srand(static_cast<unsigned int>(time(0)));
        static const double fraction = 1.0 / (static_cast<double>(RAND_MAX) + 1.0);
        return static_cast<int>(rand() * fraction * (max - min + 1) + min);
    }
private:
    int defaultGeneLength = 64;
    std::vector<char>genes;
    int fitness = 0;

public:
    Individual()
    {
        std::cout<<"Good Job";

    }

    //setters and getters
    void generateIndividual();
    void setDefaultGeneLength(int length);
    char getGene(int index);
    void setGene(int index, char value);

    //public methods
    unsigned int size();
    int getFitness();
    std::string toString();
};

个人.cpp

#include "Individual.h"

void Individual::generateIndividual()
{
    for (int i = 0; i < size(); i++)
    {
        genes.push_back(getRandomNumber());
    }
}


//setters and getters
void Individual::setDefaultGeneLength(int length)
{
    defaultGeneLength = length;
}


char Individual::getGene(int index)
{
    return genes.at(index);

}


void Individual::setGene(int index, char value)
{
    genes[index] = value;
    fitness = 0;
}


//public methods
unsigned int Individual::size()
{
    return genes.max_size();
}


int Individual::getFitness()
{
    if(fitness == 0)
    {
        fitness = 1;

    }   return fitness;

}


std::string Individual::toString()
{
    std::string geneString = "";
    for (int i = 0; i < size(); i++)
    {
        geneString.append(getGene(i),1);
    }
    return geneString;

}

人口.h

#include "Individual.h"

class Population
{
std::array<std::auto_ptr<Individual>,50>myarray;

public:


    Population(int populationSize, bool initialise)
    {
        std::cout<<"Good Job2";
        if(initialise)
        {
            for (int i = 0; i < populationSize; ++i)
            {
                std::auto_ptr<Individual>newIndividual(new Individual());
                myarray.at(i) = newIndividual;
                myarray.at(i)->generateIndividual();
                saveIndividual(i,*(myarray.at(i)));
            }
        }
        std::cout<<"Good Job 3";
    }

    Individual getIndividual(int index);
    Individual getFittest();
    unsigned long size();
    void saveIndividual (int index, Individual indiv);

    ~Population()
    {

    }
};

人口.cpp

#include "Population.h"
Individual Population::getIndividual(int index)
{
    return *myarray.at(index);
}

Individual Population::getFittest()
{
    Individual fittest = *myarray.at(0);

    for (int i = 0; i < myarray.max_size(); i++)
    {
        if (fittest.getFitness() <= getIndividual(i).getFitness())
        {
            fittest = getIndividual(i);
        }
    }
    return fittest;
}

unsigned long Population::size()
{
    return myarray.max_size();
}

void Population::saveIndividual (int index, Individual indiv)
{
    *myarray.at(index) = indiv;
}

main.cpp

int main(int argc, const char * argv[]) {

    Population *mypop = new Population(2,true);
    delete mypop;
    mypop = nullptr;
return 0;
}

最佳答案

unsigned int Individual::size()
{
    return genes.max_size();
}

你的 genes是一个:

std::vector<char> genes;

C++ 标准定义了std::vector::max_size()如下:

distance(begin(), end()) for the largest possible container

没有具体说明“最大可能的容器”是什么意思。 “可能”可以指任何东西,比如,如果系统有一个 10 TB 的硬盘驱动器,那么操作系统就可以使用整个硬盘驱动器来分页其虚拟内存地址空间。从某种意义上说,这当然是“可能的”。但不用说,分页出 10 TB 将需要一段时间。

使用 64 位 gcc,以下简单程序:

#include <iostream>
#include <vector>

int main()
{
    std::vector<char> c;

    std::cout << c.max_size() << std::endl;
    return 0;
}

产生以下输出:

18446744073709551615

但是,我能够实际创建这种大小的 vector 的机会不是很大。

但让我们回到您的代码:

void Individual::generateIndividual()
{
    for (int i = 0; i < size(); i++)
    {
        genes.push_back(getRandomNumber());
    }
}

好的。你一定觉得很幸运。你相信你有可能创造一个vector<char>那是max_size()大。

你确定吗?

我有点怀疑。

关于c++ - 我的数组是导致 CPU 和内存快速增加的原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39461157/

相关文章:

python - 使用单纯形和遗传算法最小化非常嘈杂的 6 参数函数 - Python 语言

c++ - 将数组内容打印到序列号,给出意外的值

c++ - 为什么我可以在没有实例化的类上调用函数?

c++ - 使用嵌套类继承模板类

python - 防止 RAM 分页到交换区 (mlock)

R 读取一个巨大的 csv

SQL 查询和 RAM 问题

c++ - linux内核模块链接器警告: "*** Warning: <function> [<module>] undefined!" - any way to get rid of them?

python - 如何修复简单 GA(Python)中的过早收敛?

genetic-algorithm - 如何在遗传算法中将数字表示为染色体?