關於遺傳算法
遺傳算法是仿照自然界中生物進化而產生的一類優化算法。個人感覺遺傳算法簡單粗暴,適應性廣。關於遺傳算法的介紹網上有很多了,這里按照我自己的理解簡單概括一下。
- 編碼解碼,將待優化的參數編碼為DNA序列,最簡單直接的為二進制編碼(即有兩種鹼基的DNA鏈);
- 生成隨機初代
- 選擇,適應度(由待優化的模型得到)較好的個體有更大的概率被選擇,應用比較多的方法有輪盤賭和錦標賽;
- 按照一定概率進行隨機的交叉變異
- GOTO Step 2
經過多個世代的迭代之后,將會收斂到最優解。交叉和編譯的作用是產生新個體,避免陷入局部最優解。
利用Python實現
前輩們常說一句話“避免重復造輪子”,其實最直接的還是搜一下別人寫的包。這里之所以花時間自己搞一個主要是因為這個算法比較簡單,邏輯性很明確,比較適合練手,因此才決定自己實現一下,算是敲開Python大門的第一個項目。
編碼解碼
這里選擇使用二進制編碼的方式來實現,根據用戶輸入的參數范圍和精度計算出每個參數需要的位數,然后將參數空間均分映射為二進制編碼。
1 |
# Encode parameters into DNA |
這種方式實現的精度並不是確切的為用戶輸入的精度,而是要高於用戶的輸入精度。
選擇
選擇的策略使用了名為錦標賽的方式,同時添加了精英保留機制。錦標賽是指隨機選擇N個(通常N=2)候選個體,再從中選擇最優的個體進入下一代,重復多次,直到子代規模達到要求。精英保留機制是是指保護已經產生的最優個體不被淘汰,不被交叉和變異破壞。
1 |
# Select individuals |
交叉和變異
交叉和編譯比較簡單,利用隨機數的方式來控制發生的概率。這里值得一提的是,現實中可能會發生多點的變異或者交叉,只不過概率非常低,在遺傳算法的實現中如果僅僅采用單點的交叉和變異也是可以的。
代碼和例子
https://github.com/ynnie/PyGeneticAlgorithm
使用例程:
1 |
import GeneticAlgorithm as GA # 導入GeneticAlgorithm模塊 |