function [NewW1,NewB1,NewW2,NewB2]=PSOTrain(TrainSamIn,TrainSamOut,HiddenUnitNum)
MG=700;%最大迭代次数
E0=0.0001;%允许的误差
Xmin=-10;
Xmax=10;
Vmin=-5;
Vmax=5;
M=100;%种群个数
c1=2.7;
c2=2.5;
w=0.9;
[R,SamNum]=size(TrainSamIn);
[S,SamNum]=size(TrainSamOut);
g=1;
d=0;
b1=zeros(HiddenUnitNum,R+S+1,M);
b2=zeros(S,M);
g1=zeros(HiddenUnitNum,R+S+1,M);
g2=zeros(S,M);
E=zeros(size(TrainSamOut));%保存误差
startp1=rand(HiddenUnitNum,R+S+1,M)-0.5;%产生初始的权值
startp2=rand(S,M)-0.5;
startv1=rand(HiddenUnitNum,R+S+1,M)-0.5;%产生初始的权值
startv2=rand(S,M)-0.5;
endp1=zeros(HiddenUnitNum,R+S+1,M);%产生初始的权值
endp2=zeros(S,M);
endv1=zeros(HiddenUnitNum,R+S+1,M);%产生初始的权值
endv2=zeros(S,M);
startE=zeros(1,M);
endE=zeros(1,M);
for i=1:M
W1=startp1(1:HiddenUnitNum,1:R,i);
W2=startp1(1:HiddenUnitNum,R+1:R+S,i);
B1=startp1(1:HiddenUnitNum,R+S+1,i);
B2=startp2(1:S,i);
for j=1:SamNum
TempOut=tansig(W1*TrainSamIn(:,j)+B1);
NetWorkOut(1,j)=W2'*TempOut+B2;
end
E=NetWorkOut-TrainSamOut;
startE(1,i)=sum(E)/(SamNum*S);
b1(:,:,i)=startp1(:,:,i);
b2(:,i)=startp2(:,i);
end
[minE,index]=min(startE(1,:));%找出误差的最小值,并找到相应的指标
g1=startp1(:,:,index);%自身的最优位置
g2=startp2(:,index);%群体的最优位置
pgvalue=minE;
pgvalue_last=pgvalue;
while (~d)
for k=1:M
endv1(:,:,k)=w*startv1(:,:,k)+c1*rand*(b1(:,:,k)-startp1(:,:,k))+c2*rand*(g1-startp1(:,:,k));
endv2(:,k)=w*startv2(:,k)+c1*rand*(b2(:,k)-startp2(:,k))+c2*rand*(g2-startp2(:,k));
for i=1:HiddenUnitNum%将速度保持在参数的范围内
for j=1:(R+S+1)
endv1(i,j,k)=endv1(i,j,k);
if endv1(i,j,k)>Vmax
endv1(i,j,k)=Vmax;
elseif endv1(i,j,k)<Vmin
endv1(i,j,k)=Vmin;
end
end
end
for s=1:S
endv2(s,k)=endv2(s,k);
if endv2(s,k)>Vmax
endv2(s,k)=Vmax;
elseif endv2(s,k)<Vmin
endv2(s,k)=Vmin;
end
end
endp1(:,:,k)=startp1(:,:,k)+endv1(:,:,k);%位置更新
endp2(:,k)=startp2(:,k)+endv2(:,k);%位置更新
for i=1:HiddenUnitNum%将位置保持在参数的范围内
for j=1:(R+S+1)
if endp1(i,j,k)>Xmax
endp1(i,j,k)=Xmax;
elseif endp1(i,j,k)<Xmin
endp1(i,j,k)=Xmin;
end
end
end
for s=1:S
if endp2(s,k)>Xmax
endp2(s,k)=Xmax;
elseif endp2(s,k)<Xmin
endp2(s,k)=Xmin;
end
end
W1=endp1(1:HiddenUnitNum,1:R,k);
W2=endp1(1:HiddenUnitNum,R+1:R+S,k);
B1=endp1(1:HiddenUnitNum,R+S+1,k);
B2=endp2(1:S,k);
for p=1:SamNum
TempOut=tansig(W1*TrainSamIn(:,p)+B1);
NetWorkOut(1,p)=W2'*TempOut+B2;
end
E=NetWorkOut-TrainSamOut;
endE(1:k)=sumsqr(E)/(SamNum*S);
if endE(1,k)<startE(1,k)
b1(:,:,k)=endp1(:,:,k);
b2(:,k)=endp2(:,k);
startE(1,k)=endE(1,k);
end
end
w=0.9-(0.5/MG)*g;
[value,index]=min(startE(1,:));
if value<pgvalue
g1=b1(:,:,index);
g2=b2(:,index);
pgvalue=value;
end
if g>=MG
d=1
end
if pgvalue<E0
d=1;
end
startp1=endp1;
startp2=endp2;
startv1=endv1;
startv2=endv2;
startE=endE;
g=g+1;
end
W1=g1(1:HiddenUnitNum,1:R);
W2=g1(1:HiddenUnitNum,R+1:R+S);
B1=g1(1:HiddenUnitNum,R+S+1);
B2=g2(:,1);
NewW1=W1;
NewW2=W2;
NewB1=B1;
NewB2=B2;
PSO.rar_pso 神经网络_soil_土壤水分_水分matlab_神经网络水分
版权申诉
10 浏览量
2022-09-23
13:33:19
上传
评论
收藏 4KB RAR 举报
寒泊
- 粉丝: 75
- 资源: 1万+