基本pso优化神经网络程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档