适用平台:Matlab2023版及以上
雪消融优化算法(Snow Ablation Optimizer,SAO),于2023年6月发表在SCI、中科院1区顶级期刊《Expert Systems With Applications》上。该算法刚刚提出,目前还没有套用这个算法的文献,先到先得,抓住该创新点哦!
我们利用SAO对我们的CNN-BiGRU-SelfAttention时序和空间特征结合-融合多头自注意力机制的回归预测程序代码中的超参数进行优化。
这篇论文提出了一种新颖的元启发式算法,命名为雪消融优化(Snow Ablation Optimizer,SAO),用于数值优化和工程设计。SAO算法主要模拟雪的升华和融化行为,以在解空间中实现开发和探索之间的权衡,并避免过早的收敛。
通过使用29个典型的CEC2017无约束基准问题和22个CEC2020真实约束的优化问题进行验证,还与传统的AO、MVO、EO、AVOA、HHO、PSO-sono、SHADE、LSHADE-SPACMA,验证了SAO的优化能力。此外,为了进一步验证其优势,作者还将SAO应用于提取光伏系统的核心参数。结果表明,开发的SAO比其他先进的优化方法表现更好。
SAO算法的创新点主要体现在以下几个方面:
双重种群机制:SAO算法引入双重种群机制,将种群分为两个子群,分别负责探索和利用,以实现在解决方案空间中的平衡。
布朗运动探索策略:在探索阶段,算法采用布朗运动模拟蒸汽的不规则运动,使搜索代理具有高度分散的特征,从而探索潜在区域。
度日法利用策略:在利用阶段,SAO采用度日法模拟雪融过程,鼓励搜索代理在当前最佳解决方案附近寻找高质量解。
整体位置更新方程:SAO算法采用一种整体位置更新方程,结合探索和利用策略,以及种群动态变化,优化每个个体的位置。
总结:SAO算法相较于其他优化算法的优势在于其独特的双重种群机制、高效的探索与利用策略以及灵活的位置更新方程。这些特点使其在处理复杂优化问题时表现出更好的平衡能力、搜索效率和适应性,特别是在多峰值和高维问题上。此外,SAO算法的物理背景和数学原理为解决实际问题提供了新的视角。
CNN-BiGRU-SelfAttention模型的创新性:
①结合卷积神经网络 (CNN) 和双向门控循环单元 (BiGRU):CNN 用于处理多变量时间序列的多通道输入,能够有效地捕捉输入特征之间的空间关系。BiGRU 是一种能够捕捉序列中长距离依赖关系的递归神经网络。通过双向性,BiGRU 可以同时考虑过去和未来的信息,提高了模型对时间序列动态变化的感知能力。
②引入多头自注意力机制 (Multihead Self-Attention): 多头自注意力机制使得模型能够更灵活地对不同时间步的输入信息进行加权。这有助于模型更加集中地关注对预测目标有更大影响的时间点。自注意力机制还有助于处理时间序列中长期依赖关系,提高了模型在预测时对输入序列的全局信息的感知。
优化套用:基于雪消融优化算法(SAO)、卷积神经网络(CNN)和双向门控循环单元 (BiGRU)融合多头自注意力机制的超前24步多变量时间序列回归预测算法。
功能:
多变量特征输入,单序列变量输出,输入前一天的特征,实现后一天的预测,超前24步预测。
通过BWO优化算法优化学习率、卷积核大小、神经元个数,这3个关键参数,以最小MAPE为目标函数。
提供损失、RMSE迭代变化极坐标图;网络的特征可视化图;测试对比图;适应度曲线(若首轮精度最高,则适应度曲线为水平直线)。
提供MAPE、RMSE、MAE等计算结果展示。
适用领域:风速预测、光伏功率预测、发电功率预测、碳价预测等多种应用。
数据集格式:
前一天18个气象特征,采样时间为24小时,输出为第二天的24小时的功率出力,也就是18×24输入,1×24输出,一共有75个这样的样本。
预测值与实际值对比结果:
训练特征可视化:
训练误差曲线的极坐标形式(误差由内到外越来越接近0):
适应度曲线:
部分核心代码:
完整代码:https://mbd.pub/o/bread/ZZeckpxw
function [R,tsmvalue,net, info] = objectiveFunction(x)
%% 导入特征数据、当天的风速数据
data = xlsread('特征序列及实际值.xlsx');
Features = data(1:18,:); %% 特征输入 :75天,每天24小时,每小时一个采样点,共计75*24=1800小时,18个特征数据
Wind_data = data(19,:); %% 实际值输出:75天,每天24小时,每小时一个采样点,共计75*24=1800小时的风速数据
%% 数据平铺为4-D
LP_Features = double(reshape(Features,18,24,1,75)); %% 特征数据格式为18*24*1*75,分别对应18特征24小时,75天
LP_WindData = double(reshape(Wind_data,24,1,1,75)); %% 实际数据格式为24*1*1*75 ,分别对应24小时,75天
%% 格式转换为cell
NumDays = 75; %% 数据总天数为 75天
for i=1:NumDays
FeaturesData{1,i} = LP_Features(:,:,1,i);
end
for i=1:NumDays
RealData{1,i} = LP_WindData(:,:,1,i);
end
%% 划分数据
XTrain = FeaturesData(:,1:73); %% 训练集输入为 1-73 天的特征
YTrain = RealData(:,2:74); %% 训练集输出为 2-74天 的实际值
XTest = cell2mat(FeaturesData(: , 74)); %% 测试集输入第 74 天的特征
Ytest = cell2mat(RealData(: , 75)); %% 测试集输出为第 75天 的实际值
%% 将优化目标参数传进来的值 转换为需要的超参数
learning_rate = x(1); %% 学习率
KerlSize = round(x(2)); %% 卷积核大小
NumNeurons = round(x(3)); %% 神经元个数
%% 网络搭建
lgraph = layerGraph();
% 添加层分支
% 将网络分支添加到层次图中。每个分支均为一个线性层组。
tempLayers = sequenceInputLayer([18 24 1],"Name","sequence");
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
convolution2dLayer(KerlSize,32,"Name","conv","Padding","same")
batchNormalizationLayer("Name","batchnorm")
reluLayer("Name","relu")
maxPooling2dLayer([3 3],"Name","maxpool","Padding","same")
flattenLayer("Name","flatten_1")
fullyConnectedLayer(25,"Name","fc_1")];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = flattenLayer("Name","flatten");
lgraph = addLayers(lgraph,tempLayers);
tempLayers = gruLayer(NumNeurons,"Name","gru1");
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
FlipLayer("flip3")
gruLayer(NumNeurons,"Name","gru2")];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
concatenationLayer(1,3,"Name","concat")
selfAttentionLayer(1,50,"Name","selfattention")
fullyConnectedLayer(24,"Name","fc")
regressionLayer("Name","regressionoutput")];
lgraph = addLayers(lgraph,tempLayers);
% 清理辅助变量
clear tempLayers;
% 连接层分支
% 连接网络的所有分支以创建网络图。
lgraph = connectLayers(lgraph,"sequence","conv");
lgraph = connectLayers(lgraph,"sequence","flatten");
lgraph = connectLayers(lgraph,"flatten","gru1");
lgraph = connectLayers(lgraph,"flatten","flip3");
lgraph = connectLayers(lgraph,"gru1","concat/in1");
lgraph = connectLayers(lgraph,"gru2","concat/in2");
lgraph = connectLayers(lgraph,"fc_1","concat/in3");
%% 设置训练参数
options = trainingOptions('adam', ... % adam 梯度下降算法
'MaxEpochs',300, ... % 最大训练次数 300
'GradientThreshold',1,... % 渐变的正阈值 1
'ExecutionEnvironment','cpu',... % 网络的执行环境 cpu
'InitialLearnRate',learning_rate,...% 初始学习率 0.01
'LearnRateSchedule','none',... % 训练期间降低整体学习率的方法 不降低
'Shuffle','every-epoch',... % 每次训练打乱数据集
'SequenceLength',24,... % 序列长度 24
'MiniBatchSize',20,... % 训练批次大小 每次训练样本个数20
'Verbose',true); % 有关训练进度的信息不打印到命令窗口中
%% 训练网络
[net,info] = trainNetwork(XTrain,YTrain, lgraph, options);
部分图片来源于网络,侵权联系删除!
欢迎感兴趣的小伙伴关注,小编会继续推送更有质量的学习资料、文章和程序代码!