适用平台:Matlab2023版及以上
凌日优化算法(Transit Search Optimization Algorithm,TSOA)是2022年8月提出的一种新颖的元启发式算法,当一颗行星经过其恒星前方时,会导致恒星的亮度微弱地下降,这被称为凌日现象。
该算法基于著名的系外行星探索方法,即凌日搜索(TS)。在凌日算法中,通过研究在一定间隔内从恒星接收到的光,检查亮度的变化,如果观察到接收到的光量减少,则表明行星从恒星锋面经过。创新性较高。该算法提出时间很短,目前还没有套用这个算法的文献,先到先得,抓住该创新点哦!
TSOA算法的优化过程包括以下几个阶段:
星系阶段:选择搜索空间内的随机点作为星系中心,确定可居住区域,选择有最佳生存潜力的区域。
凌日阶段:重新测量从星体接收到的光线量,检测光线信号是否减少以确定是否有行星通过。
行星阶段:如果检测到凌日,确定行星的初始位置,并更新行星位置。
邻居阶段:如果未检测到凌日,分析当前星体附近可能存在的行星。
开发阶段:分析行星的特性和条件,以评估其作为生命宿主的潜力。
每个阶段的数学细节涉及复杂的方程和概率计算,模拟了在天文观测中发现和评估行星的过程。该算法的数学创新主要在于它将天文物理学中的凌日法原理和信噪比概念引入到优化问题的求解中,这一独特方法在多个基准问题上显示出了优越的性能。
优化套用:我们利用TSOA对我们的TCN-SelfAttention扩张因果时间卷积融合多头自注意力机制的回归预测程序代码中的超参数进行优化;构成TSOA-TCN-Attention预测模型。
TCN-Multihead SelfAttention模型的创新性:
因果膨胀卷积(TCN的核心特性):TCN通过因果膨胀卷积解决了传统卷积神经网络在处理时间序列数据时的局限性。因果膨胀卷积增大了模型的感受野,允许模型捕捉长期依赖关系,同时保持了序列数据的时序结构,确保了预测的因果关系。这种设计在提高预测准确度的同时,也大大增强了模型处理长序列数据的能力。
多头自注意力机制:多头自注意力机制允许模型在不同的子空间中并行处理信息,使得模型可以同时关注序列中的不同方面和级别的信息。这种机制提高了模型对序列内部复杂动态的理解和捕捉能力,尤其适用于那些特征间相互作用复杂的预测任务。
结合TCN和自注意力的创新框架:将TCN的因果膨胀卷积与多头自注意力机制相结合,模型既利用了TCN在处理时间依赖方面的优势,又利用了自注意力机制的前后时序捕捉能力。这种结合在时间序列预测中尤为有效,能够在保持时间序列结构的同时,更准确地捕捉和利用序列中的长期和复杂依赖关系。
功能:
多变量特征输入,单序列变量输出,输入前一天的特征,实现后一天的预测,超前24步预测。
通过TSOA优化算法优化学习率、卷积核大小、神经元个数,这3个关键参数,以最小MAPE为目标函数。
提供损失、RMSE迭代变化极坐标图;测试对比图;适应度曲线(若首轮精度最高,则适应度曲线为水平直线)。
提供MAPE、RMSE、MAE等计算结果展示。
适用领域:
风速预测、光伏功率预测、发电功率预测、碳价预测等多种应用。
数据集格式:
前一天18个气象特征,采样时间为24小时,输出为第二天的24小时的功率出力,也就是18×24输入,1×24输出,一共有75个这样的样本。
预测值与实际值对比结果:
训练误差曲线的极坐标形式(误差由内到外越来越接近0):
适应度曲线:
部分核心代码:
%% 银河系阶段
% 银河系中心的初始位置
Galaxy_Center.Location = unifrnd(Vmin,Vmax,1,nV);
Galaxy_Center.Cost = ObjectiveFunction(Galaxy_Center.Location);
% 银河系居住区
for l = 1:(ns*SN)
zone = randi(2);
if zone ==1
difference = rand().*(Galaxy_Center.Location)-(unifrnd(Vmin,Vmax,1,nV));
else
difference = rand().*(Galaxy_Center.Location)+(unifrnd(Vmin,Vmax,1,nV));
end
Noise = ((rand(1,nV)).^3).*(unifrnd(Vmin,Vmax,1,nV));
region(l).Location = Galaxy_Center.Location + difference - Noise;
region(l).Location = max(region(l).Location, Vmin);
region(l).Location = min(region(l).Location, Vmax);
[region(l).Cost,region(l).Value,region(l).net,region(l).info] = ObjectiveFunction(region(l).Location);
end
% 从银河系的银河栖息区挑选恒星的百分比
[Sort,index]=sort([region.Cost]);
for i = 1:ns
selected_regions(i) = region(index(1,i));
for k = 1:SN
zone = randi(2);
if zone ==1
difference = rand().*(selected_regions(i).Location)-rand().*(unifrnd(Vmin,Vmax,1,nV));
else
difference = rand().*(selected_regions(i).Location)+rand().*(unifrnd(Vmin,Vmax,1,nV));
end
Noise = ((rand(1,nV)).^3).*(unifrnd(Vmin,Vmax,1,nV));
new.Location = selected_regions(i).Location + difference - Noise;
new.Location = max(new.Location, Vmin);
new.Location = min(new.Location, Vmax);
[new.Cost,new.Value,new.net,new.info] = ObjectiveFunction(new.Location);
if new.Cost < Stars(i).Cost
Stars(i) = new;
end
end
end
% 最佳行星的初始位置(起点:其恒星)
Best_Planets = Stars;
% 最佳星球的格式
[Sort,index]=sort([Best_Planets.Cost]);
Best_Planet = Best_Planets(index(1,1));
% 望远镜位置
Telescope.Location = unifrnd(Vmin,Vmax,1,nV);
%恒星光度的测定
for i = 1:ns
Stars_sorted(i,1) = Stars(i).Cost;
end
Stars_sorted = sort (Stars_sorted);
for i = 1:ns
for ii = 1:ns
if Stars(i).Cost == Stars_sorted(ii,1)
Stars_Ranks(i,1) = Ranks(1,ii);
Star_RanksNormal(i,1) = (Stars_Ranks(i,1))./ns;
end
end
Distance(i,1) = sum((Stars(i).Location-Telescope.Location).^2).^0.5;
Luminosity(i,1) = Star_RanksNormal(i,1)/((Distance(i,1))^2);
end
Luminosity_new = Luminosity;
Stars2 = Stars;
部分图片来源于网络,侵权联系删除!
欢迎感兴趣的小伙伴关注,小编会继续推送更有质量的学习资料、文章和程序代码!