遺傳算法概述

2021-03-01 算法與數學之美

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

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

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

和這個問題有點相似的是歐拉迴路(下圖)問題,它不是要求把每個點都走一遍,而是要求把每個邊都不重複走一遍(點可以重複),當然歐拉迴路不是本算法研究的範疇。

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

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

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

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

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

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

遺傳算法很簡單,沒有什麼分支判斷,只有兩個大循環,流程大概如下

流程中有幾個關鍵元素:

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

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

選擇公式如下:

//選擇運算---輪盤賭,此算法要求不能有負數.

int32_t Genetic::Selection(Genome & selGenome)

{

//生成一個隨機浮點數
//本算法在輪盤賭算法上加上了選擇概率,提高最大可行解入圍概率

double ftmp = (((random())%100001)/(100000 + 0.0000001));

if( ftmp > 0.9 )

{

GetBestGenome(selGenome);

return ESUCCESS;

}

//生成一個【0, m_dTotalFitness】之間的隨機浮點數

double dRange = (((random()+ random())%100001)/(100000 + 0.0000001)) * m_dTotalFitness;

double dCursor = 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];


return ESUCCESS;

}

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

單點交換

其中修復重複基因根據業務需要看是否需要。
點交換

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

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

從計算機算法角度看:所有的啟發式算法無外乎2種手段結合。局域搜索和全域搜索。局域搜索是在鄰域範圍內找出最優解。對應的是選擇算子和交叉算子。在自己部落裡面找最優秀的人。如果只有局域搜索的話,就容易陷入局域最優解。算法結果肯定是要找出全域最優解。這就要求跳出局域搜索。我們稱之為「創新」。創新就是一次打破常規的突破——就是我們的「變異」算子。

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

內變異:所謂內變異就是在自己內部發生變異。嚴格來說其實不是一種變異。但是它又是一種比較有效的手段。

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

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

還有細心的讀者可能發現幾個疑問,就是最短路徑中變異或交叉結果可能產生無效解,如前面最短路徑 1——6——3——2——8. 其中1和6之間根本沒有通路。碰到這種情況,可以拋棄這條非法解,重新生成一條隨機新解(其實這也是一次變異創新)。或者自己修復成可行解。反正框框在那裡。具體手段可以自己天馬行空發揮。

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

還有一個編解碼問題,就是把現實問題轉換成基因,這些問題都比較容易解決,最簡單的就是直接用數組下標表示。

