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