gpt4 book ai didi

c++ - 遗传算法中的交叉

转载 作者:行者123 更新时间:2023-11-28 05:41:16 25 4
gpt4 key购买 nike

我遇到错误的部分(更具体地说,我收到一个弹出窗口说调试错误!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/b0iprqLearnCPP.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() ,你有一个 vector population_size (5) one_individual元素在哪里 chromosomesstd::vector<std::vector<double>>大小为 0。

接下来调整 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]存在 but 大小为 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);
}

关于c++ - 遗传算法中的交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37048917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com