人工智慧演算法(一)進化演算法

2021-09-10 01:20:54 字數 4085 閱讀 1121

我希望用這類文章,來盡可能通俗的解釋一些聽上去很「高大上」的人工智慧演算法,不僅可以幫助自己真正的理解,還能帶來更多的思考。目前想寫專家系統,神經網路,還有本篇進化演算法。

不說大話,進入正題:

相信大部分對人工智慧感興趣的人都聽說過進化演算法(遺傳演算法,基因演算法)。一篇文章當然不可能把進化演算法的方方面面都說清楚,因此,本文只會介紹進化演算法的原理,流程,以及少許應用。最主要的是在學習演算法時,我自己的一些思考。

顧名思義,進化演算法是模擬生物在自然界中的進化。達爾文的演化論指出「物競天擇,適者生存」。演化論幾乎可以解釋一切「為什麼這種生物是這樣的?」這一類的問題。那些更加適應環境的生物,更加容易留下自己的染色體。於是,在計算機中,我們模擬生物中的選擇。我們做一次造物主,決定什麼樣的「生物」更適應環境,更有權利活下來。那麼假想你現在是造物主,你想選擇一些生物,需要定一些什麼規則呢?大概可以總結成下面四個問題:

1、生物生活在什麼樣的環境中(換言之,什麼樣的生物才算是適應環境)。

2、生物繁衍後代的方式。

3、生物的種群的大小。

4、物種是否可以基因突變。

大致的設定好這些規則,就我們可以創造乙個「種群」和乙個選擇它們的環境。

1、染色體:染色體決定了「生物」的特徵和適應環境的能力。一般,染色體是一串01的編碼(這裡有乙個常犯的誤區,並不是說染色體的基本組成單位是0和1,染色體由基因組成,基因由0和1組成,而且基因會因為具體問題的約束而會有固定的基因池,這裡不理解沒關係,後面會提到)。放在具體問題中時,染色體就是乙個問題的可選方案。

2、基因池基因池就是基因的可選擇範圍,例如某個問題的定義域是0~4,我們用三位二進位制01串表示。那麼基因池有以下基因:|0 0 0 0|     |0 0 0 1|     |0 0 1 0|     |0 0 1 1|     |0 1 0 0|  。基因池可以說是問題的定義域,那麼類似於|1 1 1 1| 這樣的基因不屬於基因池的基因不會出現在進化演算法過程中。理由很簡單,假設我們研究猴子的遺傳病的時候,有只猴子有個基因突變,變成了人,那就沒有研究意義了。

3、適應性函式:適應性函式可以說是進化演算法的核心。它決定了上文中寫得「規則」中的第一點。什麼樣的生物才算適應環境。適應性函式就是我們這些造物主篩選優勢物種的過濾網。染色體輸入到適應性函式中,函式就會輸出染色體對環境的適應程度。我們用適應度這個量化概念來描述。

4、選擇:就像自然界中一樣,每個生物都有繁衍後代的可能性。但是越是適應環境的染色體,留下來的可能性越大。所以適應度越高的物種的染色體,越有可能性被選擇。就像是輪盤選擇,輪盤上面有乙個指標和多個分割的扇形,我們擺動指標,最後指標指向哪乙個扇形我們就選擇哪乙個生物的染色體來繁衍。適應度越高的物種,在輪盤中佔得面積越大,自然被選擇的可能性越大。

5、交叉交叉就是染色體之間的基因交換。之前提到的染色體是一串01編碼,交叉行為便是決定乙個染色體斷裂點(和第一點提到的誤區一樣,染色體可以斷裂但是基因不可以斷裂,因為基因斷裂可能會產生基因池裡沒有的基因),兩個染色體的斷裂點相同。每個染色體斷裂成兩段之後,交換其中一段,從而產生兩個新的染色體,替換掉原來的兩個染色體

6、突變:如果之前的描述是可以理解的,你可能發現無論怎麼選擇,群種當中的染色體組合方式是有限的,因為基因從整體上沒有變化(很多基因池中的基因,都未曾出現在這個種群中)。也就是說,很多的基因組合都不可能出現,那麼我們就只能選擇出這個種群道中最有優勢的染色體(區域性最優解),而找不到真正的最優染色體(全域性最優解)。我們稱這種現象為收斂。為了防止這種情況,我們就需要讓種群當中的染色體突變突變的過程就是染色體上的某個基因變成基因池裡的另乙個基因。也許突變看上去這是微不足道的,但是生物界的進化正是由這種一點一點微不足道的突變疊加,才進化出了如此高階的物種。那麼,需要設定乙個突變的概率,在理論上突變的概率越高,進化的越快。順帶一提,突變往往是有害的,特別是在物種繁衍了多代之後,種群的平均適應度越高,突變有害的概率越大

