0

我得到错误的部分(更具体地说,我得到一个弹出窗口说 Debug error!Abort () 已被调用)是我尝试进行交叉的部分。

for (int i = 0; i < number_of_variables; i++)
    {
        int gene1 = gene_selection(rng);
        std::cout << gene1 << " ";
        if (gene1 == 0)
        {
            std::cout << "test 0";
            new_individuals[k].chromosomes[0].at(i) = individuals[father].chromosomes[0].at(i);
        }
        else if (gene1 == 1)
        {
            std::cout << "test 1";
            new_individuals[k].chromosomes[0].at(i) = individuals[mother].chromosomes[0].at(i);
        }
    }

它足以显示“测试 0”或“测试 1”,但它实际上不会将来自父亲/母亲的基因分配给 new_individual。

我已经尝试改变将旧基因分配给新个体的线路,但无论我尝试什么,我都无法让它发挥作用。

如果有人能告诉我我在哪里(或如何)搞砸了,我会非常感激:)

编辑:通过调试器,我得到以下信息

http://prnt.sc/b0iprq 未处理的异常在 .... 在 LearnCPP.exe:Microsoft C++ 异常:std::out_of_range 在内存位置.....

另一个编辑:为了清楚起见,正是发生中止的这一行:

new_individuals[k].chromosomes[0].at(i) = individuals[father].chromosomes[0].at(i);
4

1 回答 1

1

我很惊讶你得到“test0”或“test1”,没有std::endl

跟随故事new_individuals

您分配并调整它的大小

std::vector<one_individual> new_individuals;
new_individuals.resize(population_size);

接下来resize(),您有一个包含population_size(5)个大小为 0 的one_individual元素chromosomes的向量。std::vector<std::vector<double>>

接下来你调整chromosomes大小

for (int i = 0; i < population_size; i++)
{
    new_individuals[i].chromosomes.resize(number_of_variables);
}

此时您cromosomes的大小为number_of_variables(7),但这是什么意思?

这比每一个cromosomes都是一个大小为零std::vector的七个std::vector<double>

所以,当你访问

new_individuals[k].chromosomes[0].at(i)

k == 1(为什么是 1 而不是 0?)和i == 0new_individual[1].chromosomes[0]存在大小为 0,new_individuals[k].chromosomes[0].at(i)检查大小chromomoses[0]以查看是否至少为 1,失败并导致异常(std::out_of_range

您的意图是分配每个new_individuals[i].chromosomes[j]?

或者你的意图是写

new_individuals[k].chromosomes[0].push_back(individuals[father].chromosomes[0].at(i));

?

ps:对不起我的英语不好。

- - 编辑 - -

如果您打算保留 7x7 chromosomes,一种方法可以是

for (int i = 0; i < population_size; i++)
{
    new_individuals[i].chromosomes.resize(number_of_variables);

    for (int j = 0; j < population_size; j++)
        new_individuals[i].chromosomes[j].resize(number_of_variables);
}

即使使用push_back(),我建议你预留空间

for (int i = 0; i < population_size; i++)
{
    new_individuals[i].chromosomes.resize(number_of_variables);

    for (int j = 0; j < population_size; j++)
        new_individuals[i].chromosomes[j].reserve(number_of_variables);
}
于 2016-05-05T12:15:57.853 回答