智慧型控制 Intelligent Control

參數解碼

染色體是二進位字串,計算適應值之前要先解碼成實際的參數值:二進位 → 十進位 → 線性對應到參數的範圍。

二進位轉十進位 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\),正好就是轉成十進位:

$$[1\;0\;1\;1] \;\rightarrow\; 1\times2^3 + 0\times2^2 + 1\times2^1 + 1\times2^0 = 11 \qquad\texttt{polyval([1 0 1 1],2)} = 11$$

對應到參數範圍 Mapping to the Range

051015LHyxM十進位值0000 → 0 → L(下限)1111 → 15 = M → H(上限)1010 → 10 = x → y = ?M = 2BN − 1(BN=位元數)y = L + x (H − L) / M

若每個參數用 \(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

123456789101112第 1 個變數(i = 1)14第 2 個變數(i = 2)58第 3 個變數(i = 3)912第 i 個變數佔第 (i−1)·n+1 到第 i·n 個位元(每個變數 n 個位元;此圖 n = 4)

多個參數時,把各參數的位元依序串接成一條染色體。每個參數 \(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(程式註解譯為中文)

原圖對照
原圖
原圖
原圖