Кроссовер в генетическом алгоритме

Часть, где я получаю ошибку (более конкретно, где я получаю всплывающее окно с сообщением об ошибке Debug! 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);

0

Решение

Я удивлен, что вы получаете «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>> размером 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] существовать но имеет размер 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 .: извините за мой плохой английский.

— РЕДАКТИРОВАТЬ—

Если вы планируете забронировать 7×7 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]