參數解碼
染色體是二進位字串,計算適應值之前要先解碼成實際的參數值:二進位 → 十進位 → 線性對應到參數的範圍。
二進位轉十進位 Binary to Decimal
Matlab 的 polyval(p, x) 計算多項式 \(p_1x^{n-1} + p_2x^{n-2} + \cdots + p_n\) 的值。例如 \(f(x) = 2x^2 + 3x + 5\),\(f(4)\) = polyval([2 3 5],4) = 49。把二進位的各位元當成多項式係數、代入 \(x = 2\),正好就是轉成十進位:
對應到參數範圍 Mapping to the Range
若每個參數用 \(BN\) 個位元,可表示的十進位值為 0~\(M\),\(M = 2^{BN} - 1\)。要讓全 0 對應到下限 \(L\)、全 1 對應到上限 \(H\),由相似三角形
$$\frac{y - L}{H - L} = \frac{x}{2^{BN}-1} \quad\Longrightarrow\quad y = L + \frac{x}{2^{BN}-1}\,(H - L)$$例:4 位元、範圍 \(L\) = 2~\(H\) = 10,[1 0 1 0] 的十進位 \(x\) = 10,所以 \(y = 2 + \frac{10}{15}\times 8\) = 7.333。位元數決定解析度:相鄰兩個可表示值相差 \((H-L)/(2^{BN}-1)\),4 位元時是 0.533,10 位元時只有 0.0078。(例題為補充)
多變數 Multi-Variable
多個參數時,把各參數的位元依序串接成一條染色體。每個參數 \(n\) 個位元時,第 \(i\) 個參數佔第 \((i-1)n+1\) 到第 \(in\) 個位元:
function result=GA2_Decode(popu,range)
%popu 是族群;range 是 2×var_no 的矩陣,每一行是對應參數的 [下限; 上限]
%result 傳回所有染色體解碼後的參數值
popusize=size(popu,1); % 染色體個數
var_no=size(range,2); % 參數個數
n=size(popu,2)/var_no; % 每個參數的位元數
for j=1:popusize % 每一個染色體
for i=1:var_no % 每一個參數
dec=polyval(popu(j,(i-1)*n+1:i*n),2); % 二進位轉十進位
result(j,i)=range(1,i)+dec*(range(2,i)-range(1,i))/(2^n-1); % 對應到參數範圍
end
end
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 1 節 GA2_Decode),可以直接在瀏覽器執行、修改參數。⬇ 下載 GA.ipynb
原講義附檔:GA2_Decode.zip(程式註解譯為中文)