7、種群的大小:為了方便計算,種群的大小往往不變。新產生的基因替換原來的基因。

8、終止條件:利用限定繁衍代數或者其他的方式,來作為終止進化演算法的條件。

我決定結合乙個實際的例子來描述進化演算法的流程。我就不畫流程圖了,因為在應用時,流程圖肯定會不一樣。

拿出最簡單的例子,求函式的最大值。

引用電腦科學叢書《人工智慧》裡的乙個例子,f(x)=15x-x^2,我們要求這個函式的最大值。

那麼,x的不同取值,就是染色體。令x為0~15的整數。用01串來表示基因,例如x=5,那麼基因就是0101。適應性函式就是函式本身。

1、設定乙個種群大小n,交叉概率,突變概率,終止條件。

2、設定適應性函式,這裡直接用原函式。

3、隨機生成乙個大小為n的種群,也就是n個染色體。

4、計算所以染色體的適應度。

5、利用上文提到的輪盤選擇出兩個染色體(這兩個染色體可以相同)。

6、交叉兩個染色體

假如選擇出來的兩個染色體,乙個染色體x0為 |0 1 1 0|     另乙個x1為 |0 0 0 1| 。隨意選擇乙個交叉點(下劃線處)。之前提到的兩個染色體的交叉點必須為之一致。

那麼x0被分割成  |0 1| 和 |1 0|            x1    |0 0|  和  |0 1| 

兩者交換一段變成     |0 1 0 0|   和   |0 0 1 0|   加入並替換掉原來的x0 和 x1,種群數量不變。

7、上帝搖骰子,每個個體都有機率突變  ,例如  x2  |0 1 0 1|     突變成 |0 1 1 1| 。

重複 4~7的過程,直到演算法結束。

你會不會想問,這麼簡單的函式,隨便分析一下就可以找到其最大值的位置?這當然沒錯,但是如果函式是下面這種樣子的,也許數學方法就沒那麼好用了。

這個函式也可以利用基因演算法在求最優解。這裡就可以說明白基因和染色體的關係了。x 和 y 是函式的兩個引數,一組x 和 y的取值就是染色體,那麼x 和 y 就是組成染色體的兩個基因。

假設取 x 為 0~4  y也為 0~4 。 那麼 x 和 y  的基因池都是固定的,那麼x 和 y 都用三位01字串表示。  | 0 0 1

0 0 1|  前面三位和為x 後面三位為 y 。那麼在交叉時,我們只能以中間為斷點,再次強調,基因不能交叉,因為這樣會產生基因池以外的基因。例如  染色體|0 0 1 1 0 0|   和 染色體 |0 1 1 0 1 1|  假設在下劃線位置交叉,那麼會有乙個後代 |0 0 1

1 1 1|   這樣,y就超出了定義域。那麼也可以理解,所謂的突變,也就是在基因池中選擇突變物件。當然,如果我們研究的是極度複雜的工作,例如模擬人腦,那麼我們也許可以打破這個規則。

基因演算法絕對不是僅僅來求個函式的最大值,而是利用可以求最優解這個特性來尋找很多優化問題的解。確定引數,就是基因演算法的作用。基因演算法的作用就是不停的尋找更加優秀的引數,那麼說回來,也就是求乙個適應性函式的最優引數。換言之,假如我們可以把具體問題轉化成適應性函式,那麼就可以利用基因演算法求解。

另外我們在利用基因演算法的時候,其實我們很難預設乙個答案,加入我們想要解決的問題過於的複雜,那麼最後問題的答案會是什麼樣子,我們一概不知。

在深入研究基因演算法的數學基礎時,必定會碰到模式定理。它可以用來描述某種特定染色體的行為,在未來的學習中,這也是值得人們**和發展的一門學問。

基因演算法就寫到這裡,寫的不好不對的地方,歡迎批評指正(別兇我qaq)。

人工智慧演算法分類

人工智慧演算法大體上來說可以分類兩類 基於統計的機器學習演算法 machine learning 和深度學習演算法 deep learning 總的來說,在sklearn中機器學習演算法大概的分類如下 1 回歸演算法 2 分類演算法 3 聚類演算法 4 降維演算法 5 概率圖模型演算法 6 文字挖掘...

人工智慧演算法 猴子摘香蕉

只有簡單的狀態顯示 include iostream using namespace std void at char monkeyplace,char boxplace void state int on,int hb char goto char st,char lt void act char...

人工智慧演算法綜述(二) RNN and LSTM

rnn 迴圈神經網路 and lstm 長短期記憶網路 lstm就是乙個rnn網路,外部的結構是一樣的,主要是單元的內在結構不同。或者說lstm是為了讓rnn能夠更好的處理nlp 自然語言問題 做的一些內部改造。我推薦這篇文章理解lstm 可能會比我自己說的更好,我這裡就簡單說一下,不涉及太多技術細...