遗传算法初级
遺傳算法是一種基于仿生學(xué)的計(jì)算機(jī)算法,通過(guò)模擬自然進(jìn)化和優(yōu)勝劣汰法則來(lái)搜索問(wèn)題的最優(yōu)解(我會(huì)說(shuō)這其實(shí)就是稍微改良了一下的暴搜?)
它是由美國(guó)的J.Holland于1975年提出來(lái)的玄學(xué)概率學(xué)混合暴力搜索方法,廣泛適用于尋找算法優(yōu)解、機(jī)器學(xué)習(xí)、人工生命、自適應(yīng)自學(xué)習(xí)算法等等各種領(lǐng)域。
但是要知道,這個(gè)玄學(xué)的算法在用于尋找算法最優(yōu)解時(shí)有一些限制:該算法最好是不能直接用公式套出最優(yōu)解的算法。
such as luoguP1018的乘積最大,雖然理論上你可以用遺傳來(lái)做,但明顯這道題用動(dòng)歸就能算出來(lái)好不好。。。
像經(jīng)濟(jì)預(yù)測(cè)這類(lèi)的,根本沒(méi)有一種算法能夠算出最優(yōu)解(完全符合實(shí)際的趨勢(shì))的問(wèn)題,遺傳算法的極大優(yōu)勢(shì)才會(huì)凸顯出來(lái)
OK現(xiàn)在來(lái)講講遺傳算法是什么
讓我們想像有一群山羊,每個(gè)山羊跑步的能力不同,有的跑的快,有的跑的慢。這其實(shí)就是一個(gè)種群。
比如說(shuō)這群山羊有100只
1 struct goat{ 2 int speed;3 int dna; 4 }f[101];
至于dna是什么待會(huì)再說(shuō)。
山羊每年都會(huì)繁殖,且假定每年種群中增加的新生兒都是10個(gè)。這樣這個(gè)種群就會(huì)以一個(gè)一次函數(shù)的形式增長(zhǎng)好吧我只是順便溫習(xí)前幾天學(xué)的高中生物
但不幸的是,這群神奇的山羊生活的地方又有一群狼,每年狼都會(huì)吃掉羊群中的十只跑得最慢的山羊。所以很明顯的,每年山羊種群中跑得最慢的個(gè)體被淘汰掉,所以留下來(lái)的跑得越來(lái)越快,也更有機(jī)會(huì)能產(chǎn)下后代。慢慢的,整個(gè)山羊種群中活下來(lái)的都是跑得最快的山羊,以及它們產(chǎn)下的優(yōu)良子代。
所以整個(gè)算法就是:計(jì)算每個(gè)個(gè)體的適應(yīng)環(huán)境程度,然后根據(jù)適應(yīng)度越高繁殖后代概率越大的原則,從群體中選出兩個(gè)個(gè)體作為父方母方產(chǎn)下后代,然后對(duì)該后代的基因進(jìn)行變異。不斷重復(fù)上述操作,直到你決定停為止。然后選出一個(gè)最優(yōu)個(gè)體。
怎么實(shí)現(xiàn)呢?
先來(lái)說(shuō)繁殖。
受到人類(lèi)染色體結(jié)構(gòu)的啟發(fā),我們可以設(shè)想一下,假設(shè)目前只有“0”,“1”兩種堿基,我們也用一條鏈條把他們有序的串連在一起,因?yàn)槊恳粋€(gè)單位都能表現(xiàn)出 1 bit的信息量,所以一條足夠長(zhǎng)的染色體就能為我們勾勒出一個(gè)個(gè)體的所有特征。這就是二進(jìn)制編碼法,染色體大致如下:
010010011011011110111110
這就是一只山羊的DNA。(當(dāng)然是模擬山羊)
應(yīng)當(dāng)注意的是,我們要學(xué)會(huì)分辨?zhèn)€體的特征中哪些比較重要,哪些不大重要。比如說(shuō)山羊,雖然它頭上的角花紋是螺旋形還是條紋形也算它的一個(gè)遺傳特征,但這跟它跑得快還是跑得慢完全沒(méi)有關(guān)系。對(duì)于這種特征,我們就不需要把它編程實(shí)現(xiàn)了。
然后來(lái)討論一下有用的特征。DNA就類(lèi)似于一個(gè)二進(jìn)制集合,01分別表示該特征存在還是不存在。比如01表示一只山羊沒(méi)有靈活的關(guān)節(jié)但有四條長(zhǎng)腿,10表示山羊的關(guān)節(jié)很靈活但是腿很短,等等(至于11這種人生贏家和00這樣的辣雞都去死吧)有關(guān)于二進(jìn)制集合的操作我也有發(fā)博客。
現(xiàn)在我們有一個(gè)父親0100和母親1001
對(duì)于后代的每一位dna,我們可以抽隨機(jī)數(shù),表示這一位dna是隨他爸爸還是隨他媽媽。讓我們假設(shè)他的運(yùn)氣比較好,第一位隨他媽媽,第二位隨他爸爸,第三位隨他媽媽,第四位又隨他媽媽
這樣后代的DNA就是1101
當(dāng)然,只有遺傳是不夠的,沒(méi)有變異怎么能算的上是一個(gè)好模擬(好你可以閉嘴了)
假設(shè)對(duì)于山羊的每一位基因,有%0.01的概率,能讓該位的1變成0,0變成1。然后這個(gè)神奇的后代又足夠幸運(yùn),剛好在第三位DNA變異了
第一位羊生贏家誕生!
好了現(xiàn)在它的DNA序列是1111,也就是最好狀況。假設(shè)一個(gè)‘1’代表速度+1,那么它現(xiàn)在的速度就是4
然后自然而然的,我們就講到了父母親代的選擇上。在這里,我們用一個(gè)輪盤(pán)賭的算法來(lái)模擬哪只山羊能被選中。
首先把所有的個(gè)體適應(yīng)度相加作為總適應(yīng)度sum,然后 隨機(jī)生成一個(gè)1~sum之間的數(shù)random
然后從1開(kāi)始遍歷群體數(shù)組,每次tot+=f[i]的適應(yīng)度。當(dāng)tot>=random的時(shí)候,選擇當(dāng)前個(gè)體作為遺傳親代。
當(dāng)然母方也是這么選咯
使用這個(gè)輪盤(pán)賭算法,你可以發(fā)現(xiàn),適應(yīng)度越高的個(gè)體越容易被選中,但被選中的也不全是適應(yīng)度最高的個(gè)體。因?yàn)橛幸环N可能,所有適應(yīng)度高的個(gè)體普遍缺少最后兩個(gè)優(yōu)勢(shì)特征,而一個(gè)適應(yīng)度很低的個(gè)體卻正好擁有這兩個(gè)特征
比如說(shuō)這三個(gè)
01101111000
10111111000
00000000111
很明顯第一個(gè)或者第二個(gè)跟第三個(gè)個(gè)體繁殖都會(huì)取到明顯的好效果。所以說(shuō)給別人留臺(tái)階就是給自己留后路啊
這就是輪盤(pán)賭的意義
好了遺傳算法初級(jí)部分大概講完了。布置兩道小題目
1.創(chuàng)造一個(gè)有1000個(gè)個(gè)體的種群,并在500次進(jìn)化中使最優(yōu)個(gè)體的基因盡量接近這串字符DNA碼“mynameislife”。
2.試著用遺傳算法做01背包。(當(dāng)然如果你得到的答案是錯(cuò)誤的真的不怪你,因?yàn)檫@個(gè)問(wèn)題有最優(yōu)解算法不適合遺傳)發(fā)個(gè)luogu二維背包鏈接
本篇博客就講到這里,謝謝大家
轉(zhuǎn)載于:https://www.cnblogs.com/cellular-automaton/p/6847096.html
總結(jié)
- 上一篇: 制作404页面的重要性
- 下一篇: spring boot 扩展之AutoC