智慧型控制 Intelligent Control

計算適應函數值

適應函數(fitness function)衡量每個染色體「有多好」,GA 會讓適應值大的染色體有更多機會留下後代。適應函數直接由要解的問題決定。

若要求 \(f(x, y) = x\sin(4x) + 1.1\,y\sin(y)\) 的最大值,適應函數就取 \(f(x, y)\) 本身。

若要求最小值,適應函數改為

$$g(x, y) = K - f(x, y)$$

其中 \(K\) 是一個常數,要大到讓 \(g\) 在整個搜尋範圍內都是正值。(適應值要為正,是因為輪盤法以適應值的比例當作被選中的機率;若改用競賽法,只比大小,負值也沒關係。)

適應函數的地形 Fitness Landscape

(補充)把搜尋範圍取為 \(0 \le x, y \le 10\),畫出 \(f\) 的分布:

00224466881010xy-14.718.5f(x, y) 的值(紅=大、藍=小)f(x, y) = x sin(4x) + 1.1 y sin(y)範圍 0 ≤ x, y ≤ 10 內的最大值:f ≈ 18.53,在 (x, y) ≈ (9.83, 7.98)白圈=全域最大值峰很多、彼此分開:梯度法容易停在局部極大值,GA 同時從許多點搜尋。

這個函數有許多分開的峰,從隨機起點出發的梯度法很可能爬上附近的小峰就停住;GA 一次在整個範圍內放很多點,又靠突變不斷探索,比較容易找到全域最大值。用GA 演化互動模擬可以實際觀察。

在控制上的適應函數 Fitness for Controller Tuning

用 GA 調控制器時,染色體是控制器參數,每個染色體都要跑一次閉迴路模擬,再依響應算出適應值。本章範例 MCKGaPID 的主程式 MCKPIDGA_Main.m 是這樣做的:染色體為 \(K_p, K_i, K_d\)(各 8 位元、範圍 0.1~10),以 Simulink 模擬 MCK 系統 10 秒的步階響應,然後

$$J = \sum_{t > 1.2\,\text{s}} \big(r(t) - x(t)\big)^2 \;+\; \begin{cases} 1000, & \max x > 1.15 \text{(超越量大於 15\%)}\\ 0, & \text{其他} \end{cases} \qquad \text{適應值} = 3000 - J$$

也就是「誤差平方和+超越量懲罰」當成本 \(J\),再用上面 \(g = K - f\) 的方法轉成要最大化的適應值。只計算 1.2 秒以後的誤差,是不在乎起步那段、只要求盡快穩定在設定值。(說明為補充,數值取自原講義附檔程式)

▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 6、7 節 MCKPIDGA_Main 與 MCKFuzzyGa_Main),可以直接在瀏覽器執行、修改參數。⬇ 下載 GA.ipynb

附註:主程式呼叫 GA1_Initpopu(PopuSize,var_n,bit_n) 時後兩個引數的順序和函式定義 (popusize,bit_n,var_n) 相反,但函式只用到兩者的乘積,結果不受影響。

原圖對照
原圖