簡單一進制函數優化
利用遺傳算法計算以下函數的最小值:
選擇二進制編碼,遺傳算法參數設定如下:
種群大小 | 最大遺傳代數 | 個體長度 | 代溝 | 交叉機率 | 變異機率 |
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'])
計算結果: