基本pso优化神经网络程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clc
clear all
%一、初始化部分
%1.1 预处理样本数据
% 选取训练样本(x,y)
for i=1:126
x=0+0.0251*(i-1);
y(i)=(sin(x)+(x.^2/9+x/3)*exp((-0.5)*(x.^2)))/2; % 待逼近函数
end
AllSamIn=0:0.0251:pi; %训练样本输入
AllSamOut=y; %训练样本输出
%选取测试样本
for i=1:125
x=0.0125+0.0251*(i-1); %测试样本输入
ytest(i)=(sin(x)+(x.^2/9+x/3)*exp((-0.5)*(x.^2)))/2; %测试样本输出
end
AlltestIn=0.0125:0.0251:(pi-0.0125);
AlltestOut=ytest;
%归一化训练样本,测试样本
[AlltestInn,minAlltestIn,maxAlltestIn,AlltestOutn,minAlltestOut,maxAlltestOut]= premnmx(AlltestIn,AlltestOut); %测试样本
[AllSamInn,minAllSamIn,maxAllSamIn,AllSamOutn,minAllSamOut,maxAllSamOut]= premnmx(AllSamIn,AllSamOut); %训练样本
testIn=AlltestInn;
testOut=AlltestOutn;
global Ptrain;
Ptrain = AllSamInn;
global Ttrain;
Ttrain = AllSamOutn;
%1.2 设置神经网络参数
global indim; %输入层神经元个数
indim=1;
global hiddennum; %隐藏层神经元个数
hiddennum=3;
global outdim; %输出层神经元个数
outdim=1;
global Gpos;
%1.3 设置微粒群参数
vmax=0.5; % 速度上限
minerr=1e-7; % 目标误差
wmax=0.95;
global itmax; % 最大迭代次数
itmax=200;
c1=1.5;
c2=1.5;
%权值随迭代次数线性递减以保证收敛
for iter=1:itmax
W(iter)=wmax-((wmax-wmin)/itmax)*iter;
end
a=-1;
b=1;
m=-1;
n=1;
global N; % 微粒个数
N=30;
global D; % 每个微粒的维数
D=(indim+1)*hiddennum+(hiddennum+1)*outdim; %所有权值和阈值
% 初始化微粒位置
rand('state',sum(100*clock)); %产生和时间相关的随机数
global X;
X=a+(b-a)*rand(N,D,1); %X的值在a 和b之间
%初始化微粒速度
V=m+(n-m)*rand(N,D,1); %V的值在m和n之间
%二、微粒群更新迭代部分
%global net;
net=newff(minmax(Ptrain),[hiddennum,outdim],{'tansig','purelin'});
global gbest; %全局最优位置
global pbest; %局部最优位置
%2.1第一次迭代
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain); %计算适应值
[C,I]=min(fitness(:,1,1)); %第一代,返回微粒群中最小适应值给C,该微粒的序号给I L(:,1,1)=fitness(:,1,1); %第一代,每个微粒的适应值
B(1,1,1)=C; %第一代,全局最优适应值(B存储当前代最优适应值)bestminimum(1)=C; % bestminimum存储所有代中的全局最小适应值
gbest(1,:,1)=X(I,:,1); %第一代,全局最优的微粒位置
for p=1:N
G(p,:,1)=gbest(1,:,1); %G便于速度更新运算(函数格式统一)
end
Gpos=gbest(1,:,1);
pbest(i,:,1)=X(i,:,1); %因为是第一代,当前位置即为历史最优位置
end
V(:,:,2)=W(1)*V(:,:,1)+c1*rand*(pbest(:,:,1)-X(:,:,1))+c2*rand*(G(:,:,1)-X(:,:,1)); % 更新速度% 判断速度是否越界
for ni=1:N
for di=1:D
if V(ni,di,2)>vmax
V(ni,di,2)=vmax;
else if V(ni,di,2)<-vmax
V(ni,di,2)=-vmax;
else
V(ni,di,2)=V(ni,di,2);
end
end
end
X(:,:,2)=X(:,:,1)+V(:,:,2); %更新位置
%disp('执行到这里')
%2.2 第2次到最后一次迭代
for j=2:itmax
h=j;
disp('迭代次数,当前代全局最佳适应值,本代以前所有代中的全局最佳适应值')
disp(j-1)
disp(B(1,1,j-1)) %j-1代全局最优适应值
disp(bestminimum(j-1)) %j-1代以前所有代中的全局最优适应值
disp('******************************')
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain);
[C,I]=min(fitness(:,1,j)); %第j代的最优适应值和最优微粒序号
L(:,1,j)=fitness(:,1,j); %第j代每个微粒的适应值
B(1,1,j)=C; %第j代全局最优适应值
gbest(1,:,j)=X(I,:,j); %第j代全局最优微粒的位置
[GC,GI]=min(B(1,1,:)); %所有代的全局最优适应值赋给GC,代数赋给GI
bestminimum(j)=GC; %所有代的最优适应值赋给j代的bestminimum
% 判断是否符合条件
if GC<=minerr
Gpos=gbest(1,:,GI); %若满足均方误差条件,记录最优位置,停止迭代
break
end
if j>=itmax
break %超过最大迭代次数时,退出
end