📄 genepwb.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 + -