%% 基于蚁群算法优化BP神经网络(ACO-BP)的的污垢预测研究
clc
clear all
close all
%% 读取数据
data=xlsread('污垢2.xls');
%% 训练数据
tr_len=40;%训练数据个数
P_train=data(1:tr_len,3:12)';% 输入3-12列
T_train=data(1:tr_len,13)';% 输出13列
%% 测试样本
P_test=data(tr_len+1:end,3:12)';% 输入3-12列
T_test=data(tr_len+1:end,13)';% 输出13列
%% 数据归一化
% 训练样本
[Pn_train,inputps] = mapminmax(P_train,0,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 测试样本
[Tn_train,outputps] = mapminmax(T_train,0,1);
Tn_test = mapminmax('apply',T_test,outputps);
[inputnum,N]=size(Pn_train);%输入节点数量
outputnum=size(Tn_train,1);%输出节点数量
hiddennum=7;
%构建网络
net=newff(Pn_train,Tn_train,hiddennum);
%% HS算法参数初始化
nVar=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
%% 蚁群算法ACO参数初始化
Ant = 10; % 蚂蚁数量
Times = 10; % 蚂蚁移动次数
Rou = 0.8; % 信息素挥发系数
P0 = 0.2; % 转移概率常数
%% 取值范围
popmax = 1; % 待寻优阈值最大取值初始化
popmin =-1; % 待寻优阈值最小取值初始化
%% 产生初始粒子和速度
for i=1:Ant
% 随机产生一个种群
%for j = 1: nVar
pop(i,:) = (rand(1,nVar) * ( popmax-popmin ) + popmin ); % 初始种群个体
% end
% 计算适应度
fitness(i)=objfun_BP(pop(i,:) ,inputnum,hiddennum,outputnum,net,Pn_train,Tn_train);
end
% 找最好的染色体
[bestfitness bestindex]=min(fitness); % 最大适应度值
zbest = pop(bestindex,:); % 全局最佳
gbest = pop; % 个体最佳
fitnessgbest = fitness; % 个体最佳适应度值
fitnesszbest = bestfitness; % 全局最佳适应度值
%% 迭代寻优
for T = 1:Times
disp(['迭代次数: ',num2str(T)]) % 迭代次数
lamda = 1/T; % 随着迭代次数进行,蚂蚁信息素挥发参数
[bestfitness, bestindex]=min(fitness); % 找最好的适应度值
ysw(T) = bestfitness; % 存储最好的适应度值
for i=1:Ant
P(T,i)=(fitness(bestindex)-fitness(i))/fitness(bestindex); % 计算状态转移概率
end
% 蚂蚁个体更新
for i=1:Ant
if P(T,i)<P0 % 局部搜索
temp(i,:) = pop(i,:)+(2*rand-1)*lamda;
else % 全局搜索
temp(i,:) = pop(i,:)+(popmax-popmin)*(rand-0.5);
end
% 越界处理
temp(i,find(temp(i,:)>popmax))=popmax;
temp(i,find(temp(i,:)<popmin))=popmin;
% 判断蚂蚁是否移动
% if Fitness_ACO( temp(i,:), 'aco') < Fitness_ACO(pop(i,:), 'aco') % 判断蚂蚁是否移动
if objfun_BP(temp(i,:) ,inputnum,hiddennum,outputnum,net,Pn_train,Tn_train)< objfun_BP(pop(i,:) ,inputnum,hiddennum,outputnum,net,Pn_train,Tn_train);
pop(i,:) = temp(i,:);
end
end
% 更新信息量
for i=1:Ant
fitness(i) = (1-Rou)*fitness(i) + objfun_BP(pop(i,:) ,inputnum,hiddennum,outputnum,net,Pn_train,Tn_train); % 更新信息量
end
bestBP(T) = min(fitness); % 存储最好的适应度值
end
[max_value,max_index] = min(fitness); % 最大适应度值
zbest = pop(max_index,:);
%% 清除变量
clear Ant i T Rou p P0 lamda popmax popmin j N_PAR P V gbest max_index
clear Lmax level fitnessgbest fitnesszbest bestfitness bestindex fitnessgbest
%% 结果输出
fitnessbest = max_value % 返回最优阈值
zbest; % 最佳个体值
%time = toc % 返回CPU计算时间
figure('color',[1,1,1])
plot(bestBP,'b-')
xlabel('迭代次数');ylabel('RMSE')
x=zbest;
%% 把最优初始阀值权值赋予网络预测
% %用遗传算法优化的BP网络进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
%% BP网络训练
%网络进化参数
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;
%网络训练
net=train(net,Pn_train,Tn_train);
%% 训练集
T_sim=sim(net,Pn_train);
T_simu=mapminmax('reverse',T_sim,outputps);
figure
plot(1:length(T_simu),T_simu,'r-o','linewidth',1)
hold on
plot(1:length(T_train),T_train,'b-.','linewidth',1)
xlabel('训练样本')
ylabel('污垢')
title('蚁群算法优化BP神经网络(ACO-BP)')
legend('预测值','实际值')
%% BP网络预测
% %数据归一化
% Pn_test=mapminmax('apply',P_test,inputps);
an=sim(net,Pn_test);
test_simu=mapminmax('reverse',an,outputps);
%error=test_simu-output_test;
figure
plot(1:length(test_simu),test_simu,'r-o','linewidth',1)
hold on
plot(1:length(test_simu),T_test,'b-.','linewidth',1)
ylabel('污垢')
title('蚁群算法优化BP神经网络(ACO-BP)')
legend('预测值','实际值')