相關焦點

  • 遺傳算法(Genetic Algorithm)概述
    (Genetic Algorithm)又叫基因進化算法,或進化算法。屬於啟發式搜索算法一種,這個算法比較有趣,並且弄明白後很簡單,寫個100-200行代碼就可以實現。在某些場合下簡單有效。本文就花一些篇幅,儘量白話方式講解一下。  首先說一下問題。在我們學校數據結構這門功課的時候,時常會有一些比較經典的問題(而且比較複雜問題)作為學習素材,如八皇后,背包問題,染色問題等等。上面列出的幾個問題都可以通過遺傳算法去解決。
  • 從細胞生物學到遺傳算法(GA)
    遺傳算法簡介遺傳算法(Genetic Algorithm,GA)起源於1970年代,其基本思想來源於達爾文的進化論和孟德爾的遺傳學說(小學三年級知識警告!),通過模擬生物進化的過程來求解優化問題。1.1 細胞學背景DNA雙螺旋結構一個個基因片段(基因型)組成了生物的染色體,進而決定生物的表現型。
  • 什麼是遺傳算法?怎樣繪製遺傳算法流程圖
    遺傳算法是一種通過模擬自然進化過程搜索最優解的操作方法,遺傳算法有三個基本算子選擇、交叉和變異。對於遺傳算法我們也可以使用流程圖對其整個過程進行總結歸納,那要怎樣繪製遺傳算法流程圖呢?下面是分享的簡單操作方法,希望可以幫助大家。
  • 【優化】遺傳算法介紹
    [2]葛繼科,邱玉輝,吳春明,蒲國林.遺傳算法研究綜述[J].計算機應用研究,2008(10):2911-2916.[3]雷德明.多維實數編碼遺傳算法[J].控制與決策,2000(02):239-241.[4]臧文科. DNA遺傳算法的集成研究與應用[D].山東師範大學,2018.
  • 遺傳算法簡介、基本原理及算法實現
    遺傳算法算是一個比較複雜的算法,本文主要分為三個部分,第一部分遺傳算法的發展、功能、主要思想以及簡單的代碼命令;第二部分詳細介紹遺傳算法的機理,第三部分舉例並給出一個簡單地使用方法。雖然遺傳算法存在諸如陷入局部最優解,收斂速度緩慢等問題,人們也進行了很多的修改,但是鑑於遺傳算法本身就具有很高的性能,而且各種修正方案都存在一定的複雜性和非普適性,所以經典遺傳算法在應用領域還是幾乎絕對的主流。二、遺傳算法的原理遺傳的算法的背景是達爾文的進化論,沒錯!
  • Matlab算法系列-遺傳算法
    遺傳算法(Genetic Algorithm,GA)是20世紀70年代初興起的一門新興學科。遺傳算法的基本思想來源於達爾文的進化論和孟德爾的遺傳學說,它通過模擬生物進化的過程來求解問題。      遺傳算法已經發展得很成熟,廣泛應用於優化問題的求解。①遺傳算法只對個體的基因進行操作,所以無論實際問題多麼複雜,其穩定性都不會受到太大的影響。②遺傳算法的搜索過程屬於並行計算,能夠很好地搜索解空間。③穩定性、魯棒性強,適用於非線性、高維複雜優化問題。      其流程如下:
  • 遺傳算法簡述
    遺傳算法(Genetic Algorithm)又叫基因進化算法,或進化算法。
  • 利用遺傳算法優化GANs
    遺傳算法是根據大自然中生物體進化規律而設計提出的,是根據大自然中生物體進化規律而設計提出的。是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。在本片文章中,我們嘗試使用遺傳算法來對訓練GANs進行優化,我們的訓練模型是生成手寫數字。
  • 一文讀懂遺傳算法工作原理(附Python實現)
    近日,Analyticsvidhya 上發表了一篇題為《Introduction to Genetic Algorithm & their application in data science》的文章,作者 Shubham Jain 現身說法,用通俗易懂的語言對遺傳算法作了一個全面而扼要的概述,並列舉了其在多個領域的實際應用,
  • 一種用於MPPT的改進型遺傳算法
    :在眾多最大功率點跟蹤(MPPT) 算法中,遺傳算法具有收斂速度快的優點,但實際應用中其存在準確率較低、在最大功率點附近擺動的問題,所以在傳統遺傳算法的基礎上引入擾動觀察法來提高遺傳算法的準確率,並將改進型遺傳算法和傳統遺傳算法進行了仿真對比。
  • 用python實現遺傳算法
    最近事情比較多,一個月沒有寫公眾號了,但也積累了些不錯的內容可以分享,今天就給大家介紹的是遺傳算法,並用python加以實現。在遺傳算法的學習過程中,在CSDN上看到一篇已有人分享的python代碼,因此直接借鑑過來,並結合《數學建模與數學實驗》進行補充。
  • 遺傳算法原理與代碼解析
    我們都知道進化論的基本規則就是「自然選擇,適者生存」,每個個體通過交配繁衍出後代,後代在成長過程中經過自然法則的篩選而淘汰掉部分個體,而那些擁有優良性狀的個體得以存活並且通過繁衍使得優秀遺傳信息得以保留和擴散。遺傳算法(Genetic Algorithm, GA)正是借鑑了這種思想。
  • 【嵌入式經典算法介紹】DFT算法與FFT算法概述
  • 遺傳算法:組合優化算法,按照進化論的方式啟發搜索尋優解
    遺傳算法是由美國密西根大學的 Holland教授創立於20世紀六七十年代,受達爾文「進化論」思想的啟發而設計實現。遺傳算法不是通過暴力搜索解的方法,而是通過模擬種群的基因交叉和突變,經過種群一代一代的適者生存的方式尋找問題優解的方法,這在解決組合優化時解空間組合爆炸中應用廣泛。
  • 論文速遞--上位效應對遺傳算法可靠性的影響
    ,並分析基於相互作用產生的上位效應對遺傳算法可靠性的影響。指出遺傳算法缺陷的根源;2. 基於測試樣本函數定義目標函數,以判斷遺傳算法的適用性。方法:1. 基於非上位效應函數(表1)和上位效應函數(表2),以及非上位效應函數F4和上位效應函數F6的結構圖來驗證遺傳算法可靠性;2. 通過計算樣本函數(公式(1))和遺傳算法流程(圖3)表達遺傳算法的工作原理。3.
  • 白話講解遺傳算法 (Genetic Algorithm)
    (點擊上方公眾號,可快速關注)來源:raochaoxun連結:http://blog.chinaunix.net/uid-27105712-id-3886077.html遺傳算法屬於啟發式搜索算法一種,這個算法比較有趣,並且弄明白後很簡單,寫個100-200行代碼就可以實現。在某些場合下簡單有效。本文就花一些篇幅,儘量白話方式講解一下。 首先說一下問題。在我們學校數據結構這門功課的時候,時常會有一些比較經典的問題(而且比較複雜問題)作為學習素材,如八皇后,背包問題,染色問題等等。上面列出的幾個問題都可以通過遺傳算法去解決。
  • 實驗三 遺傳算法解決TSP問題實驗
    2.利用遺傳求解函數優化問題,理解求解TSP問題的流程並測試主要參數對結果的影響。3.用遺傳算法對TSP問題進行了求解,熟悉遺傳算法的算法流程,證明遺傳算法在求解TSP問題時具有可行性。遺傳算法遺傳算法是由美國J.Holland教授於1975年在他的專著《自然界和人工系統的適應性》中首先提出的,它是一類借鑑生物界自然選擇和自然遺傳機制的隨機化搜索算法。
  • 推薦系統產品與算法概述
    本文會按照這5大範式來講解常用的推薦算法,但不會深入講解算法的實現原理,只是概述算法的實現思路,後面的系列文章我會對常用的重點算法進行細緻深入剖析。 本文會從推薦算法與產品介紹、推薦召回算法概述、排序算法概述、推薦算法落地需要關注的幾個問題等4部分來講解。
  • 教程| 基於遺傳算法的拼圖遊戲解決方案
    選自GitHub機器之心編譯參與:林川、劉曉坤這是一個GitHub項目,介紹了一種基於遺傳算法的帶有板塊尺寸自動檢測功能的拼圖遊戲解決方案。$ gaps --image=puzzle.jpg --generations=20 --population=600這將啟動初始群體為 600 個(populations)和 20 代(generations)的遺傳算法。
  • 遺傳算法010.解線性方程
    對於解方程的方法,一般有兩種:第一種稱之為數學方法,其中包括了:LU分解(LU Factorization)高斯消元法QR(正交三角)分解法第二種就是所謂迭代法,也就是計算機常用的方法,而我們要介紹的遺傳算法解方程