優化算法之遺傳算法

前幾天,在聽了學長關於遺傳優化算法應用在考慮TMD作用的地震分析之後,感覺到優化算法一系列的優化算法的強大之處。回來也趁熱打鐵查了一下資料,大致理解一下遺傳算法的機理。下面就記錄分享一下吧。

一、遺傳算法簡介

顧名思義,遺傳算法是模擬生物在自然環境下的遺傳和進化過程的一種自適應的全局優化搜索算法,通過藉助遺傳學的原理,經過自然選擇、遺傳、變異等作用機制進而篩選出具有適應性更高的個體(適者生存)。遺傳算法從20世紀七八十年代的誕生到現在主要集中的適用範圍爲NP問題(指存在多項式算法能夠解決的非決定性問題)、非線性、多峯函數優化和多目標優化問題等等。同時在機器學習、模式識別和神經網絡及社會科學中的應用也顯得非常出色。

二、遺傳算法的算法理論

2.1遺傳算法基本概念與術語:

遺傳算法的概念簡單來說,就是利用種羣搜索技術將種羣作爲一組問題解通過對當前種羣施加類似生物遺傳環境因素的選擇、交叉、變異等一系列的遺傳操作來產生新一代的種羣,並逐步使種羣優化到包含近似最優解的狀態。

術語:

遺傳算法基本術語
遺傳學術語 遺傳算法術語
種羣 可行解集
個體 可行解
染色體 可行解的編碼
基因 可行解編碼的分量
基因形式 遺傳編碼
適應度 評價的函數值(適應度函數)
選擇 選擇操作
交叉 編碼的交叉操作
變異 可行解編碼的變異
注意:這裏的個體與染色體的關係,我個人進行一下解釋。我可以把個體當做是染色體的組合。換句話說呢,就是染色體決定了個體,染色體上基因的操作(選擇、交叉、變異)直接作用於個體的形態。所以呢,我們必須是基於對染色體、基因進行遺傳學的操作,但是我們想象一下,在可行解中,我們對其進行一系列的遺傳學操作,怎樣才能直接影響到可行解呢?我們怎樣才能進行對可行解實體進行分解?這裏我們就引進了編碼成位串。“編碼”一詞對於非科班的學生來說,顯得有些抽象。我就簡單做個解釋吧:在我們大學計算機基礎課上,我們知道數字的表示有二進制、八進制、十進制(日常所用)、十六進制等。比如十進制的10,我們可以用二進制位串表示爲1010(0*2^0+1*2^1+0*2^2+1*2^3)。這樣1010位串就是對10進行編碼,反過來多十進制的10轉化爲1010的二進制也稱作解碼(相對於編碼來說)。這樣把十進制的10編碼成1010的二進制位串就可以實現對1010的遺傳操作了。具體的進制轉化可以看我以前的博客二進制、十進制、八進制、十六進制轉化詳解

三、遺傳操作:

遺傳操作:就包括優選適應性強的個體的“選擇”;個體間交換基因產生新個體的“交叉”;個體間的基因突變而產生新個體的“變異”。其中遺傳算法是運用遺傳算子來進行遺傳操作的。即:選擇算子、變異算子、交叉算子。

1.選擇算子:根據個體的適應度,按照一定的規則,從第n代羣體中選擇出一些具有優良性狀的個體遺傳到下一代(n+1)羣體中。在這一選擇過程中,個體適應度越大,則被選擇到下一代的機會越大。某個體i的適應度fi,種羣大小NP,則i被選擇的概率公式爲:

2.交叉算子:將羣體P(n)中選中的各個個體隨機搭配,對於每一個個體,以某一特定概率(交叉概率Pc(0.25-1.0取值))交換他們之間的部分染色體(編碼位串的部分位置)。交叉算法是的,遺傳算法的搜索能力得到更好的延伸。

2.1交叉操作的具體步驟可以表述爲:1.在交配池中隨機取出要交配的一對個體;2,根據編碼位串長度L,對要交配的一對個體,隨機選取[1,L-1]中的一個或者多個整數k作爲交叉位置處,相互交換各自的部分基因,由此形成新的個體。

3.變異操作:對羣體的每個個體,以某一個概率(變異概率Pm(0.01-0.1取值))將某一個或者某些基因座上的基因值改變爲其他的等位基因值,根據個體的編碼方式不同,可以將變異分爲實值變異和二進制變異。

3.1變異的操作步驟爲:首先,對種羣中的所有個體按事先的設定的變異概率判斷是否進行變異操作;然後 對判斷需要變異的個體進行隨機選擇變異位進行變異。

四、遺傳算法特點:

4.1、遺傳算法以決策變量的編碼作爲運算對象,這種對決策變量的編碼處理,使得在優化計算中可以借鑑生物學的染色體和基因概念,模擬自然界的生物遺傳和進化機制,方便的應用決策變量的編碼成的位串進行遺傳算子。

4.2、遺傳算法直接是以目標函數值作爲搜索收斂條件。它僅僅使用目標函數值變換來的適應度函數值,就可以確定進一步的搜索方向和範圍。而不是使用目標函數的求導來進行。簡化了算法

4.3、遺傳操作是基於概率因子來操作的。

4.4、遺傳算法是自組織、自適應個自學習的。

五、遺傳算法的流程圖:

遺傳算法流程圖

六、Matlab遺傳算法的仿真實例:

實例:利用標準遺傳算法求函數的最大值,其中定義域爲[0,10]。(摘自智能優化算法及Matlab實例)

運用matalb畫圖功能我們可以得到原函數的代碼和圖形如下:

1.原圖形畫圖命令:

x = linspace(0,10);
y = x + 10*sin(5*x) + 7*cos(4*x);
plot(x,y)
2.圖像結果

根據流程圖步驟仿真步驟如下:

 1.初始化種羣,種羣數目NP=50,染色體編碼長度爲L = 20,最大進化代數G = 100,交叉概率爲Pc=0.8,變異概率爲Pm=0.1。

2.產生初始種羣,將二進制編碼轉化爲十進制,計算個體的適應度,並進行歸一化,之後進行遺傳操作,產生新的種羣。並把優勢種羣遺傳到下一代。

3.判斷是否滿足終止條件。滿足則輸出,不滿足則繼續迭代優化。

具體代碼這裏篇幅有限就不列出來了,需要的可以聯繫本人自取!


最後,歡迎繼續關注,我的個人博客微信公衆號:BlogShareCenter 

                        








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