保留最佳染色體
最佳染色體經過複製、交配之後不一定留在子代中,也可能因突變而消失。若把上一代的最佳染色體直接保留到下一代,就能確保「目前找到的最佳解」不會變差,收斂也比較快。這稱為菁英政策(elitism)。
編註:原講義寫「最佳染色體一定會被送入交配池」,用競賽法時並不成立——最佳者只要被抽到就一定贏,但它也可能一次都沒被抽到。每次競賽抽兩個(不重複),最佳者沒被抽到的機率是 \(1 - 2/m\);做 \(m\) 次競賽都沒抽到的機率為 \((1-2/m)^m\),族群 20 個時約 0.12(\(m\) 很大時趨近 \(e^{-2}\) ≈ 0.135)。所以即使在複製這一步,最佳解也有約一成的機會直接消失,這正是需要菁英政策的另一個理由。
用 sort 找出最佳者 Finding the Best with sort
Matlab 的 [fs, ind] = sort(f) 把 f 由小到大排序,ind 記錄排序後每個元素原本的位置。例如 f = [10 50 30 20]:
>> [fs,ind]=sort(f)
fs = 10 20 30 50
ind = 1 4 3 2
>> maxf=f(ind(end)) % 最後一個就是最大值的位置:f(2) = 50
所以適應值最大的前 \(k\) 名,就是 ind(end)、ind(end-1)、……、ind(end-k+1) 對應的染色體。
保留與放回 Keep and Restore
先在複製之前記下最佳的 elit_no 個染色體:
function bestxy=GA21_Elit1(popu,fitness,elit_no)
PopuSize=size(popu,1);
[fit,ind]=sort(fitness); % 排序(fit 是 fitness 的值,ind 是位置)
clear fit;
for ii=1:elit_no
bestxy(ii,:)=popu(ind(PopuSize+1-ii),:); % 由最大的往回取
end
交配、突變完成後,再把它們放回新族群(取代前面幾個):
function result=GA51_Elit2(popu,bestxy)
elit_no=size(bestxy,1);
for ii=1:elit_no
popu(ii,:)=bestxy(ii,:);
end
result=popu;
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 1 節 GA21_Elit1、GA51_Elit2),可以直接在瀏覽器執行、修改參數。⬇ 下載 GA.ipynb
附註:原講義截圖中的 GA51_Elit2 寫成三個引數 (popu,bestxy,elit_no),附檔程式則由 bestxy 的列數自動取得 elit_no,只需兩個引數;以上採附檔版本。菁英數不宜太多,否則族群很快被少數幾個染色體佔滿,失去多樣性。
原講義附檔:GA21_Elit1.zip、GA51_Elit2.zip

