MATLAB遺傳算法學習 Sheffield的gatbx (1)

        入門matlab遺傳算法的時候,若是你找來一本書,例如雷英傑的《matlab遺傳算法工具箱及其應用》,先看概念,看數學原理,看懂了,看例子,再開始寫程序,將是一個「漫長」的過程。我的認爲最快的方法是從例子開始,先簡單粗略地掃過幾個重要的概念、算法流程圖,而後找一本書,跟着書敲出例子,在命令窗口下一行一行地看每一句代碼出來什麼結果。 算法

        matlab遺傳算法方面好像沒有什麼好書,中文的書好像最流行《matlab遺傳算法工具箱及其應用》,我看的就是這一本。書中的第一個例子是一元函數和優化,由於是掃描版,只能本身慢慢敲,貼在這裏,須要的直接複製粘貼吧 函數

        注意你複製粘貼後,可能引號、逗號會變成中文格式,在matlab中顯示爲紅色,你要改一下。 工具

Figure(1);%(注:原文F大寫,應該小寫figure(1),下面的figure(2)也同樣。) 性能

fplot(‘variable .* sin(10 * pi * variable) + 2.0’,[-1, 2]);%畫出目標函數圖 優化

%定義遺傳算法參數 spa

NIND = 40;%個體數目 排序

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('解的變化', '種羣均值的變化');

 

未完待續

相關文章
相關標籤/搜索