【发布时间】:2016-08-31 03:24:45
【问题描述】:
我得到错误的部分(更具体地说,我得到一个弹出窗口说 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);
【问题讨论】:
-
找出问题所在的最佳方法是使用调试器单步调试代码。
-
我做到了,但这并没有让我更清楚:\ prnt.sc/b0iprq 是我得到的。在文本中:LearnCPP.exe 中 .... 处的未处理异常:Microsoft C++ 异常:内存位置处的 std::out_of_range .....
-
检查
k和i是否包含有效值以在到达该行时访问元素。 -
我只是这样测试的:new_individuals[1].chromosomes[0].at(0) = individual[father].chromosomes[0].at(0);哪个应该是有效值。父亲和母亲也都有一个有效值,我通常会输出它,但我在将代码发布到此处之前对其进行了修剪。我也只是在尝试将值分配给新向量之前简单地让它输出 i 和 k 来尝试它,它输出 i = 0 和 k = 1 这是正确的。
标签: c++ genetic-algorithm crossover