一、引力搜索算法简介
GSA是伊朗的克曼大学教授RASHEDI等于2009年提出的一种新型智能优化算法,算法灵感来源于粒子受万有引力的作用。它可以理解为众多的粒子向具有最大惯性质量的粒子不断靠近的过程。算法中,种群由惯性质量各不相同的粒子组成,每个粒子的位置对应问题的一个解,指引算法进行迭代优化的引力和惯性质量是由适应度函数值确定的。当种群中出现惯性质量大的粒子时,其他粒子都朝着惯性质量大的粒子运动,从而使算法收敛到最优解。
假设在n维搜索空间中有NP个粒子,则第i个粒子的位置表示为:
在第t次迭代时,种群中第j个粒子作用在第i个粒子上的引力表示为:
式中:Mi(t)和Mj(t)分别表示被作用粒子i和作用粒子j的惯性质量;Rij(t)为两个粒子i和j之间的欧氏距离;ε为一个很小的常量;G(t)为第t次迭代时的引力系数,它随时间逐渐减小以控制搜索精度,是初始值G0和迭代次数t的函数:
式中:α为控制G(t)衰减速率的常数;T为迭代总次数。一般G0=100,α=20。
种群中其他粒子对第i个粒子的引力的合力以及这个合力在第i个粒子处的加速度ali(t)可用式(10)和式(11)表示:
式中randj是范围在[0,1]之间的随机数。
粒子的惯性质量可根据种群的适应度值fit来计算:
worst(t)和best(t)分别表示当前种群中适应度的最差值和最好值,由于本文求解的是最小值问题,定义worst(t)和best(t)为种群中适应度最大值和最小值。
GSA算法中,每一次迭代种群的速度和位置更新公式为:
式中randi是区间[0,1]中的均匀随机变量。
二、部分源代码
%% 初始化
clear
close all
clc
format shortg
warning off
addpath(‘func_defined’)
%% 读取读取
data=xlsread(‘数据.xlsx’,‘Sheet1’,‘A1:N252’); %%使用xlsread函数读取EXCEL中对应范围的数据即可
%输入输出数据
input=data(:,1:end-1); %data的第一列-倒数第二列为特征指标
output=data(:,end); %data的最后面一列为输出的指标值
N=length(output); %全部样本数目
testNum=15; %设定测试样本数目
trainNum=N-testNum; %计算训练样本数目
%% 划分训练集、测试集
input_train = input(1:trainNum,:)‘;
output_train =output(1:trainNum)’;
input_test =input(trainNum+1:trainNum+testNum,:)‘;
output_test =output(trainNum+1:trainNum+testNum)’;
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,-1,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax(‘apply’,input_test,inputps);
%% 获取输入层节点、输出层节点个数
inputnum=size(input,2);
outputnum=size(output,2);
disp(‘/’)
disp(‘极限学习机ELM结构…’)
disp([‘输入层的节点数为:’,num2str(inputnum)])
disp([‘输出层的节点数为:’,num2str(outputnum)])
disp(’ ')
disp(‘隐含层节点的确定过程…’)
%用训练数据训练极限学习机模型
[IW0,B0,LW0,TF,TYPE] = elmtrain(inputn,outputn,hiddennum);
%对训练集仿真
an0=elmpredict(inputn,IW0,B0,LW0,TF,TYPE); %仿真结果
mse0=mse(outputn,an0); %仿真的均方误差
disp(['隐含层节点数为',num2str(hiddennum),'时,训练集的均方误差为:',num2str(mse0)])
%更新最佳的隐含层节点
if mse0<MSE
MSE=mse0;
hiddennum_best=hiddennum;
end
end
disp([‘最佳的隐含层节点数为:’,num2str(hiddennum_best),‘,相应的均方误差为:’,num2str(MSE)])
%% 训练最佳隐含层节点的极限学习机模型
disp(’ ')
disp(‘ELM极限学习机:’)
[IW0,B0,LW0,TF,TYPE] = elmtrain(inputn,outputn,hiddennum_best);
%% 麻雀搜索算法寻最优权值阈值
disp(’ ')
disp(‘SSA优化ELM极限学习机:’)
%初始化SSA参数
N=30; %初始种群规模
M=100; %最大进化代数
dim=inputnumhiddennum_best+hiddennum_best; %自变量个数
%自变量下限
lb=[-ones(1,inputnumhiddennum_best) … %输入层到隐含层的连接权值范围是[-1 1] 下限为-1
zeros(1,hiddennum_best)]; %隐含层阈值范围是[0 1] 下限为0
[Convergence_curve,bestX]=GSA(N ,dim ,lb,ub,M,ElitistCheck,min_flag,Rpower,hiddennum_best, inputn, outputn, output_train, inputn_test ,outputps, output_test);
%% 绘制进化曲线
figure
plot(Convergence_curve,‘r-’,‘linewidth’,2)
xlabel(‘进化代数’)
ylabel(‘均方误差’)
legend(‘最佳适应度’)
title(‘PFA的进化曲线’)
%% 优化后的参数训练ELM极限学习机模型
[IW1,B1,LW1,TF,TYPE] = elmtrain(inputn,outputn,hiddennum_best,bestX ); %IW1 B1 LW1为优化后的ELM求得的训练参数
hiddennum_best
%% 作图
figure
plot(output_test,‘b-.o’,‘linewidth’,2)
hold on
plot(test_simu0,‘g-s’,‘linewidth’,2)
hold on
plot(test_simu1,‘r-p’,‘linewidth’,2)
legend(‘真实值’,‘ELM预测值’,‘PFA-ELM预测值’)
xlabel(‘测试样本编号’)
ylabel(‘指标值’)
title(‘优化前后的ELM模型预测值和真实值对比图’)
figure
plot(error0,‘b-s’,‘markerfacecolor’,‘g’)
hold on
plot(error1,‘r-p’,‘markerfacecolor’,‘g’)
legend(‘ELM预测误差’,‘PFA-ELM预测误差’)
xlabel(‘测试样本编号’)
ylabel(‘预测偏差’)
title(‘优化前后的ELM模型预测值和真实值误差对比图’)
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]赵芮,顾幸生.基于引力搜索算法的混合零空闲置换流水车间调度[J].计算机集成制造系统. 2021,27(07)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
转载:https://blog.csdn.net/TIQCmatlab/article/details/127700185