[英]Crossover in genetic algorithm
我遇到錯誤的部分(更具體地講,我看到一個彈出消息,指出“調試錯誤!已調用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);
}
}
它已經足夠顯示“ test 0”或“ test 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);
我很驚訝您得到沒有std::endl
“ test0”或“ test1”
跟隨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
,但這是什么意思?
這意味着不是每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));
?
ps:對不起,我的英語不好。
-編輯-
如果您打算保留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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.