遺傳算法matlab實現2:再加實例兩個(一元二元完整作圖,二維圖形,三維圖形以及進化過程圖)

(1)直接在命令窗口輸入以下代碼:

 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'])

結果:最優解:
X=1.149
Y=-0.8699

(2)直接在命令窗口輸入以下代碼:

%%畫出函數圖
figure(1);
lbx=-2;ubx=2;                                           %函數自變量x範圍[-2,2]
lby=-2;uby=2;                                         %函數自變量y範圍[-2,2]
 ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50);               %畫出函數曲線
hold on;
%%定義遺傳算法參數
NIND=40;                                                    %種羣大小
MAXGEN=50;                                                 %最大遺傳代數
PRECI=20;                                                     %個體長度
GGAP=0.95;                                                   %代溝
px=0.7;                                                         %交叉概率
pm=0.01;                                                       %變異概率
trace=zeros(3,MAXGEN);                                      %尋優結果的初始值
FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1];                   %區域描述器
Chrom=crtbp(NIND,PRECI*2);                              %創建任意離散隨機種羣
%%優化
gen=0;                                                      %代計數器
XY=bs2rv(Chrom,FieldD);                              %初始種羣的十進制轉換
X=XY(:,1);Y=XY(:,2); 
ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y);                  %計算目標函數值
while gen<MAXGEN
FitnV=ranking(-ObjV);                                 %分配適應度值
SelCh=select('sus',Chrom,FitnV,GGAP);                  %選擇
SelCh=recombin('xovsp',SelCh,px);                  %選擇
SelCh=mut(SelCh,pm);                  %變異
XY=bs2rv(SelCh,FieldD);              %子代個體的十進制轉換
X=XY(:,1);Y=XY(:,2);
ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y);              %計算子代的目標函數值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel)        %重插入子代到父代,得到新種羣
XY=bs2rv(Chrom,FieldD);
gen=gen+1;                                             %代計數器增加
%獲取每代的最優解及其序號,Y爲最優解,I爲個體的序號
[Y,I]=max(ObjV);
trace(1:2,gen)=XY(I,:);                        %記下每代的最優值
trace(3,gen)=Y;                            %記下每代的最優值
end
 
 plot3(trace(1,:),trace(2,:),trace(3,:),'bo');             %畫出每代的最優點
 grid on
plot3(XY(:,1),XY(:,2),ObjV,'bo');                          %畫出最後一代的種羣
 hold off
 %%畫進化圖
 figure(2);
 plot(1:MAXGEN,trace(3,:));
 grid on 
 xlabel('遺傳代數')
 ylabel('解的變化')
 title('進化過程')
 bestZ=trace(3,end);
 bestX=trace(1,end);
 bestY=trace(2,end); 
 fprintf(['最優解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\nZ=',num2str(bestZ),'\n'])

結果:

最優解:
X=1.7631
Y=-2
Z=3.7563

三維圖形:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章