遗传算法中的交叉
Crossover in genetic algorithm
我得到错误的部分(更具体地说,我得到一个弹出窗口说 Debug error!Abort () has been called)是我尝试进行交叉的部分。
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);
}
}
它足以显示 "test 0" 或 "test 1",但它实际上不会将 father/mother 中的基因分配给 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);
我很惊讶你得到 "test0" 或 "test1",没有 std::endl
关注new_individuals
的故事
您使用
分配和调整它的大小
std::vector<one_individual> new_individuals;
new_individuals.resize(population_size);
接下来这个 resize()
,你有一个包含 population_size
(5) one_individual
个元素的向量,其中 chromosomes
是大小为 0 的 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<double>
的 std::vector
。
因此,当您访问
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()
,我建议您保留 space
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);
}
我得到错误的部分(更具体地说,我得到一个弹出窗口说 Debug error!Abort () has been called)是我尝试进行交叉的部分。
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);
}
}
它足以显示 "test 0" 或 "test 1",但它实际上不会将 father/mother 中的基因分配给 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);
我很惊讶你得到 "test0" 或 "test1",没有 std::endl
关注new_individuals
您使用
分配和调整它的大小std::vector<one_individual> new_individuals;
new_individuals.resize(population_size);
接下来这个 resize()
,你有一个包含 population_size
(5) one_individual
个元素的向量,其中 chromosomes
是大小为 0 的 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<double>
的 std::vector
。
因此,当您访问
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()
,我建议您保留 space
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);
}