簡體   English   中英

人口變得陳舊 - 遺傳算法

[英]Population becomes stale - Genetic Algorithm

我正在構建一個簡單的“Hello,World!” 用於學習目的的遺傳算法。 我的人口是一組隨機字符串。 通過變異和交叉,弦樂演變為“Hello,World!”。 出於某種原因,我的人口將保持健康分數,似乎從未進化過。 其他時候,我的人口將達到目標基因,“Hello,World”。 我正在使用隨機選擇和一點交叉。 雖然,當我使用錦標賽和輪盤賭選擇時也會發生這種情況。

題:
為什么我的人口變得陳舊而未達到目標基因,即使我通過突變使人口多樣化? 是因為遺傳算法的隨機性或我的代碼中的錯誤?

例如
人群中的每個染色體最終都會擁有基因“HellV,Wor`dL”。 即使在10,000代之后,基因也是相同的。 其他時候,基因到達目標基因“Hello,World!” 經過~33代。

  • 注意: 使用Java時,下面的代碼按預期工作。 使用Java時,人口總是達到目標基因。 另外,我今天剛開始學習C ++,所以很有可能我的代碼中存在一個我只是沒有看到的缺陷。

人口規模:333
精英主義:是的
精英百分比:25%
突變概率:20%
交叉概率:95%
選擇類型:隨機
交叉類型:一點

編輯:我已經從這篇文章中刪除了代碼,而是添加了一個鏈接到我的github,因為它是幾百行代碼。

遺傳算法 - C ++

感謝@ molbdnilo的評論,我能夠解決我的問題。

事實證明,這是因為C ++如何復制對象,這解釋了為什么這段代碼在Java而不是C ++中工作。

如@molbdnilo所述:

從Java遷移到C ++時最常見的問題之一是C ++如何在Java傳遞引用的地方復制對象。

為了解決我的問題,我更改了以下方法聲明:

1. int calculateFitness(GAChromosome chromosome); ---> int calculateFitness(GAChromosome const &chromosome);
在這個方法聲明中,我告訴編譯器我想通過引用而不是值傳遞染色體,使用&,並使用const使其成為常量。 這樣做可以防止染色體被復制和改變。

2. void mutate(GAChromosome chromosome); ---> void mutate(GAChromosome &chromosome);
在這個方法聲明中,我告訴編譯器我想通過引用而不是值來傳遞染色體,使用&。 這樣做可以防止染色體被復制。 由於前一個方法聲明沒有指定染色體是通過引用傳遞的,因此在方法到達范圍結束后,正在制作,更改副本,然后將其拋出。 最終,這些變化從未發生過。

3. std::pair<GAChromosome, GAChromosome> onePointCrossover(GAChromosome chromosomeA, GAChromosome chromosomeB); ---> std::pair<GAChromosome, GAChromosome> onePointCrossover(GAChromosome const &chromosomeA, GAChromosome const &chromosomeB);
在這個方法聲明中,我告訴編譯器我想通過引用而不是值傳遞染色體,使用&,並使用const使其成為常量。 這樣做可以防止染色體被復制和改變。

總之,問題源於染色體傳遞給mutate方法的方式。 染色體是通過值而不是通過引用傳遞的,導致染色體被復制,並且當mutate方法到達范圍的末尾時,變化被拋出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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