我收到错误的部分(更具体地说,我得到一个弹出窗口说调试错误!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”,但它实际上不会将父亲/母亲的基因分配给新个体。
我已经尝试改变将旧基因分配给新个体的界限,但无论我尝试什么,我都无法使其发挥作用。
如果有人能告诉我在哪里(或如何)搞砸了,我会非常感激:)
编辑:单步执行调试器,我得到以下内容
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);
答案 0 :(得分:1)
我很惊讶你得到“test0”或“test1”,没有std::endl
关注new_individuals
您可以使用
分配和调整大小std::vector<one_individual> new_individuals;
new_individuals.resize(population_size);
接下来是resize()
,您有一个population_size
(5)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 == 0
,new_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));
p.s:抱歉我的英语不好。
---编辑---
如果你打算保留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);
}