今天來講遺傳演算法,遺傳演算法有很多應用,比如尋路問題,八數碼問題,囚犯困境問題,動作控制,tsp問題,生產
排程問題,在乙個多邊形中尋找乙個包含在該多邊形內的乙個圓,函式求最值問題等等。
之前講的模擬退火演算法是用
來求解最優化問題的,鏈結為:
模擬退
火演算法用一句話概括就是:貪心過程中引入了隨機因素,以一定概率接受乙個比當前要差的解,並且這個概率隨著時
間的推移而逐漸降低。而今天講述的遺傳演算法是模擬生物在自然界物競天擇的生物進化過程,通過維護乙個潛在解的
群體執行了多方向的搜尋,並支援這些方向上的資訊構成和交換。以麵為單位的搜尋,比以點為單位的搜尋,更能發
現全域性最優解。
contents
1. 遺傳演算法的簡介
2. 基因編碼方式
3. 適應評分及選擇函式
4. 基因重組與基因突變
5. galib的介紹
6. 其它ga工具介紹
1. 遺傳演算法的簡介
說到遺傳演算法,不得不說網上乙個比較貼切的比喻。從前有一群袋鼠,被零散地遺棄於喜馬拉雅山脈,於是
開始在那裡艱苦地生活,而海拔低的地方瀰漫著一種毒氣,所以海拔越低的個體越先死亡,同時袋鼠也會生
兒育女,經過若干年後,生存能力強的袋鼠最終會越來越往上爬,可能會聚集到很多個山峰上。而又過了若
乾年,可能那些低一點的山峰上的袋鼠都死亡,而最終位於珠穆朗瑪峰上的袋鼠生存了下來,從而也就是求
得了最值。
上面就是遺傳演算法的核心思想,那麼有幾個問題要解決。
(1)在遺傳演算法搜尋之前,需要產生乙個種群,這個種群是怎麼產生的 ?
(2)種群產生後,又是怎樣模擬生物進化得到優良的個體,以及如何評價優良個體 ?
對於問題(1),在遺傳演算法中,不能直接處理問題空間,需要將問題空間對映到遺傳空間,把個體表示成
由基因按照一定結構組成的染色體,這一轉換操作叫做染色體編碼。每個個體進行染色體編碼後就產生了種
群。對於問題(2),遺傳操作對種群中的個體按其對環境的適應度施加一定的操作,從而實現優勝劣汰的
進化過程,遺傳操作包括選擇,交叉和變異。在遺傳空間中,個體的遷移由交叉和變異決定的,交叉操作為
ga提供了一種粗粒,大步伐的搜尋手段。變異屬於ga的輔助性操作,其主要目的是維持解空間的多樣性。通
過交叉和變異後產生出新個體,然後進行選擇,淘汰低劣個體。
2. 基因編碼方式
遺傳演算法的第一步就是將問題的空間對映到遺傳空間,這一步叫做染色體編碼。常用的編碼方式有二進位製編
碼和浮點數編碼。
(1)二進位制編碼
一定精度的二進位制編碼只能表示一定精度的浮點數,比如我們要求精確到6位小數,而區間為[-1, 2],
為了保證精度要求,至少應該將區間劃分為
所以編碼的二進位制串需要22位,把乙個二進位制串轉化為區間[-1, 2]內的乙個實數通過如下方法
先將二進位制數轉化為十進位制數,比如得到的十進位制數為[-1, 2]區間內的浮點數為
這樣將乙個二進位制串對應到乙個浮點數,反過來,也可以將乙個浮點數對映為乙個二進位制串。
(2)浮點數編碼
為了改善遺傳演算法的複雜性,提高運算速度,提出了浮點數編碼。
3. 適應評分及選擇函式
適應評分函式就是用來衡量哪個個體應該被淘汰,一般來說,取值越差的個體應該被淘汰。適應評分函式
是物擇。而選擇函式是天擇,從自然界來說,越適應環境的個體越有可能繁殖後代,但是也不能說越適應
環境的後代就越多,只是從概率上來說是這樣。那麼怎麼建立這種概率關係呢 ? 一種常用的方法就是輪
盤賭選擇法。 假設種群數為
所以遺傳演算法中的自然選擇過程就是先用適應評分函式計算出各個體的適應評分值,然後再利用輪盤賭選
擇法計算各個體的選擇概率,概率越大的被選中的機會也越大。核心**如下
上述**就是選擇需要淘汰的個體,體現了生物種群的自然選擇的過程。
4. 基因重組和基因突變
在遺傳演算法中,每乙個個體是用一條染色體來代表的,而染色體之間可能發生交叉,單條染色體也可能發生
基因突變。重組和突變的目的就是使得子代不同於父代,當然子代不一定就優於父代,只有經過選擇後才有
很大可能性優於父代。二進位制編碼和浮點數編碼都可以進行基因重組,如圖
而基因突變是染色體上某乙個位點基因的改變,基因突變使乙個基因變成它的等位基因,通常會引起一定的
表現型變化。**大致如下
5. galib的介紹
上面基本講述了遺傳演算法的原理,接下來就來學習遺傳演算法是如何解決一些常見應用問題的。主要介紹乙個
遺傳演算法庫---galib。galib是美國麻省理工學院matthew wall用c++開發的一套遺傳演算法類庫,設計
非常合理,功能強大而且易於擴充套件。
galib提供了三種基本遺傳演算法:標準型,穩態型和增量型。它們的區別是進化生成的新個體替換父代群體
具體用法可以參考example例子。
這個c++庫比較強大,以後盡量用這個來實現遺傳演算法。這裡還有乙個c++的遺傳演算法庫
6. 其它ga工具介紹
r語言實現的遺傳演算法
r語言的遺傳演算法包挺多的,具體可以參考:
舉個例子,以安裝mcga包為例,首先進行安裝,如下圖
檢驗一下,如下圖
mcga主要用於求多元函式的最值問題的(最小值)。例項如下
julia實現遺傳演算法
在julia中有乙個遺傳演算法庫,叫做geneticalgorithms。源**如下
原始碼:
先進行安裝,如下
關於geneticalgorithms的使用可以參考例子即可。
遺傳演算法簡介
把電腦科學與演化論結合起來的嘗試始於50年代末,但由於缺乏一種通用的編碼方案 人們只能依賴變異而非交配來產生新的基因結構,故而收效甚微。到60年代中期,美 國michigan大學的john hol land在a s fraser和h j bremermann等人工作的基礎 上提出了位串編碼技術。這種...
遺傳演算法簡介
遺傳演算法借鑑了達爾文的演化論,是一種解決最佳化的搜尋演算法 具體步驟 1 初始化 先初始化一堆染色體,也就是一組編碼,常見的編碼方式有二進位制 浮點數編碼 2 適應度函式 根據要達成的目標進行乙個適應度排序 比如求要求乙個函式的最小值,那麼染色體所代表的資料越小,適應度越高 適應度決定了下乙個階段...
遺傳演算法 簡介
遺傳演算法 genetic algorithm 是模擬達爾文生物演化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程 搜尋最優解的方法。遺傳演算法是從代表問題可能潛在的解集的乙個種群 population 開始的,而乙個種群則由經過基因 gene 編碼的一定數目的個體 i...