%% 清空环境
clc
clear
%% 参数初始化
%粒子群算法中的两个参数
c1 = 2;
c2 = 2;
maxgen=500; % 进化次数
sizepop=100; %种群规模
Vmax=0.1;
Vmin=-0.1;
popmax=1;
popmin=-1;
%% 产生初始粒子和速度
load 2019tidal
inputnum=6;
outputnum=1;
hiddennum=10;
%训练数据和预测数据
input_train=input(1:720,:)';
input_test=input(721:960,:)';
output_train=output(1:720)';
output_test=output(721:960)';
%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%构建网络
net=newff(inputn,outputn,hiddennum);
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
for i=1:sizepop
%随机产生一个种群
pop(i,:)=5*rands(1,2); %初始种群
V(i,:)=rands(1,2); %初始化速度
%计算适应度
fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn); %染色体的适应度
end
%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
%粒子位置和速度更新
%w(i)=1.2-0.8*i/maxgen;
for j=1:sizepop
%速度更新
V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax))=Vmax;
V(j,find(V(j,:)<Vmin))=Vmin;
%种群更新
pop(j,:)=pop(j,:)+0.5*V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)<popmin))=popmin;
%自适应变异代码
if rand>0.9
k=ceil(2*rand);
pop(j,k)=rand;
end
%新粒子适应度值
fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
end
%个体极值和群体极值更新
for j=1:sizepop
%个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
end
%% 结果分析
figure(1)
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);