1. 程式人生 > >第一章謝菲爾德大學的MATLAB遺傳演算法工具箱(一)

第一章謝菲爾德大學的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'])