遺傳基因演算法
遺傳演算法(Genetic Algorithm,GA)模仿生物「物競天擇、適者生存」的演化:把要找的參數編碼成染色體,一次維持一整群候選解,經由複製、交配、突變一代代演化,讓適應值高的解越來越多。它不需要目標函數可微分,也不怕有很多局部極值,常用來搜尋控制器的參數(例如 PID 增益、模糊規則)。
本章內容 Contents
簡介Introduction
隨機產生初始族群Initial Population
參數解碼Decoding
計算適應函數值Fitness Function
複製Selection
交配Crossover
突變Mutation
保留最佳染色體Elitism
看 GA 怎麼找到最大值 Watch GA Evolve
(補充)以適應函數頁的 \(f(x,y) = x\sin(4x) + 1.1\,y\sin(y)\) 為例,在 \(0 \le x, y \le 10\) 內找最大值。做法和本章的 Matlab 程式相同:每個變數 10 位元、競賽法複製、單點交配、逐位元突變、菁英保留。可以調族群數、交配率、突變率,觀察族群(白點)怎麼從隨機分布聚集到最高峰:
- 突變率調成 0:族群很快「全部長得一樣」,常卡在某個局部高峰——這就是突變存在的理由。
- 突變率調到 0.1:族群一直被打散,最佳值上上下下,平均適應值也很低。
- 關閉菁英保留:最佳值可能在某一代突然變差(最好的染色體在交配或突變中被破壞)。
- GA 是機率性的方法:用預設參數重複 100 次,約有三分之二能在 60 代內爬上最高峰,其餘停在別的高峰(
verify_ga.py統計)。實務上會多跑幾次、或加大族群數。
參數建議 Parameter Settings
二進位編碼 GA 的參數,文獻中常見的建議值:
| 來源 | 族群數 | 交配率 | 突變率 |
|---|---|---|---|
| De Jong(1975) | 50~100 | 0.6 | 0.001 |
| Grefenstette(1986) | 30 | 0.95 | 0.01 |
| Schaffer 等(1989) | 20~30 | 0.75~0.95 | 0.005~0.01 |
編註:原講義寫作「Grenfenstette」,應為 J. J. Grefenstette。
範例與附檔 Examples
- 範例一 ga1.m:以 8 位元編碼、20 個染色體,在 \(2 \le x \le 10\) 內求 \(x^2\) 的最大值(答案 \(x = 10\),即染色體全為 1)。整個流程寫在同一個檔案,適合對照本章各頁逐段閱讀。
- 範例二 GAExample.zip、範例三 GAExample1.zip。
- 與 Simulink 模型結合:以 GA 搜尋 MCK 系統的 PID 增益 MCKGaPID6P5、MCKGaPID7;搜尋模糊控制器的三個比例因子(誤差、誤差變化、輸出)MCKGaFuzzy。適應值的算法見適應函數頁。
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(ga1.m、七個 GA 函式、GAExample、GAExample1、MCKPIDGA_Main 與 MCKFuzzyGa_Main,Simulink 模型改寫成 Python 模擬),可以直接在瀏覽器執行、修改參數。⬇ 下載 GA.ipynb
- 投影片 GA1.ppt、Ga2.ppt;菁英政策流程圖(Word)。
- 延伸閱讀:Introduction to Genetic Algorithm、Survey of GA and GP;Introduction to Genetic Algorithms(M. Obitko)↗(原講義連結的捷克理工大學舊址已搬到這裡;另一個美國海軍研究實驗室的 GA Archive 已停止服務)。