第一章謝菲爾德大學的MATLAB遺傳演算法工具箱(一)
clc
clear all
close all
%% 畫出函式圖
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為個體的序號
[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'])