遺傳算法初窺

初窺遺傳算法編程

隨着1950年 阿蘭 圖靈的一篇“Computing Machinery and Intelligence”(計算機器和智能)論文提出,在最近的20年 AI似乎成了一個當前最火的研究話題。雖然離完全可以複製人類智能的機器還很遠,但這其中也出現了一批已經卓有成效的應用;蘋果公司的Siri,谷歌和特斯拉的自動駕駛汽車等。我更願意把後者稱其爲弱AI。弱AI更專注於某一方面,這也意味着它只需要更少的算法以及算力,在更短的時間就可以取得成果。

遺傳算法

遺傳算法或者說進化計算可以說是機器學習子集,遺產算法通常不是用來解決單一的或者說特定問題的最好方法;任何一個問題,幾乎都會存在最優解。它是一個類似於瑞士軍刀的多用途工具,好比你只是需要擰緊50個螺絲那麼你會毫不猶豫的選擇螺絲刀,但是你的任務如果是擰幾個螺絲然後還要去砍柴,接着在開一瓶汽水獎勵自己剛剛的勞動成果,那瑞士軍刀無疑是最好的選擇。 另外一個原因:相比於複雜的神經網絡算法需要高深的數學它明顯更適合我這樣的初學者。

早期人工智能系統大部分採用生物學類比方式來作爲指導人工智能的開發基石。20世紀50年代,科學家首次建立以達爾文的生物進化論思想爲基礎的進化算子理論。進化算子三個核心的概念 選擇、交叉(生物繁殖的模擬)、變異(在遺產信息中添加新的基因組過程)。在這三種操作作用下使遺傳算法能夠出現進化新的解成爲了可能。

進化計算的優勢

一般的靜態決策問題我們可以通過計算機來解決,但是隨着可能的輸入和輸出的增加,這些問題的複雜度會以指數上升最後達到用人力來編寫代碼難以解決的困境。這時進化計算就有了用武之地了。有很多時候我們不知道如何解決一個問題或者說我們不知道這個問題的最優解是什麼的時候。比較經典的例子:NASA(美國航空航天局),他們需要設計一個爲了滿足2006年的太空任務所有要求的天線,但是他們不知道該如何進行設計。他們寫了一個遺傳算法,進化出一個天線設計,滿足所有具體的設計約束,如信號質量、尺寸、重要等。進化計算具備快速的適應性;對於需要大量搜索,來找到最夠好的解或許是一個非常不錯的方法。問題的特徵值大概如下:

問題難以寫代碼解決

不知道如何解決

快速變化的問題

是否可以接收足夠好的解

生物進化


因爲遺傳算法的指導思想就是達爾文的生物進化論,所以在我們開始探究遺傳算法前我們有必要對生物進化的基礎知識有必要的瞭解。

DNA:生物體的所有不同性狀由他們編碼構成

染色體:生物體的基因被分組放在染色體中,一套完整的染色體組成一個生物體的基因組。(染色體通常在遺傳算法中被稱爲候選解)

交叉:兩個相同的物種結合產生的後代,通常從第一親代得到50%的DNA並從第二親代獲取另外50%的DNA。

變異:在交叉的過程中後代可能偶爾會攜帶不屬於親代的DNA,我們稱之爲變異。

進化:如果後代對於外部環境的適應足夠好,那麼他們會繼續進行繁殖。如果未能適應外部環境則最終被淘汰。最終生存下來的個體適應性越來越強;這就是適者生存。

遺傳算法中的重要概念

種羣:變異和交叉的遺傳操作應用的候選解集合

候選解:問題的可能解

基因:構建染色體的基礎塊。經典基因編碼方式 0或1

染色體:基因串,它定義了一個特定的候選解。經典二進制編碼染色體方式:01011110....

變異:基因隨機改變的過程,用來創建新的性狀(生物的多樣性)

交叉:創建新的候選解訣方案的過程,也可以稱之爲重組

選擇:從衆多候選解中繁殖下一代解的技術

適應度:評估候選解適合給定問題的程度

搜索空間距離:在用二進制遺傳表示時;如101於111將0翻轉成1就能轉化成111所以他們之間的搜索空間距離爲1,其他依次類推。空間距離越近表示他們之間的特徵值越相似。在許多搜索算法中也應用這一種以空間距離策略來優化搜索結果。

適應度景觀

二維適應景觀圖,橫軸一般表示我們需要優化的值,縱軸表示適應度值

簡單連續二維適應度景觀圖:


簡單連續二維適應度景觀圖,一般針對現實情況適應情況較少,可以解決優化解較少的情況。對於複雜的情況,構成搜索空間的解一般會超過億級,我們如果通過解決每個解那時間複雜度太高(我們可以換算下1億個解,每個解的計算耗費1秒 那麼它的耗時超過3年)。現實情況我們面對的情況往往更復雜:我們可能只能看到我們搜索空間的一部分。也就是非連續二維適應度景觀圖


對於這種情況採用遺傳算法和進化算法可以非常有效的提高我們獲取可行或者接近最佳解的速度。當然前提是我們可以接受最接近解這一方案纔行。

遺傳算法在進行搜索空間搜索時引入了種羣的概念,但是需要兩個假設的前提:

兩個適應度不錯的解可以進行組合,可以形成一個更加強壯的後代。這裏其實隱含了兩個操作;選擇交叉(繁殖下一代的過程),形成更強壯一代(引入了精英模式 elitism)對於精英模式後文我進行說明

爲了解決下一代在搜索空間中跨出一步來進行解優化,需要在遺傳算法中引入變異算子。(具體的概念請看上文中提到的概念)

我們以登山算法爲例:通過gif圖我們可以看到種羣最終到達某個峯頂


通過上圖其實我們可以發現一個問題:局部最優問題,產生這個問題的原因是我們看不到整個適應度景觀,正是由於這個原因我們的優化算法往往不知不覺進入了局部最優的死衚衕。


解決局部最優問題,有很多中方式。在遺傳算法中我們一般採用:讓種羣在搜索空間區域進行大面積的隨機取樣


其實我們上文提到的變異算子,本質上也可以在一定程度上優化局部最優問題。爲什麼說是一定程度,因爲這需要我們的變異算子可以容許我們的解從一個位置跳到搜索空間的另外一個位置。如何調試變異算子的大小則需要我們耐心的進行調試運算了。變異算子過大會影響我們的種羣規模評分適應度值的準確性;過小則算法可能需要過長的時間在搜索空間移動。

基因表示方式

基於二進制基因表示:優點:足夠簡單,對於交叉變異等操作友好。缺點:基因的變異對於編碼值的改變帶有不確定性。

使用浮點數表示:暫未研究

基於數表示:暫未研究

遺傳算法終止條件

到達世代的最大數目

超過運算時間

發現滿足條件解

到達穩定階段

遺傳算法搜素過程


算法開始,初始化種羣(一般是隨機)

爲種羣中的個體分配一個適應度值,並進行評估

評估完成後,檢查是否到達終止條件

如果終止條件不滿足,種羣經過一個選擇階段。基於適應度評分。個體的適應度越高被選擇的機會越大

針對選擇的個體進行交叉和變異操縱,並生成下一代新個體

返回評估階段。(一個循環稱爲一個世代)

如果條件滿足則退出。並返回結果

遺傳算法的實現

關於本文中提到的幾個用例是根據 Burak kanber 書中所用的案例來進行。但是我會對其進行改進以及詳細說明。

問題1:全一問題,發現全部由1構成的字符串,比如對於長度爲5的字符串,最優解是 11111。

問題是一個足夠簡單的問題,我們有很多種方式來解決。但是我認爲做爲一個入門者來看。足夠簡單的問題如何運用遺傳算法的知識來解決這個問題,對於後面解決複雜的問題是至關重要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章