📄 fnnga7.m
字号:
% fnnga7.m % 程序名
% 采用遗传算法训练具有7个隶属函数的FNN控制器权值的程序
%
clear
pausetime = 0.1;
load squarin.mat % 系统跟踪曲线
load plantv.mat % 取被控对象神经网络的权矢量PW10, PW20, PB10, PB20
% 赋初始值
N=20; % 确定种群数
k1=0.000024015;
k2=1/32768;
k3=50;k4=0.5;
fn =7; ns = fn*4+fn*fn; % 由7个模糊标记计算个体中的所含实数编码的总数目ns
ns
in=k2*inpi(1:100:4000); % 取40个数进行训练
T=in';
[mn,Q]=size(T);
A2=[zeros(N,Q)];
y=[zeros(N,Q)];
e=T-0;ec=zeros([1,Q]);P=k3*[e;ec];
SSE=[zeros(1,N)];
WB1=[zeros(N,ns)*2];
NWB=rands(N,ns)*2;
m=[zeros(1,N)]; mm=1;
min=1000000;
G =100;
for j=1:G, % 开始直至G代的遗传进化
SS=0;
for i= 1:N,
W1=[NWB(i,1) 0;NWB(i,2) 0;NWB(i,3) 0;NWB(i,4) 0;NWB(i,5) 0;...
0 NWB(i,6);0 NWB(i,7);0 NWB(i,8);0 NWB(i,9);0 NWB(i,10);...
0 NWB(i,11);0 NWB(i,12);0 NWB(i,13);0 NWB(i,14)];
B1=[NWB(i,15);NWB(i,16);NWB(i,17);NWB(i,18);NWB(i,19);NWB(i,20);...
NWB(i,21);NWB(i,22);NWB(i,23);NWB(i,24);NWB(i,25);...
NWB(i,26);NWB(i,27);NWB(i,28)];
W2=[NWB(i,29) NWB(i,30) NWB(i,31) NWB(i,32) NWB(i,33) NWB(i,34)...
NWB(i,35) NWB(i,36) NWB(i,37) NWB(i,38) NWB(i,39) NWB(i,40)...
NWB(i,41) NWB(i,42) NWB(i,43) NWB(i,44) NWB(i,45) NWB(i,46)...
NWB(i,47) NWB(i,48) NWB(i,49) NWB(i,50) NWB(i,51) NWB(i,52)...
NWB(i,53) NWB(i,54) NWB(i,55) NWB(i,56) NWB(i,57) NWB(i,58)...
NWB(i,59) NWB(i,60) NWB(i,61) NWB(i,62) NWB(i,63) NWB(i,64)...
NWB(i,65) NWB(i,66) NWB(i,67) NWB(i,68) NWB(i,69) NWB(i,70)...
NWB(i,71) NWB(i,72) NWB(i,73) NWB(i,74) NWB(i,75) NWB(i,76)...
NWB(i,77)];
B2=0;
%calculate the fnnet's output
e(1)=0.05;ec(1)=0.05;
P=k3*[e(1);ec(1)];
for k=1:Q,
A10 = gause(W1*P,B1); % 计算FNN神经网络的输出A20
A11 = multil(A10);
A20(k) = purelin(W2*A11);
A21(k)=A20(k)*k4; % 检查所计算出的控制量是否正向饱和
if A21(k)>1.
cm(k)=0.7869; %32768*0.000024015=0.7869
else if A21(k)<-1. % 检查所计算出的控制量是否负向饱和
cm(k)=-0.7869; % 饱和时输出最大饱和值
else
cm(k)=A21(k)*0.7869; % 未饱和则输出计算值A21
end
end
xp(:,k)=[cm(k);T(k)]; % 构造被控对象网络输入矢量
AA1=tansig(PW10*xp(:,k)+PB10);
y(i,k)=purelin(PW20*AA1+PB20); % 计算系统输出值
E(k) = T(k)-y(i,k); % 计算系统输出误差值
ec(k+1)=e(k); % 计算系统下一时刻的误差值
e(k+1)=E(k)*k3;
P=[e(k+1);ec(k+1)];
end
F(i)=sqrt(sumsqr(E)); % 求每一组适应度值
%if reach the err_goal then quit
if F(i)<0.0001, % 当适配值小于给定的0.00001,结束进化
final_err = F(i);
save result W1 W2 B1 final_err;
break,end
SS=SS+F(i); % 求N个种群适应值和
end
% 复制操作(reproduction)
AF=SS/N; % 求N个种群适应值的平均值
n=1;nn=N;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)), % 绘出本代中N个适应值各自的值
pause2(pausetime),
minim=min % 显示本代中最小适应值
nn
AF
if j==mm*5,nj=j % 每5代显示一次网络输出跟踪目标矢量的情况
plot([T(1:k)' y(nn,:)']),pause2(pausetime),mm=mm+1;
end
% 交换操作(crossover)
WB1(N,:)=NWB(nn,:); % 将本代最优个体放置N号位
if n-1>3*N/4,s=3*N/4; % 只取少于s = 3*N/4的个体数进行淘汰
else s=n-1;
end
for i=1:n-2, % 将记录中低于平均适应值的个体从N-1号位起向前顺序排放
WB1((N-i),:)=NWB(m(i),:);
end
for i=1:N-s, % 用随机值补齐被淘汰的个体
WB1(i,:)=rands(1,ns)*2;
end
% k=fix(rand*10);
if j<=20, intwb=fix(WB1*10)/10; % 20代前取权值个位及四位小数中的前一位
else if j>20 &j<=50,intwb=fix(WB1*100)/100; % 21~50代取权值小数中的前两位
else intwb=fix(WB1*1000)/1000; %51代以后取权值小数中的前三位
end
end
poiwb=WB1-intwb; % 求权值在不同代中的小数部分
NWB(N,:)=WB1(N,:); % 将本代最优个体直接进化到下一代
for i=1:N/2, % 将1到N/2与N-1到N/2 - 1的个体之间的权值的小数进行交换
NWB(i,:)=intwb(N-i,:)+poiwb(i,:);
end
for i=1+N/2:N,
NWB(i-1,:)=intwb(i-N/4,:)+poiwb(i,:);
end
% 变异操作(mutation)
if j>10 & j<=30, jk=35; % 选择变异的频率
else if j>30 & j<=50, jk=30; %从每40个个体中变异一次增长到…
else if j>50 & j<=80, jk=25; %每25到个个体中变异一次
else jk=40; end
end
end
for i=5:jk:N-1,
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<ns, NWB(i,:)=[hh 0.];
else NWB(i,:)=hh;end
end
end
wbg7=NWB(1,:);
save fnnwb7 wbg7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -