第一次接觸基因演算法,以下列了幾個第一次接觸時我自己的疑問:
什麼是基因演算法/遺傳演算法?
模擬生物學上的物進天擇,讓群體透過交配(crossover)、突變(mutation)產生新的後代,不斷繁衍而造成收斂,得到想要的答案,此演算法通常是用於解決最佳化的問題。
為什麼透過突變跟交配可以確定下次的子代一定會是比較優的解?
基因演算法的判斷準則是用一個適應函數為判斷該基因好壞的基準,並且在交配之前其實還有一個步驟:選擇,在這一步通常會讓較好的基因較容易被選中,此過程會逐漸讓基因的適應函數值逐漸進行收斂。
但是僅透過選擇機制無法讓此演算法產生變數(因為不管怎麼選仍然是原本那群基因),所以透過交配(crossover)讓兩個基因就隨機位置產生新的基因,這樣才能提供演化的變數種子。
最後基因演算法有可能會得到區域最佳解而非整體最佳解,所以透過突變(mutation)讓基因產生一定的變數,確保基因演算法的計算範圍不會只侷限在同一區,有機會跳到其他區域進行演化。
參考網址
我覺得這兩篇文章講解的很好,一篇是如何將資訊轉換成對應的基因序列(內插),另外一篇則是如何實作一個基因演算法:
1.http://edisonx.pixnet.net/blog/post/85835614
2.http://edisonx.pixnet.net/blog/post/90563824-%5Bga%5D-%E5%9F%BA%E5%9B%A0%E6%BC%94%E7%AE%97%E6%B3%95%E6%A6%82%E5%BF%B5%E7%B4%B0%E8%AA%AA-(i)---%E7%B7%A8%E8%A7%A3%E7%A2%BC
3.維基百科: https://zh.wikipedia.org/wiki/%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95
最後,本次課堂作業是給一個數學函式(看程式碼),要求基因長度是12bits,求出在區間[0,1]間的最大值,造著參考網址程式碼的想法重新自己打了一遍。
想法大概是:
首先要先了解怎麼將資訊轉成基因序列(使用內插法),這裡大推參考網址的那篇文章,講的很詳細。
之後要先在母群中放置一定數量的基因。
再來每一次演化都做一樣的事情:
- 選擇一定數量的基因從母群放到交配池中
- 在交配池中完成交配和突變
- 把結果放回母群中,並更新基因的適應函數
如何終止? 終止的方式有很多,Timeout、演化次數….這裡使用演化次數來做為終止條件
程式碼:github