簡體   English   中英

遺傳算法中的交叉

[英]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 ,但這是什么意思?

這意味着不是每cromosomesstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM