📄 fnnga4.m
字号:
% fnnga4.m % 程序名
% 采用遗传算法训练具有7个隶属函数的FNN控制器权值的程序
%
clear
pausetime = 0.1;
load squarin.mat
load plantv.mat
N=20;
k1=0.000024015;
k2=1/32768;
k3=50;k4=0.5;
fn =4; ns = fn*4+fn*fn; % 由7个模糊标记计算个体中的所含实数编码的总数目ns
ns
in=k2*inpi(1:100:4000);
T=in';
[mn,Q]=size(T);
A2=[zeros(N,Q)];
y=[zeros(N,Q)];
%produce the reference signal & the initial learning data
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;
% test
for j=1:100,
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)];
B1=[NWB(i,9);NWB(i,10);NWB(i,11);NWB(i,12);NWB(i,13);NWB(i,14);NWB(i,15);NWB(i,16)];
W2=[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)...
NWB(i,29) NWB(i,30) NWB(i,31) NWB(i,32)];
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);
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;
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,
final_err = F(i);
save result W1 W2 B1 final_err;
break,end
SS=SS+F(i);
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<=40, intwb=fix(WB1*10)/10; % 20代前取权值个位及四位小数中的前一位
else if j>40 &j<=75,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=40; % 选择变异的频率
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
wbg4=NWB(1,:);
save fnnwb4 wbg4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -