⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genepwb.m

📁 《面向MATLAB工具箱的神经网络理论与应用》一书中实例的所有源代码
💻 M
字号:
% genepwb.m                     %文件名

pausetime = 0.1;

load datapv                     % 装载in1和out1
k1 = 0.000024015;	
in=in1*k1;
out=out1/2^15;		            % 因计算机中采用的是16位D/A板,...
%								% 故用1/2^15将输出限制在1以内。
X11 = in(1:100:4000);           % 取40个数据对
X21 = out(1:100:4000); 

[Q,S]=size(X21);
P=[X11';X21'];                  % 根据图7.16构造训练网络用输入/输出对
T=X21';

N=50;       % 确定种群数

% 赋初始值
SSE=[zeros(1,N)];A2=[zeros(N,Q)];
WB1=[zeros(N,21)*2];
m=[zeros(1,N)];	mm=1;
WB=rands(N,21)*2;
NWB=WB;
min=1000;

G=200;          % 进化代数

for j=1:200,    % 开始直至G代的遗传进化
  SS=0;
  for i= 1:N,   % 求50组种群
  W1=[NWB(i,1) NWB(i,2);NWB(i,3) NWB(i,4);NWB(i,5) NWB(i,6);NWB(i,7) NWB(i,8);NWB(i,9) NWB(i,10)];
  B1=[NWB(i,11);NWB(i,12);NWB(i,13);NWB(i,14);NWB(i,15)];
  W2=[NWB(i,16) NWB(i,17) NWB(i,18) NWB(i,19) NWB(i,20)];
  B2=NWB(i,21);

%Calculate the fitness values

% PRESENTATION PHASE

  A1 = tansig(W1*P+B1*ones(1,Q));           % 计算神经网络的输出A2
  A2(i,:) = purelin(W2*A1+B2*ones(1,Q));
  E = T-A2(i,:);                            % 计算网络误差
  F(i) = sumsqr(E);         % 求每一组适配值

    if F(i)<0.00001, j=j-1,break,end    % 当适配值小于给定的0.00001,结束进化

  SS=SS+F(i);               % 求N个种群适应值和
  end

% % 复制操作(reproduction)

AF=SS/N;                    % 求N个种群适应值的平均值
n=1;nn=1;min1=0;

  for i=1:N,            % 寻找记录N个种群中小于平均适应值AF的个体
  dif=AF-F(i);
    if dif>=0,          
    m(n)=i;             % 记录个数n和所处序号i
    n=n+1; 
    min1=F(i)-min;      % 寻找本代最优(最小)适应值
      if min1<=0, min = F(i); nn=i;end  % 并把其序号保存到nn, 其值保存到min中
    end
   end

plot(F(1:N)),           % 绘出本代中50个适应值各自的值
pause2(pausetime),
min

  if j==mm*5, nj=j      % 每5代显示一次网络输出跟踪目标矢量的情况
  plot([X21 A2(nn,:)']),pause2(pausetime),mm=mm+1;
  end

% 交换操作(crossover)

 WB1(1,:)=NWB(nn,:);        % 将本代最优个体放置1号位
  for i=1:n-1,              % 将记录中低于平均适应值的个体从2号位起顺序排放
  WB1(i+1,:)=NWB(m(i),:);   % 只取少于s = 3*N/4的个体数进行淘汰
  end
  if n>3*N/4,s=3*N/4;
  else s=n;
  end

  for i=s:N,                % 用随机值补齐被淘汰的个体
  WB1(i,:)=rands(1,21)*2;
  end

 %k=fix(rand*10);

 if j<=60, intwb=fix(WB1*10)/10; % 60代前取权值个位及四位小数中的前一位
  else if j>60 &j<=80,intwb=fix(WB1*100)/100; % 61-80代取权值小数中的前两位
   else intwb=fix(WB1*1000)/1000;       % 81-200代取权值小数中的前三位
   end
 end 

poiwb=WB1-intwb;	        % 求权值在不同代中的小数部分
NWB(1,:)=WB1(1,:);          % 将本代最优个体直接进化到下一代
 
  for i=2:N/2,              % 将2到N/2与N-1到N/2 - 1的个体之间的权值的小数...
  NWB(i,:)=intwb(i,:)+poiwb(N+1-i,:);   % 进行交换
  end
  for i=1+N/2:N,
  NWB(i,:)=intwb(i-N/2,:)+poiwb(i,:);
  end

 % 变异操作(mutation) 
if j<=40, jk=N/2;                       % 选择变异的频率
 else if j>40 & j<=70, jk=fix(N/3);     % 从每N/2个个体中变异一次增长到
      else if j>70 & j<=100, jk=fix(N/4); % 每N/3到N/4个个体中变异一次
      end
 end

 for i=5:jk:N,
 k=fix(rand*10);                % 随机取一个9以内的整数
 mu1=num2str(NWB(i,:));         % 将所选定的个体中的权值数码中与随机...
 mu2=strrep(mu1,'k','k-1');     % 数k相同的数变为k - 1
 hh=sscanf(mu2,'%f')';
 [in,im]=size(hh);
 if im<21, NWB(i,:)=[hh 0.];
 else NWB(i,:)=hh;end
 end
end
end
NWB=NWB(1,:);                  % 取最佳权值
save plantwb NWB              % 将训练结果存入文件plantwb.mat中

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -