入門matlab遺傳算法的時候,若是你找來一本書,例如雷英傑的《matlab遺傳算法工具箱及其應用》,先看概念,看數學原理,看懂了,看例子,再開始寫程序,將是一個「漫長」的過程。我的認爲最快的方法是從例子開始,先簡單粗略地掃過幾個重要的概念、算法流程圖,而後找一本書,跟着書敲出例子,在命令窗口下一行一行地看每一句代碼出來什麼結果。 算法
matlab遺傳算法方面好像沒有什麼好書,中文的書好像最流行《matlab遺傳算法工具箱及其應用》,我看的就是這一本。書中的第一個例子是一元函數和優化,由於是掃描版,只能本身慢慢敲,貼在這裏,須要的直接複製粘貼吧 函數
注意你複製粘貼後,可能引號、逗號會變成中文格式,在matlab中顯示爲紅色,你要改一下。 工具
Figure(1);%(注:原文F大寫,應該小寫figure(1),下面的figure(2)也同樣。) 性能
fplot(‘variable .* sin(10 * pi * variable) + 2.0’,[-1, 2]);%畫出目標函數圖 優化
%定義遺傳算法參數 spa
MAXGEN = 25;%最大遺傳代數 數學
PRECI = 20;%變量的二進制位數(注:也就是精度) it
GGAP = 0.9;%代溝 入門
trace = zeros(2, MAXGEN);%尋優結果,初始值
FieldD = [20; -1;2;1;0;1;1];%區域描述器
Chrom = crtbp(NIND,PRECI);%初始種羣
gen = 0;%代計數器
variable = bs2rv(Chrom,FieldD);%初始種羣轉成十進制數
ObjV = variable .* sin(10 * pi * variable) + 2.0;%目標函數值
while gen <= MAXGEN,
FitnV = ranking(-ObjV);%分配適應度值
%(注:函數ranking的功能是:基於排序的適應度值分配,根據個體的目標值由小到大的順序對它們進行排序,並返回一包含對應個體適應度值FitnV的列向量。
壓差是指:分配的個體適應度值的差距,最好的和最壞的,他對原來的函數值沒有影響,只是根據原來的函數值來分配一個體現個體優劣的一個值。)
SelCh = select('sus',Chrom,FitnV,GGAP);%選擇
SelCh = recombin('xovsp',SelCh,0.7);%重組,即交叉
SelCh = mut(SelCh); %變異
variable = bs2rv(SelCh,FieldD);%子代十進制轉換
ObjVSel = variable .* sin(10 * pi * variable) + 2.0;%子代目標函數值
[Chrom ObjV] = reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);%重插入子代新種羣
gen = gen + 1; %(注:matlab不支持gen += 1)
[Y,I] = max(ObjV),hold on;
plot(variable(I), Y, ‘bo’);
trace(1, gen) = max(ObjV); %遺傳算法性能跟蹤
trace(2, gen) = sum(ObjV) / length(ObjV);
end
variable = bs2rv(Chrom, FieldD);%最優個體的十進制轉換
hold on,
grid;
plot(variable‘, ObjV’, 'b*');
Figure(2);
plot(trace(1, :));
hold on
plot(trace(2, :),'-.'); grid;
legend('解的變化', '種羣均值的變化');
未完待續