天天看點

MATLAB遺傳算法工具箱舉例(一)

簡單一進制函數優化

利用遺傳算法計算以下函數的最小值:

MATLAB遺傳算法工具箱舉例(一)

選擇二進制編碼,遺傳算法參數設定如下:

種群大小 最大遺傳代數 個體長度 代溝 交叉機率 變異機率
40 20 20 0.95 0.7 0.01

遺傳算法優化程式代碼:

clc
clear
%%畫出函數圖
figure(1);
hold on;
lb=1;ub=2;%函數自變量範圍[1,2]
ezplot('sin(10*pi*X)/X',[lb,ub]);
xlabel('自變量/X')
ylabel('函數值/Y')

%%定義遺傳算法參數
Nind=40;%種群大小
Maxgen=20;%最大遺傳代數
Preci=20;%個體長度
Ggap=0.95;%代溝
px=0.7;%交叉機率
pm=0.01;%變異機率
trace=zeros(2,Maxgen);
FieldD=[Preci;lb;ub;1;0;1;1];
Chrom=crtbp(Nind,Preci);

%%優化
gen=0;
X=bs2rv(Chrom,FieldD);
ObjV=sin(10*pi*X)./X;
while gen<Maxgen
    FitnV=ranking(ObjV);
    SelCh=select('sus',Chrom,FitnV,Ggap);
    SelCh=recombin('xovsp',SelCh,px);
    SelCh=mut(SelCh,pm);
    X=bs2rv(SelCh,FieldD);
    ObjVSel=sin(10*pi*X)./X;
    [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
    X=bs2rv(Chrom,FieldD);
    gen=gen+1;
    
    [Y,I]=min(ObjV);
    trace(1,gen)=X(I);
    trace(2,gen)=Y;
end
plot(trace(1,:),trace(2,:),'bo');
grid on;
plot(X,ObjV,'b*');
hold off

figure(2);
plot(1:Maxgen,trace(2,:));
grid on
xlabel('遺傳代數')
ylabel('解的變化')
title('進化程序')
bestY=trace(2,end);
bestX=trace(1,end);
fprintf(['最優解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])
           

計算結果:

MATLAB遺傳算法工具箱舉例(一)
MATLAB遺傳算法工具箱舉例(一)

繼續閱讀