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

📄 fnnga4.m

📁 BP神经网络算法,采用遗传算法训练具有7个隶属函数的FNN控制器权值的程序等
💻 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 + -