2020-01-14

大白話講解遺傳算法 (Genetic Algorithm)

用戶2617681發(fā)表于秘籍酷訂閱

258

來源:raochaoxun

鏈接:http://blog.chinaunix.net/uid-27105712-id-3886077.html

遺傳算法(Genetic Algorithm)又叫基因進(jìn)化算法,或進(jìn)化算法。屬于啟發(fā)式搜索算法一種,這個算法比較有趣,并且弄明白后很簡單,寫個100-200行代碼就可以實現(xiàn)。在某些場合下簡單有效。本文就花一些篇幅,盡量白話方式講解一下。

首先說一下問題。在我們學(xué)校數(shù)據(jù)結(jié)構(gòu)這門功課的時候,時常會有一些比較經(jīng)典的問題(而且比較復(fù)雜問題)作為學(xué)習(xí)素材,如八皇后,背包問題,染色問題等等。上面列出的幾個問題都可以通過遺傳算法去解決。本文列舉的問題是TSP(Traveling Salesman Problem)類的問題。

TSP問題實際上是”哈密頓回路問題”中的”哈密頓最短回路問題”.如下圖,就是要把下面8個城市不重復(fù)的全部走一遍。有點像小時候玩的畫筆畫游戲,一筆到底不能重復(fù)。TSP不光是要求全部走一遍,并且是要求路徑最短。就是有可能全部走一遍有很多走法,要找出其中總路程最短的走法。

和這個問題有點相似的是歐拉回路(下圖)問題,它不是要求把每個點都走一遍,而是要求把每個邊都不重復(fù)走一遍(點可以重復(fù)),當(dāng)然歐拉回路不是本算法研究的范疇。

本文會從TSP引申出下面系列問題

1、? TSP問題:要求每個點都遍歷到,而且要求每個點只被遍歷一次,并且總路程最短。

2、? 最短路徑問題:要求從城市1 到城市8,找一條最短路徑。

3、? 遍歷m個點,要求找出其距離最短的路線。(如果m=N總數(shù),其實就是問題1了,所以問題1可以看成是問題3的特例 )。

遺傳算法的理論是根據(jù)達(dá)爾文進(jìn)化論而設(shè)計出來的算法: 人類是朝著好的方向(最優(yōu)解)進(jìn)化,進(jìn)化過程中,會自動選擇優(yōu)良基因,淘汰劣等基因。

在上面tsp問題中,一個城市節(jié)點可以看成是一個基因,一個最優(yōu)解就是一條路徑,包含若干個點。就類似一條染色體有若干基因組成一樣。所以求最短路徑問題,可以抽象成求最優(yōu)染色體的問題。

遺傳算法很簡單,沒有什么分支判斷,只有兩個大循環(huán),流程大概如下

流程中有幾個關(guān)鍵元素:

1、? 適度值評估函數(shù)。這個函數(shù)是算法的關(guān)鍵,就是對這個繁衍出來的后代進(jìn)行評估打分,是優(yōu)秀,還是一般,還是很差的畸形兒。用這個函數(shù)進(jìn)行量化。在tsp中,路徑越短,分?jǐn)?shù)越高。函數(shù)可以可以這樣 fitness = 1/total_distance.? 或者 fitness = MAX_DISTANCE – total_distance. 不同的計算方法會影響算法的收斂速度,直接影響結(jié)果和性能。

2、? 選擇運算規(guī)則: 又稱選擇算子。對應(yīng)著達(dá)爾文理論中適者生存,也有地方叫著精英主義原則,意思就是只有優(yōu)秀的人才有更大的幾率存活下來,擁有交配權(quán)。有權(quán)利擁有更多后代,傳承下自己血脈基因。和現(xiàn)實中很相像,皇帝權(quán)臣遺留下來的子孫后代比較多。選擇方法比較多。最常見的是round robin selection 算法,即輪盤賭算法, 這個算法比較簡單有效。選擇算法目前已有的有10來種之多。各種不同業(yè)務(wù)可以按需選擇。

選擇公式如下:

//選擇運算---輪盤賭,此算法要求不能有負(fù)數(shù).? int32_t Genetic::Selection(Genome & selGenome) {//生成一個隨機浮點數(shù)//本算法在輪盤賭算法上加上了選擇概率,提高最大可行解入圍概率doubleftmp = (((random())%100001)/(100000 + 0.0000001));if( ftmp > 0.9 ) { GetBestGenome(selGenome);returnESUCCESS; }//生成一個【0, m_dTotalFitness】之間的隨機浮點數(shù)doubledRange? ? = (((random()+ random())%100001)/(100000 + 0.0000001)) * m_dTotalFitness;doubledCursor? ? = 0.0; size_t i? ? ? ? = 0;for(i = 0; i < m_vGenome.size(); ++i) { dCursor += m_vGenome[i].dFitness;if(dCursor > dRange)? {break; } }? selGenome = m_vGenome[i];returnESUCCESS; }

3、? 交叉運算規(guī)則:又稱交配規(guī)則,交叉算子。對應(yīng)遺傳學(xué)中的精子和卵子產(chǎn)生的受精卵含有精子的部分基因,也含有卵子的部分基因的現(xiàn)象。就像孩子有點像父親,又有點像母親的規(guī)律。交叉運算算法更多。作者可以天馬行空的自己去想象。只要達(dá)到交叉結(jié)果中含有父母的基因就可以。最常見的是k-opt 交換。其中k可以是 1,2,3….等等。簡稱單點交換,兩點交換,3點交換等等:

單點交換

其中修復(fù)重復(fù)基因根據(jù)業(yè)務(wù)需要看是否需要。

兩點交換

4、? 變異運算規(guī)則:又叫變異算子。在人類遺傳進(jìn)化過程中。會發(fā)生一些基因突變。這些突變有可能是好的突變,有可能是壞的突變。像癌細(xì)胞就是壞的突變。愛因斯坦的大腦估計是好的突變。突變方法也是可以天馬行空的自己去發(fā)揮創(chuàng)造。

這里討論一下,為什么要有突變這道流程呢。從人類進(jìn)化角度來說。人類基因有數(shù)十萬種,在遠(yuǎn)古交流比較少的年代。都是部落內(nèi)部通婚,但是整個部落內(nèi)部居民可能都缺少某種好的基因,這樣無論他們怎么交配,都不會產(chǎn)生好的基因,那么他們需要引入好的基因,于是和其他部落通婚。引入其他自己沒有的基因,其實對于這個種群來說這就是一次基因變異。如果是好的變異,那么這個后代就很優(yōu)秀,結(jié)果就是會產(chǎn)生更多子孫,把這個好的變異基因傳承下去,如果不是好的變異基因,自然而然會在前面選擇算子下淘汰,就是現(xiàn)實生活中的所謂的年幼夭折,癡呆無后,或先天畸形被淘汰,不會傳承下去。

從計算機算法角度看:所有的啟發(fā)式算法無外乎2種手段結(jié)合。局域搜索和全域搜索。局域搜索是在鄰域范圍內(nèi)找出最優(yōu)解。對應(yīng)的是選擇算子和交叉算子。在自己部落里面找最優(yōu)秀的人。如果只有局域搜索的話,就容易陷入局域最優(yōu)解。算法結(jié)果肯定是要找出全域最優(yōu)解。這就要求跳出局域搜索。我們稱之為“創(chuàng)新”。創(chuàng)新就是一次打破常規(guī)的突破——就是我們的“變異”算子。

這里拿最短路徑路徑舉例子,求點1到點8之間的最短路徑, 初始解是1——2——3——6——8

內(nèi)變異:所謂內(nèi)變異就是在自己內(nèi)部發(fā)生變異。嚴(yán)格來說其實不是一種變異。但是它又是一種比較有效的手段。

外變異:外變異是引入創(chuàng)新,突破傳統(tǒng)的質(zhì)的飛躍, 也是啟發(fā)算法中所謂的全域搜索。下面是充當(dāng)前基因中引入外部基因(當(dāng)前集合的補集)。

結(jié)尾:遺傳算法除了上述這些幾個主要算子之外,還有一些細(xì)節(jié)。如交叉概率pc,變異概率pm,這些雖然都是輔助手段,但是有時候?qū)φ麄€算法結(jié)果和性能帶來截然不同的效果。這也是啟發(fā)式算法的一個缺點。參數(shù)需要不停的在實踐中摸索,沒有萬能的推薦參數(shù)。

還有細(xì)心的讀者可能發(fā)現(xiàn)幾個疑問,就是最短路徑中變異或交叉結(jié)果可能產(chǎn)生無效解,如前面最短路徑 1——6——3——2——8.? 其中1和6之間根本沒有通路。碰到這種情況,可以拋棄這條非法解,重新生成一條隨機新解(其實這也是一次變異創(chuàng)新)?;蛘咦约盒迯?fù)成可行解。反正框框在那里。具體手段可以自己天馬行空發(fā)揮。

另一個比較實際的問題是:在最短路徑中并不知道染色體長度是多少,不錯。大部分人還是用定長染色體去解決問題,這樣性能低下。算法不直觀。這時候可以使用變長染色體來解決。其實我建議不管何種情況,都設(shè)計變長染色體模式。因為定長也是變長的一種特例。使用變長可以解決任何問題。不管是tsp還是最短路徑問題。

還有一個編解碼問題,就是把現(xiàn)實問題轉(zhuǎn)換成基因,這些問題都比較容易解決,最簡單的就是直接用數(shù)組下標(biāo)表示。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 詞(小調(diào))榜 第一 蝶戀花?戲作?論己之詞 / 王少軒(流觴詩刊) 自遣新詞多少事??|縷愁煙,依舊無終始。數(shù)筆難拋...
    張成昱閱讀 359評論 0 6
  • JS請求跨域問題及URL的結(jié)構(gòu)分析 1.URL結(jié)構(gòu)分析 以下面地址為例: http://www.aespxfa...
    IT碼農(nóng)鋒閱讀 227評論 0 0
  • 一絲 一談 一想 一念 馬蹄踏踏終究掩不住黃沙 銅鏡冷冷卻是蓋不住芳華
    謝噠噠閱讀 201評論 2 1
  • 今天忙碌了一天,早晨8點的火車趕赴上海,處理完事情坐下午的4點半的火車又趕回家,在這短短的一天的時間我來回...
    幽蘭依依閱讀 137評論 0 0
  • 新裝MySQL的用戶很容易遇到這個ERROR 2002 (HY000): Can't connect to loc...
    別瞄我閱讀 22,454評論 1 3

友情鏈接更多精彩內(nèi)容