2016-05-05 2 views
0

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

Я попытался изменить линию, где он назначает старые гены новому человеку, но независимо от того, что я пытаюсь, я не могу заставить его работать.

Если кто-то может показать мне, где (или как) я баловаться, я был бы очень благодарен :)

Edit: Шагая через отладчик, я получаю следующее

http://prnt.sc/b0iprq Unhandled исключение в .... в LearnCPP.exe: Microsoft C++ исключения: станд :: out_of_range в ячейке памяти .....

другого редактирования: Просто чтобы быть ясно, именно это точная линия, где происходит преждевременное прекращение:

new_individuals[k].chromosomes[0].at(i) = individuals[father].chromosomes[0].at(i); 
+0

Лучший способ узнать, что не так, это пройти через ваш код с отладчиком. –

+0

Я сделал, но это не делает его намного яснее для меня: \ http://prnt.sc/b0iprq - это то, что я получаю. В тексте: Необработанное исключение в .... в LearnCPP.exe: исключение Microsoft C++: std :: out_of_range в ячейке памяти ..... – Milan

+0

Проверьте, соответствуют ли 'k' и' i' допустимые значения для доступа к элементам, когда вы достигните этой линии. –

ответ

1

Я удивлен, что вы получите "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> размера 0.

Итак, когда вы получаете доступ

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.: Извините за мой плохой английский.

--- EDIT ---

Если ваше намерение заказать 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); 
} 
+0

new_individuals [k] .chromosomes [0] .push_back (индивидуумы [отец] .хромосом [0] .at (i)); - это именно то, что мне действительно нужно! Огромное спасибо. Что касается почему k == 1, а не 0, то первый вектор (так k = 0) уже заполнен лучшими генами последнего поколения, как своего рода просто элитизм. Только один вопрос, как мне было сделать изменение размера, если бы я хотел иметь хромосомы в качестве вектора размера 7 вместо размера 0? Я думал, сделав chromosomes.resize, я изменил их размер до 7, но вы говорите, что я не изменяю размер вектора? В любом случае, большое спасибо! – Milan

+0

Еще раз спасибо за ваше редактирование :) Вы очень помогли, спасибо. – Milan

Смежные вопросы