遺傳演算法初級

2022-05-01 02:12:09 字數 2321 閱讀 5694

遺傳演算法是一種基於仿生學的計算機演算法,通過模擬自然進化和優勝劣汰法則來搜尋問題的最優解(我會說這其實就是稍微改良了一下的暴搜?)

它是由美國的j.holland於2023年提出來的玄學概率學混合暴力搜尋方法,廣泛適用於尋找演算法優解、機器學習、人工生命、自適應自學習演算法等等各種領域。

但是要知道,這個玄學的演算法在用於尋找演算法最優解時有一些限制:該演算法最好是不能直接用公式套出最優解的演算法。

such as luogup1018的乘積最大,雖然理論上你可以用遺傳來做,但明顯這道題用動歸就能算出來好不好。。。

像經濟**這類的,根本沒有一種演算法能夠算出最優解(完全符合實際的趨勢)的問題,遺傳演算法的極大優勢才會凸顯出來

ok現在來講講遺傳演算法是什麼

讓我們想像有一群山羊,每個山羊跑步的能力不同,有的跑的快,有的跑的慢。這其實就是乙個種群。

比如說這群山羊有100只

1 structgoatf[101];

至於dna是什麼待會再說。

山羊每年都會繁殖,且假定每年種群中增加的新生兒都是10個。這樣這個種群就會以乙個一次函式的形式增長好吧我只是順便溫習前幾天學的高中生物

但不幸的是,這群神奇的山羊生活的地方又有一群狼,每年狼都會吃掉羊群中的十隻跑得最慢的山羊。所以很明顯的,每年山羊種群中跑得最慢的個體被淘汰掉,所以留下來的跑得越來越快,也更有機會能產下後代。慢慢的,整個山羊種群中活下來的都是跑得最快的山羊,以及它們產下的優良子代。

所以整個演算法就是:計算每個個體的適應環境程度,然後根據適應度越高繁殖後代概率越大的原則,從群體中選出兩個個體作為父方母方產下後代,然後對該後代的基因進行變異。不斷重複上述操作,直到你決定停為止。然後選出乙個最優個體。

怎麼實現呢?

先來說繁殖。

受到人類染色體結構的啟發,我們可以設想一下,假設目前只有「0」,「1」兩種鹼基,我們也用一條鏈條把他們有序的串連在一起,因為每乙個單位都能表現出 1 bit的資訊量,所以一條足夠長的染色體就能為我們勾勒出乙個個體的所有特徵。這就是二進位制編碼法,染色體大致如下:

010010011011011110111110

這就是乙隻山羊的dna。(當然是模擬山羊)

應當注意的是,我們要學會分辨個體的特徵中哪些比較重要,哪些不大重要。比如說山羊,雖然它頭上的角花紋是螺旋形還是條紋形也算它的乙個遺傳特徵,但這跟它跑得快還是跑得慢完全沒有關係。對於這種特徵,我們就不需要把它程式設計實現了。

然後來討論一下有用的特徵。dna就類似於乙個二進位制集合,01分別表示該特徵存在還是不存在。比如01表示乙隻山羊沒有靈活的關節但有四條長腿,10表示山羊的關節很靈活但是腿很短,等等(至於11這種人生贏家和00這樣的辣雞都去死吧)有關於二進位制集合的操作我也有發部落格。

現在我們有乙個父親0100和母親1001

對於後代的每一位dna,我們可以抽隨機數,表示這一位dna是隨他爸爸還是隨他媽媽。讓我們假設他的運氣比較好,第一位隨他媽媽,第二位隨他爸爸,第三位隨他媽媽,第四位又隨他媽媽

這樣後代的dna就是1101

當然,只有遺傳是不夠的,沒有變異怎麼能算的上是乙個好模擬(好你可以閉嘴了)

假設對於山羊的每一位基因,有%0.01的概率,能讓該位的1變成0,0變成1。然後這個神奇的後代又足夠幸運,剛好在第三位dna變異了

第一位羊生贏家誕生!

好了現在它的dna序列是1111,也就是最好狀況。假設乙個『1』代表速度+1,那麼它現在的速度就是4

然後自然而然的,我們就講到了父母親代的選擇上。在這裡,我們用乙個輪盤賭的演算法來模擬哪只山羊能被選中。

首先把所有的個體適應度相加作為總適應度sum,然後 隨機生成乙個1~sum之間的數random

然後從1開始遍歷群體陣列,每次tot+=f[i]的適應度。當tot>=random的時候,選擇當前個體作為遺傳親代。

當然母方也是這麼選咯

使用這個輪盤賭演算法,你可以發現,適應度越高的個體越容易被選中,但被選中的也不全是適應度最高的個體。因為有一種可能,所有適應度高的個體普遍缺少最後兩個優勢特徵,而乙個適應度很低的個體卻正好擁有這兩個特徵

比如說這三個

01101111000

10111111000

00000000111

很明顯第乙個或者第二個跟第三個個體繁殖都會取到明顯的好效果。所以說給別人留台階就是給自己留後路啊

這就是輪盤賭的意義

好了遺傳演算法初級部分大概講完了。布置兩道小題目

1.創造乙個有1000個個體的種群,並在500次進化中使最優個體的基因盡量接近這串字元dna碼「mynameislife」。

2.試著用遺傳演算法做01揹包。(當然如果你得到的答案是錯誤的真的不怪你,因為這個問題有最優解演算法不適合遺傳)發個luogu二維揹包鏈結

本篇部落格就講到這裡,謝謝大家

python遺傳演算法 Python 遺傳演算法實現

關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...

遺傳演算法 python 簡書 遺傳演算法

優化的演算法有很多種,從最基本的梯度下降法到現在的一些啟發式演算法,如遺傳演算法 ga 差分演化演算法 de 粒子群演算法 pso 和人工蜂群演算法 abc 舉乙個例子,遺傳演算法和梯度下降 梯度下降和遺傳演算法都是優化演算法,而梯度下降只是其中最基礎的那乙個,它依靠梯度與方向導數的關係計算出最優值...

遺傳演算法歸納

遺傳演算法 genetic algorithm 是一類借鑑生物界的進化規律 適者生存 優勝劣汰遺傳機制 演化而來的隨機化搜尋方法。其主要特點是直接對結構物件進行操作,不存在求導和函式連續性的限定 具有內在的隱並行性和更好的全域性尋優能力 採用概率化的尋優方法,能自動獲取和指導優化的搜尋空間,自適應地...