Matlab群体智能优化算法之海象优化算法(WO)

文章目录

    • 一、灵感来源
    • 二、算法的初始化
    • 三、GTO的数学模型
      • Phase1:危险信号和安全信号
      • Phase2:迁移(探索)
      • Phase3:繁殖(开发)
    • 四、流程图
    • 五、伪代码
    • 六、算法复杂度
    • 七、WO搜索示意图
    • 八、实验分析和结果
      • 23个常见的基础测试函数
      • CEC2021测试函数
      • 实际工程优化问题

Walrus optimizer: A novel nature-inspired metaheuristic algorithm

Walrus optimizer: A novel nature-inspired metaheuristic algorithm

摘要:该文献Introduction介绍了为什么做这个元启发式算法的原因;Related works列举了2021-2023年一些算法。我将按照自己理解完全复现这篇文章,包括理论介绍、完整的实验部分。个人能力有限,如有不足,还请见谅。参考文献:Han M, Du Z, Yuen K, et al. Walrus Optimizer: A novel nature-inspired metaheuristic algorithm[J]. Expert Systems with Applications, 2023: 122413.

注:仅记录学习,如有侵权,联系删除。

  • 1、所写内容只是个人理解,如有错误,还请包涵
  • 2、所用主题为slandarer提供的墨滴模板
  • 3、CSDN:勉为其难免免
  • 4、微信公众号:飘散在人间的一缕青丝

一、灵感来源

  海象是海洋中除鲸鱼外最大的哺乳动物。海象主要生活在北极或附近的温带水域,海象是群居动物,过着两栖生活。海象群的数量从几十到几百到几千不等。它的身体是圆柱形的,粗壮而肥胖,头部扁平,枪口末端钝。在上唇周围有大约400根长而硬的胡须,带有血管和神经,导致触觉敏锐。海象最独特的特征是那对白色、发育良好的上犬齿,它们在其一生中不断生长,形成象牙。象牙可用于自卫,在泥沙中挖掘蛤蜊、虾和螃蟹等食物,或在冰上攀爬时支撑身体。

  海象庞大的身体看起来很笨重,但在水中很灵活。在众多的海洋动物中,海象是最好的潜水员。他们可以在水中潜水 20 分钟,深度为 500 m。海象潜入海底后可以在水下停留长达 2 小时,一旦需要新鲜空气,它们可以在 3 分钟内浮出水面。

  海象具有很强的社区意识,如下所示:

  (1)、当繁殖季节开始时,海象会在海滩上建立自己的领地。最好的位置被最强壮的男性占据。领土的面积根据男性占据的女性数量而变化。

  (2)、海象习惯于生活在阳光无法到达的海洋深水区。像蝙蝠和海豚一样,海象缺乏独特的视力;它们依靠合理的定位进行觅食,并通过与同龄人交流来共享食物信息。

  (3)、海象有很强的社交习惯,当它们在水中遇到虎鲸时,它们会采取集体防御策略来保护自己并帮助受伤的虎鲸。长期的生存斗争经验使海象无法放松警惕。在这一点上,两只海象充当警卫。一旦他们的同类受伤,他们就会去帮忙。

  受海象迁徙、繁殖、栖息和觅食行为的启发(如图1所示),我们首次提出了一种新的元启发式算法WO算法。这里需要澄清两个假设:

  (1)、海象种群通过危险和安全信号来判断种群行为。

  (2)、海象种群的行为和角色划分在海象算法中建模。具体来说,海象算法假设雄性、雌性和幼年海象之间的社会结构和相互作用。

海象行为和种群划分

  创新之处在于,海象群中的“义警”是影响象群方向的决定性因素。“治安队员”发出的[危险信号]及[安全信号],在[行动计划]的执行过程中起着关键作用。在WO中,“危险信号”用于确定WO是执行勘探阶段还是开发阶段。当“危险信号”满足一定条件时,海象群迁移到解空间内的新域,这是算法早期阶段的探索阶段。相反,海象群繁殖,这是算法后期的开发阶段。“安全信号”在开发阶段起着关键作用,它影响着海象是选择栖息行为还是觅食。其中,雄性海象、雌性海象和幼年海象在栖息行为中相互作用,使种群朝着有利于生存的方向移动;觅食行为包括典型的聚集和逃跑现象,这些现象由“危险信号”控制。在有序的警务环境中,海象群可以避免被捕食者捕获或死亡(落入局部最佳状态),并实现种群增长(寻找全局最佳状态)。

二、算法的初始化

  X代表WO种群矩阵, X i = ( x i , 1 , x i , 2 , . . . , x i , m ) X_{i}=(x_{i,1},x_{i,2},...,x_{i,m}) Xi=(xi,1,xi,2,...,xi,m)是WO的第i个成员(候选解)。
  F代表适应度函数值。
X = [ X 1 ⋮ X i ⋮ X N ] N × m = [ x 1 , 1 ⋯ x 1 , j ⋯ x 1 , m ⋮ ⋱ ⋮ ⋮ x i , 1 ⋯ x i , j ⋯ x i , m ⋮ ⋮ ⋱ ⋮ x N , 1 ⋯ x N , j ⋯ x N , m ] N × m X=\left[\begin{array}{c} X_{1} \\ \vdots \\ X_{i} \\ \vdots \\ X_{N} \end{array}\right]_{N \times m}=\left[\begin{array}{ccccc} x_{1,1} & \cdots & x_{1, j} & \cdots & x_{1, m} \\ \vdots & \ddots & \vdots & & \vdots \\ x_{i, 1} & \cdots & x_{i, j} & \cdots & x_{i, m} \\ \vdots & & \vdots & \ddots & \vdots \\ x_{N, 1} & \cdots & x_{N, j} & \cdots & x_{N, m} \end{array}\right]_{N \times m} X= X1XiXN N×m= x1,1xi,1xN,1x1,jxi,jxN,jx1,mxi,mxN,m N×m
x i , j = l b j +  rand  ⋅ ( u b j − l b j ) , i = 1 , 2 , … , N , j = 1 , 2 , … , m x_{i, j}=lb_{j}+\text { rand } \cdot\left(ub_{j}-lb_{j}\right), i=1,2, \ldots, N, j=1,2, \ldots, m xi,j=lbj+ rand (ubjlbj),i=1,2,,N,j=1,2,,m
F = [ F 1 ⋮ F i ⋮ F N ] N × 1 = [ F ( X 1 ) ⋮ F ( X i ) ⋮ F ( X N ) ] N × 1 F=\left[\begin{array}{c} F_{1} \\ \vdots \\ F_{i} \\ \vdots \\ F_{N} \end{array}\right]_{N \times 1}=\left[\begin{array}{c} F\left(X_{1}\right) \\ \vdots \\ F\left(X_{i}\right) \\ \vdots \\ F\left(X_{N}\right) \end{array}\right]_{N \times 1} F= F1FiFN N×1= F(X1)F(Xi)F(XN) N×1

  式中: x i , j x_{i, j} xi,j代表第i个成员的第j个变量的值;N是种群大小;m是维度;rand代表[0,1]之间的随机数; l b j lb_{ j} lbj代表下限; u b j ub_{ j} ubj代表上限。

三、GTO的数学模型

  海象种群分为成年和幼体,分别占种群的90%和10%。在成年海象中,雄性与雌性的比例为1:1。

Phase1:危险信号和安全信号

  海象在觅食和栖息时都非常警惕。会有1至2只海象作为警卫在周围巡逻,一旦发现意外情况,会立即发出危险信号。其中危险信号和安全信号定义如下:

 Dangersignal  = A ∗ R α = 1 − t / T A = 2 × α R = 2 × r 1 − 1 \begin{aligned} & \text { Dangersignal }=A^* R \\ & \alpha=1-t / T \\ & A=2 \times \alpha \\ & R=2 \times r_1-1 \end{aligned}  Dangersignal =ARα=1t/TA=2×αR=2×r11

  其中 A A A R R R是危险因子, α \alpha α随着迭代次数的增加,从1减小到0。  Levy  (  Dim  ) \text { Levy }(\text { Dim })  Levy ( Dim )Levy飞行 T T T是最大迭代次数。

  WO中危险信号对应的安全信号定义如下:
 Safetysignal  = r 2 \begin{aligned} & \text { Safetysignal }=r_2 \\ \end{aligned}  Safetysignal =r2
  其中 r 1 r_1 r1 r 2 r_2 r2是在[0,1]内的随机数。

Phase2:迁移(探索)

  当危险因子过高时,海象群会迁移到更适合种群生存的地区。在此阶段,海象位置更新如下:

X i , j t + 1 = X i , j t +  Migrationstep  X_{i, j}^{t+1}=X_{i, j}^t+\text { Migrationstep } Xi,jt+1=Xi,jt+ Migrationstep 
 Migrationstep  = ( X m t − X n t ) ∙ β ∙ r 3 2 \text { Migrationstep } =\left(X_m^t-X_n^t\right) \bullet \beta \bullet r_3{ }^2  Migrationstep =(XmtXnt)βr32
β = 1 − 1 1 + exp ⁡ ( − t − T 2 T × 10 ) \beta=1-\frac{1}{1+\exp \left(-\frac{t-\frac{T}{2}}{T} \times 10\right)} β=11+exp(Tt2T×10)1
  其中 X i , j t + 1 X_{i, j}^{t+1} Xi,jt+1是i个个体在第j个维度上的更新位置, X i , j t X_{i, j}^{t} Xi,jt是当前位置,Migration_step是海象运动的步长,从种群中随机选择两个警惕者,其位置对应于 X m t X_m^t Xmt X m n X_m^n Xmn, β \beta β是迁移步长控制因子,它随着迭代变化为平滑曲线, r 3 r_3 r3是在[0,1]内的随机数。

Phase3:繁殖(开发)

  与迁徙相反,当风险因素较低时,海象群倾向于在洋流中繁殖。在繁殖过程中,主要有两种行为,陆上栖息和水下觅食。数学模型如下。

  (1)栖息行为

  雄性、雌性和幼年海象是我们对种群成员的分类。他们有不同的方式来更新他们的立场。

  第 1 步:雄性海象的重新分布

  采用Halton序列分布进行雄性海象位置更新,可以扩大种群的搜索分布

  第 2 步:更新雌性海象的位置

  雌性海象受到雄性海象  Male  i , j t \text { Male }_{i, j}^t  Male i,jt和领头海象 X best  t X_{\text {best }}^t Xbest t的影响。随着迭代过程的进行,雌性海象逐渐减少对配偶的影响,而更多地受到领导者的影响。

 Female  i , j t + 1 =  Female  i , j t + α ∙ (  Male  i , j t −  Female  i , j t ) + ( 1 − α ) ∙ ( X best  t −  Female  i , j t ) \begin{aligned} \text { Female }_{i, j}^{t+1}= & \text { Female }_{i, j}^t+\alpha \bullet\left(\text { Male }_{i, j}^t-\text { Female }_{i, j}^t\right)+(1-\alpha) \\ & \bullet\left(X_{\text {best }}^t-\text { Female }_{i, j}^t\right) \end{aligned}  Female i,jt+1= Female i,jt+α( Male i,jt Female i,jt)+(1α)(Xbest t Female i,jt)

  第 3 步:更新幼年海象的位置

  种群边缘的幼年海象经常成为虎鲸和北极熊的目标。因此,幼年海象需要更新其当前位置以避免捕食。

 Juvenile  i , j t + 1 = ( O −  Juvenile  i , j t ) ∙ P O = X best  t +  Juvenile  i , j t ∙ L F \begin{aligned} & \text { Juvenile }_{i, j}^{t+1}=\left(O-\text { Juvenile }_{i, j}^t\right) \bullet P \\ & O=X_{\text {best }}^t+\text { Juvenile }_{i, j}^t \bullet L F \end{aligned}  Juvenile i,jt+1=(O Juvenile i,jt)PO=Xbest t+ Juvenile i,jtLF

  P是幼年海象的遇险系数,是[0,1]的随机数,O是参考安全位置,LF是基于 L ́evy分布的随机数向量,表示Levy运动。

Levy ⁡ ( a ) = 0.05 × x ∣ y ∣ 1 a σ x = [ Γ ( 1 + α ) sin ⁡ ( π α 2 ) Γ ( 1 + α 2 ) α 2 ( α − 1 ) 2 ] 1 α , σ y = 1 , α = 1.5 \begin{gathered} \operatorname{Levy}(a)=0.05 \times \frac{x}{|y|^{\frac{1}{a}}} \\ \sigma_x=\left[\frac{\Gamma(1+\alpha) \sin \left(\frac{\pi \alpha}{2}\right)}{\Gamma\left(\frac{1+\alpha}{2}\right) \alpha 2^{\frac{(\alpha-1)}{2}}}\right]^{\frac{1}{\alpha}}, \sigma_y=1, \alpha=1.5 \end{gathered} Levy(a)=0.05×ya1xσx=[Γ(21+α)α22(α1)Γ(1+α)sin(2πα)]α1,σy=1,α=1.5

  其中,其中x和y是两个正态分布变量, x   N ( 0 , σ x 2 ) x \mathrm{~N}\left(0, \sigma_x^2\right) x N(0,σx2) y   N ( 0 , σ x 2 ) y \mathrm{~N}\left(0, \sigma_x^2\right) y N(0,σx2) σ x \sigma_x σx σ y \sigma_y σy是标准差, Γ ( x ) = ( x + 1 ) ! \Gamma(x)=(x+1) ! Γ(x)=(x+1)!

  (2)觅食行为

  水下觅食包括逃跑和采集行为

  a) 逃跑行为

  海象在水下觅食时也会受到天敌的攻击,它们会根据同伴发出的危险信号逃离当前的活动区域。这种行为发生在WO的后期迭代中,对种群的一定程度的扰动有助于海象进行全局探索。
在这里插入图片描述

  其中, X 1 X_1 X1 X 2 X_2 X2是影响海象聚集行为的两个权重, X second  t X_{\text {second }}^t Xsecond t是第二只海象在当前迭代中的位置, ∣ X second  t − X i , j t ∣ \left|X_{\text {second }}^t-X_{i, j}^t\right| Xsecond tXi,jt 表示当前海象与第二只海象之间的距离,a和b为聚集系数, r 5 r_5 r5为随机数,位于[0,1], θ \theta θ取的值范围为0到π。

四、流程图

  在WO中,危险信号用于确定WO是执行勘探阶段还是开发阶段。当危险信号绝对值不小于1时,海象群迁移到解空间内的新域,即算法早期的探索阶段;相反,海象群繁殖,这是算法后期的开发阶段。安全信号在开发阶段起着关键作用,它影响着个体海象是选择栖息行为还是觅食行为。其中,觅食行为包括聚集和逃跑两种典型现象,它们受危险信号的控制。

WO流程图

五、伪代码

WO伪代码

六、算法复杂度

  在求解优化问题时,计算复杂度对于评估算法的效率非常有用,它取决于三个主要过程:初始化、适应度评估和解决方案的更新。初始化过程和更新机制的计算复杂度分别为O(N)和O(N × T)+ O(N × T × D),其中N为种群大小,T为最大迭代次数,D为给定问题的维数。因此,WO的计算复杂度为O(N ×( T +T × D +1))。算法在运行过程中临时占用的内存空间量可以用空间复杂度来衡量。WO算法的空间复杂度是在其初始化过程中考虑的任何时间使用的最大空间量。因此,WO算法的空间复杂度为 O(N × Dim)。

七、WO搜索示意图

  为了可视化所提出的算法的行为,本节显示了海象群行为的模拟。下图描绘了30个海象在三维空间中寻找单峰和多峰函数最优解的群体行为。红点表示全局最佳位置,其余为海象位置。当t=1时,海象在解空间中随机生成,散射范围较宽。随着迭代的继续,所有海象的搜索范围逐渐缩小。最后,所有海象都汇聚到红点上。单模态函数的搜索结果可以表明WO具有较好的开发能力,多模态函数的搜索结果可以反映WO较强的探索能力。(注:与文献中稍有不同的是我加了一个原函数图像,Sphere就是常见的测试函数F1,Rastrigin函数是F9,直接修改序号即可)

八、实验分析和结果

  写了很久笔记了,也没有写完整的实验。在这篇中,完整的复现一下。包括多次独立运行、对数据的统计、导入到excel、出图,锻炼一下,顺便缝缝补补自己以前的烂代码。整体的思路就按照这篇论文的来写吧。后续看到好看的图再补充吧。

  为了适当验证WO算法的性能,原作者进行了大量实验。

23个常见的基础测试函数

  1、定性分析

  使用几种单峰和多模态标准准则函数对WO的定性结果进行评估,并使用WO的4个不同标准对结果进行评估,包括搜索历史、第一智能体的轨迹、平均拟合度和收敛曲线。搜索历史图显示了海象个体在迭代期间访问的所有位置;轨迹图监控第一只海象在迭代过程中的变化情况;平均适应度图显示了海象种群的整体变化;收敛行为图记录了总体每次迭代后的最佳解。

  从23个基准测试中选出10个典型函数进行分析。从搜索历史可以看出,WO在处理不同情况时,包括促进多样化、探索解决方案空间的有利区域、开发最优位置邻域等,都呈现出相似的模式。(一旦涉及了位置绘图可视化,要么每个测试问题的维度设置为2,要么就是画图的时候选择前两个位置。在此我选择第二种方法)

  种群大小设置为30,迭代次数设置为400。从23个里面选择了十个来进行分析。

%% 定性分析23个基准测试函数
clear
clc
close all
populationSize = 30;
Max_iteration = 400;
selet_fcn = [1,3,7,8,10,12,14,15,18,21];
for i=1:length(selet_fcn)-5
    fn = 1;
    Function_name=strcat('F',num2str(selet_fcn(i)));
    [lb,ub,dim,fobj]=Get_Functions_details(Function_name);
    % dim = 2;
    % rng('shuffle');%根据当前时间初始化生成器,在每次调用 rng 后会产生一个不同的随机数序列。
    [Best_score,Best_pos,PO_cg_curve,All_Pos,fitness1st,fitnessallmean]=WO3(populationSize,Max_iteration,lb,ub,dim,fobj);
    %% 绘制定性分析图
    figure('NumberTitle','off','Color','w','Name','函数图像','Units','centimeters','Position',[4,15,40,7])
    tiledlayout(1,5);
    nexttile
    %绘制原图像
    fun_plot(Function_name)
    nexttile
    %搜索历史图
    fun_plot(Function_name);
    h = gca;
    h.Children(2).Visible = "off";
    hold on
    view(0,90)
    for i = 1:length(All_Pos)
        temp = All_Pos{i};
        scatter(temp(:,1),temp(:,2),12,'k')
    end
    title('Search history')
    box on
    grid on
    nexttile
    plot(fitness1st,'Color',[6, 253, 244]./255,'LineWidth',1.5)
    title('Trajectory in 1st agents')
    box on
    grid on
    nexttile
    plot(fitnessallmean,'Color',[28, 29, 252]./255,'LineWidth',1.5)
    title('average fitness of all agents')
    box on
    grid on
    nexttile
    semilogx(PO_cg_curve,'Color',[245, 42, 237]./255,'LineWidth',1.5)
    title('Convergence curve')
    box on
    grid on
end


  关于图搜索历史和第一智能体的迹和原文不一样,理解不到位。暂时先这样放着,待后续理解更透彻了再修改这个图。其实这个每跑一次产生的图都不一样,感兴趣的可以多跑几次试试。

  2、定量分析

  这部分仿真时,文中未明确说明种群大小和迭代次数,在此我设置种群大小为30,迭代次数为100。文中所提及的ABC、AOS、ChoA、FOA、SHO算法我暂时没有,在此我换四个其他算法,AEO、ARO、CHIO、FDA、SMA。为了节约时间,我独立运行了30次,并调用excel的com服务器将结果写在了excel表中。在此列出前四个函数的表格。对每一行的最小值进行的字体加粗,颜色设置为红色的处理。


%% 存储多个算法对比数据 平均值 最优值 最差值 中位数 标准差
clc
clear
close all
%% 加载实验数据
load 20231107_30_100_30_16_PM.mat
file_path=[pwd,'\AlgorithmComparison.xlsx'];%设置当前路径
try
    excelApp=actxGetRunningServer('Excel.Application');%如果Excel 服务器已经打开,返回其句柄
catch
    excelApp=actxserver('Excel.Application');%如果Excel服务器没有打开,则创建一个Excel服务器,并返回句柄
end
excelApp.Visible = true; % 使 Excel 可见
%% 添加一个新的工作簿
%如果存在test.xlsx文件,则打开文件,若不存在则创建一个,然后保存
if exist(file_path,'file')
    workbook=excelApp.Workbooks.Open(file_path);%打开 注意这里打开的必须是绝对路径
else
    workbook=excelApp.Workbooks.Add;%创建 创建工作簿的时候默认是1 在excel选项中设置
    workbook.SaveAs(file_path)%保存   
end

%% 使用默认的工作表
sheet = workbook.Sheets.Item(1);
%% 设置工作表的名称
sheet.Name = 'Algorithm Comparison';
%% 合并单元格并设置 "Comparative algorithms" 标题
% 假设总共有12个算法名称加上'Function'和'target'列,因此共14列
titleRange = sheet.Range('A1:R1'); % 直接指定从A1到N1的范围
titleRange.MergeCells = true;
titleRange.Value = 'Comparative algorithms';
titleRange.HorizontalAlignment = -4108;%使用 xlCenter 的数值 
titleRange.Font.Bold = true;
titleRange.RowHeight = 50;
titleRange.Font.Size = 24;
% 填充算法名称 从加载的数据中读取
for i = 1:length(algorithms)
    temp = strsplit(algorithms{i},'.');
    algorithms(i)=temp(1);
end
% algorithms = {'AEO', 'ACO', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA'};
% 从第三列开始填充算法名称
for i = 1:length(algorithms)
    % 使用Excel列字母可以使得引用更加清晰
    colLetter = char('B' + i); % 因为算法从第三列开始,所以是 'B' + i
    rangeStr = sprintf('%s2', colLetter); % 生成范围字符串,如 'C2', 'D2', 等
    sheet.Range(rangeStr).Value = algorithms{i};
end
%% 假设有以下函数和指标
functions = {'F1', 'F2', 'F3', 'F4'};
metrics = {'Best', 'Worst', 'Avg', 'Std', 'Median'};
% 为函数名、指标和随机数据填充表格
% 为函数名、指标和随机数据填充表格
for i = 1:length(functions)
    % 合并相同函数名的单元格
    startRow = (i-1)*length(metrics)+3; % 函数开始的行号
    endRow = startRow + length(metrics) - 1; % 函数结束的行号
    mergeRangeStr = sprintf('A%d:A%d', startRow, endRow);
    mergeRange = sheet.Range(mergeRangeStr);
    mergeRange.MergeCells = true;
    mergeRange.Value = functions{i};
    mergeRange.VerticalAlignment = -4108;   % 垂直居中
    mergeRange.HorizontalAlignment = -4108; % 水平居中
    
    % 为每个指标生成并填充随机数据
    for j = 1:length(metrics)
        metricCell = sprintf('B%d', (i-1)*length(metrics)+j+2);
        sheet.Range(metricCell).Value = metrics{j};
        
        % 为每个指标的算法生成并填充随机数据
        % for k = 1:length(algorithms)
        %     dataCell = sprintf('%s%d', char('B' + k), (i-1)*length(metrics)+j+2);
        %     sheet.Range(dataCell).Value = rand();
        % end
    end
end
sheet.Range('A2').Value = 'Function';
sheet.Range('B2').Value = 'Target';
% 调整列宽
% 调整第一列和第二列的列宽
sheet.Range('A:A').ColumnWidth = 15;
sheet.Range('B:B').ColumnWidth = 15;

% 假设算法从第三列开始,一共有12个算法
% 调整算法列的列宽
for i = 3:(2+length(algorithms))
    colLetter = char('A' + i - 1); % 将列号转换为列字母
    sheet.Range([colLetter ':' colLetter]).ColumnWidth = 10;
end
%% 获取用过的范围(整个数据区域)
usedRange = sheet.UsedRange;
% 你现在可以对这个范围进行操作,比如设置单元格的格式
% 设置整个区域的单元格内容居中对齐
usedRange.HorizontalAlignment = -4108; % 水平居中
usedRange.VerticalAlignment = -4108; % 垂直居中
%% 设置字体颜色
% 找到最小值的位置
minall = min(comparealg,[],2);
[minindexX,minindexY]=find(comparealg==minall);

minLocations = [minindexX,minindexY]; % 最小值位置矩阵

% 转换最小值位置到 Excel 单元格地址并设置为红色
for i = 1:size(minLocations, 1)
    % 计算 Excel 单元格地址
    rowIndex = minLocations(i, 1) + 2; % +2 是因为数据从 C3 开始
    colIndex = minLocations(i, 2) + 2; % +2 是因为数据从第三列开始
    cellAddress = sprintf('%s%d', char('A' + colIndex-1), rowIndex);
    sheet.Range(cellAddress).Font.Color = 255; % 设置字体颜色为红色
    sheet.Range(cellAddress).Font.Bold = true; % 设置字体为加粗
end
% 假设每个函数的数据占据 5 行
numRowsPerFunction = 5;
numFunctions = 4; % F1, F2, F3, F4
startCol = 'A'; % 数据开始的列
endCol = 'R'; % 数据结束的列
startRow = 3; % 数据开始的行

% 加粗每个函数数据行的底部边框
for i = 1:numFunctions
    % 计算函数数据块的最后一行
    lastRow = startRow + i * numRowsPerFunction - 1;
    % 构建范围字符串
    rangeStr = sprintf('%s%d:%s%d', startCol, lastRow, endCol, lastRow);
    % 获取范围
    range = sheet.Range(rangeStr);
    % 设置底部边框样式为加粗
    range.Borders.Item('xlEdgeBottom').LineStyle = 1; % Continuous line
    range.Borders.Item('xlEdgeBottom').Weight = 4; % Thick weight
end
%% 存数据指定 Excel 范围
range = sheet.Range('C3:R22');
% 将数据一次性写入指定范围
range.Value = comparealg;
%% 保存工作簿 指定为绝对路径
workbook.Save();

%% 清理
workbook.Close();
excelApp.Quit();
excelApp.release;

两个变量

实验结果

  3、收敛性分析

  就是一个常规的迭代曲线图。文献中这么排版了,在此列出前四个函数。

%% 绘制迭代曲线
clear;clc;close all
addpath Algorithms\
addpath Algorithms\
cd Algorithms\
s = what;
algorithms = s.m;
cd D:\智能优化算法\WO\定量分析
SearchAgents_no = 30;
Max_iteration = 100;
figure('NumberTitle','off', ...
    'Color','w', ...
    'Name','迭代曲线对比图', ...
    'Units','centimeters', ...
    'Position',[4,15,40,7])
tiledlayout(1,4)
for j=1:4
    fn = j;
    Function_name=strcat('F',num2str(fn));
    [lb,ub,dim,fobj]=Get_Functions_details(Function_name);
    [Min_AEO,~, AEO_curve] = AEO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj  );
    [Min_ARO,~, ARO_curve] = ARO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj );
    [Min_BOA,~, BOA_curve] =GWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_BWOA,~, BWOA_curve]=BWOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_CHIO,~, CHIO_curve]=CHIO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_FDA,~, FDA_curve]=FDA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_GA,~, GA_curve]=GA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_GWO,~, GWO_curve]=GWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_MFO,~, MFO_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_PSO,~, PSO_curve]=PSO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_SCSO,~, SCSO_curve]=SCSO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_SMA,~, SMA_curve]=SMA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_SOA,~, SOA_curve]=SOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_SSA,~, SSA_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_WO,~, WO_curve]=WO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    [Min_WOA,~, WOA_curve]=WOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
    nexttile
    semilogy(AEO_curve)
    hold on
    semilogy(ARO_curve);semilogy(BOA_curve);semilogy(BWOA_curve);semilogy(CHIO_curve);
    semilogy(FDA_curve);semilogy(GA_curve);semilogy(GWO_curve);semilogy(MFO_curve);
    semilogy(PSO_curve);semilogy(SCSO_curve);semilogy(SMA_curve);semilogy(SOA_curve);
    semilogy(SSA_curve);semilogy(WO_curve,'r','LineWidth',2);semilogy(WOA_curve);
    xlabel('iteration')
    ylabel('fitness')
end

% 填充算法名称 从加载的数据中读取
for i = 1:length(algorithms)
    temp = strsplit(algorithms{i},'.');
    algorithms(i)=temp(1);
end
legnedpos = gca().Position;
legend(algorithms,'Position',legnedpos+[legnedpos(3)+0.003,0,-0.1,0])

  4、稳定性分析

  画了一个箱线图。在此列出matlab代码。

%% 稳定性分析
% 绘制箱线图
clc;clear;close all
% 加载独立运行得到的数据
load 20231107_30_100_30_16_PM.mat
% 填充算法名称 从加载的数据中读取
for i = 1:length(algorithms)
    temp = strsplit(algorithms{i},'.');
    algorithms(i)=temp(1);
end
% 绘制小提琴图
for i=1:4
    F1 = resultall{i};

    figure('NumberTitle','off', ...
        'Color','w', ...
        'Name','稳定性分析', ...
        'Units','centimeters', ...
        'Position',[4,15,30,7])
    handelbox = boxchart(F1);
    box on
    set(gca,'xticklabels',algorithms, ...
        'LineWidth',2)
    xlabel('Algorithm')
    ylabel('Fitness Value')
    grid on
    handelbox.BoxFaceColor = 'w';
    handelbox.BoxEdgeColor = 'b';
    handelbox.BoxMedianLineColor = 'r';
    handelbox.LineWidth = 2;
    handelbox.MarkerColor = 'r';
    handelbox.MarkerStyle = ".";
    handelbox.MarkerSize = 15;
    title(strcat('F',num2str(i)))
end

  5、灵敏性分析

  这个分析就是来寻找算法的最佳参数设置。文中选取了最大迭代次数,种群个数以及雄性个体占比三个参数。

  原文中,图7 ( a )和( b )分别展示了F1在不同的最大迭代次数和搜索代理数下的WO收敛曲线。图7 ( c )展示了WO在F5上的收敛曲线,以及不同比例的雄性个体在群体中的分布。计算结果和可视化表明,当最大迭代次数增加时,WO收敛到最优解。此外,从图7 ( b )可以看出,当种群数量的数量增加时,迭代次数减少。图7 ( c )显示了当p从0.3到0.4时WO的相对稳定的行为。基于此分析,p的最佳值可以被建议为其最大值(即p = 0.45),其中WO的结果最好。

clear ;clc;close all
%% F5 6 12 13 14 15
populationSize = [30,50,80,100];
Max_iteration = [200,500,1000,2000];
p = [0.3,0.35,0.4,0.45];
populationSize=populationSize(4);
p = p(4);
fn=1;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
colormap = ['k','m','c','b'];
figure('Color','w')
for i=1:length(Max_iteration)
    rng('shuffle');
    [Best_score,Best_pos,WO_cg_curve]=WO(populationSize,Max_iteration(i),lb,ub,dim,fobj,p);
    semilogy(WO_cg_curve,colormap(i),'LineWidth',2)
    hold on
    
end
set(gca,'XMinorGrid','on','YMinorGrid','on', ...
    'LineWidth',1)
legend({'T=200';'T=500';'T=1000';'T=2000'})
xlabel('Iteration')
ylabel('Best score obtained so far')


T(N=100,p=0.45)

clear ;clc;close all
%% F5 6 12 13 14 15
populationSize = [30,50,80,100];
Max_iteration = [200,500,1000,2000];
p = [0.3,0.35,0.4,0.45];
Max_iteration =Max_iteration(4);
p = p(4);
fn=1;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
colormap = ['k','m','c','b'];
figure('Color','w')
for i=1:length(populationSize)
    rng('shuffle');
    [Best_score,Best_pos,WO_cg_curve]=WO(populationSize(i),Max_iteration,lb,ub,dim,fobj,p);
    semilogy(WO_cg_curve,colormap(i),'LineWidth',2)
    hold on
    
end
set(gca,'XMinorGrid','on','YMinorGrid','on', ...
    'LineWidth',1)
% legend({'T=200';'T=500';'T=1000';'T=2000'})
legend({'N=30';'N=50';'N=80';'N=100'})
% legend({'T=200';'T=500';'T=1000';'T=2000'})
xlabel('Iteration')
ylabel('Best score obtained so far')

N(T=2000,p=0.45)

clear ;clc;close all
%% F5 6 12 13 14 15
populationSize = [30,50,80,100];
Max_iteration = [200,500,1000,2000];
p = [0.3,0.35,0.4,0.45];
populationSize=populationSize(4);
Max_iteration =Max_iteration(4);
fn=5;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
colormap = ['k','m','c','b'];
figure('Color','w')
for i=1:length(p)
    rng('shuffle');
    [Best_score,Best_pos,WO_cg_curve]=WO(populationSize,Max_iteration,lb,ub,dim,fobj,p(i));
    semilogy(WO_cg_curve,colormap(i),'LineWidth',2)
    hold on
    
end
set(gca,'XMinorGrid','on','YMinorGrid','on', ...
    'LineWidth',1)
% legend({'T=200';'T=500';'T=1000';'T=2000'})
% legend({'N=30';'N=50';'N=80';'N=100'})
legend({'P=0.30';'P=0.35';'P=0.40';'P=0.45'})
xlabel('Iteration')
ylabel('Best score obtained so far')

p(T=2000,N=100)

  从上面三幅图中可以看出,T,N,P三个参数都有影响。种群个数和迭代次数的增加会导致算法时间上的增加,在做具体案例分析时,应该选择合适的迭代次数和种群个数;P值的影响不会特别大,按照原文献的介绍,我也用F5测试函数,想要达到文献的效果。是需要多次运行的,这些P值在解决具体问题的时候,个人觉得不会影响特别大。P在[0.30,0.45]之间都可以。源代码上P值默认设置的是0.4。

  6、可扩充性分析

  通过改变F1 ~ F13的维度来测试所提出的WO的可扩展性,以确定增加维度对不同测试函数计算结果的影响。测试函数的维度分别为50、100、500。文献中对其进行了大量分析,用了13个测试函数,做了三个表格,感兴趣的可以参考一下。最后对所有算法进行Friedman检验,做了一个排名,证明了所提算法的优越性。

这张图截取自原文献
  结果表明,WO排在第一位,而SCSO、SHO和WOA分别排在第二位、第三位和第四位。

CEC2021测试函数

  测试函数下载地址

  这节中,作者又换了几个算法。做了定量分析,收敛性分析和稳定性分析。我不再重复绘图了。在这简单说一下CEC系列的函数怎么使用吧。CEC系列的测试函数有很多,一般下载下来就会给你编译好的matlab可执行文件,后缀名.mexw64。以CEC2017为例

  1. run the following command in Matlab window:
mex cec17_func.cpp -DWINDOWS

  2. Then you can use the test functions as the following example:
f = cec17_func(x,func_num);
here x is a D*pop_size matrix.

一个简单的说明

实际工程优化问题

六个经典的案例

SNS for Eng Prob

  经典工程优化malab代码下载链接

  注:原文已经进行大量实验结果分析,感兴趣的请阅读原文,学习学习一篇好的论文是怎么写的。源代码也已公开,我就不点运行和截图了,大家自行下载。

  特别提示:不要买什么基本的算法,这些算法都是全网公开的,优秀的东西从来都不保密,不怕任何人抄袭的,各位不要再交智商税了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162475.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jbase打印导出实现

上一篇实现了虚拟M层,这篇基于虚拟M实现打印导出。 首先对接打印层 using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml;namesp…

探索NLP中的核心架构:编码器与解码器的区别

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

高校教师资格证备考

高等教育制度 关于人的全面发展和个体发展的关系,说法正确的是(ABC)。 A.个体发展是在全面发展基础上的选择性发展 B.全面发展是个体发展的前提和基础 C.个体发展又是全面发展的动力 D.个体发展是全面发展的前提和基础

什么是缓存雪崩、击穿、穿透?

背景 数据一般是存储于数据库中,数据库中的数据都是存在磁盘上的,磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。 如果用户的请求都直接访问数据库的话,请求数量一上来,数据库很容易就崩溃了,所以为了…

html网页设计 01基础标签

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body> <!-- 标题标签 h1最大 --><h1>最大标签</h1><h2>二级标签</h2><h3>三级标签</h3><…

SpringBoot 统一功能处理

一、用户登录拦截器 1、拦截器实现步骤 步骤1&#xff1a;自定义拦截器 // 自定义拦截器 Component public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object h…

信号的机制——信号的发送与处理

对于硬件触发的&#xff0c;无论是中断&#xff0c;还是信号&#xff0c;肯定是先到内核的&#xff0c;然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕&#xff0c;一个是将信号放在对应的进程 task_struct 里信号相关的数据结构里面&#xff0c;然后等待进…

紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板

这是一套紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板&#xff0c;共33页&#xff1b; PPT模板封面&#xff0c;使用了蓝天白云、城市剪影、奔跑人物剪影背景图片。中间填写工会工作总结汇报PPT标题。界面色彩丰富充满活力。 PowerPoint模板内容页&#xff0c;由31张…

gittee启动器

前言 很多小伙伴反馈不是使用gitee&#xff0c;不会寻找好的项目&#xff0c;在拿到一个项目不知道从哪里入手。 鼠鼠我呀就是宠粉&#xff0c;中嘞&#xff0c;老乡。整&#xff01;&#xff01;&#xff01; git的基本指令 在使用gitee的时候呢&#xff0c;我们只需要记住…

C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例

目录 0、前言1、安装 pybind11库c侧python侧 2、C引入bybind11vs增加相关依赖及设置cpp中添加头文件及导出模块cpp中添加numpy相关数据结构的接收和返回编译生成dll后改成导出模块同名文件的.pyd 3、python调用c4、C引入bybind11 0、前言 在当今的计算机视觉和机器学习领域&am…

【入门篇】1.4 redis 客户端 之 Lettuce 详解

文章目录 1. 简介1. 什么是Lettuce2. Lettuce与其他Redis客户端的比较3. Lettuce的特性和优势 2. 安装和配置3. 连接池配置1. 什么是连接池2. Lettuce的连接池使用与配置3. 连接池配置项 4. 基本操作1. 如何创建Lettuce连接2. Lettuce的基本操作如增删改查3. Lettuce的事务操作…

vue --version无法显示,只弹出vs窗口

参考连接&#xff1a; nodejs环境配置&#xff08;解压包&#xff09;安装教程_nodejs解压版安装及环境配置_tubond的博客-CSDN博客 原因&#xff1a;环境没搞好&#xff0c;没有设置全局文件夹&#xff0c;node默认放在C盘了&#xff0c;C盘有权限。因为npm -i vue/cli创建…

Vite - 配置 - 文件路径别名的配置

为什么要配置别名 别名的配置&#xff0c;主要作用是为了缩短代码中的导入路径。例如有如下的项目目录&#xff1a; project-name| -- src| -- a| --b| --c| --d| --e| -- abc.png| -- index.html| -- main.js如果想在 main.js 文件中使用 abc.png ,则使用的路径是 &#xff1…

【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;多任务系统中使用DHT11&#x1f345;关闭调度器&#x1f345;使用中断 &am…

人类智能的精髓超出了统计概率

处理不确定性好坏的程度是衡量各种智能系统高低的一个重要指标。在处理不确定性时&#xff0c;智能系统需要具备推理、学习和决策的能力&#xff0c;通常使用概率和统计等方法来建模和处理不确定性&#xff0c;以便更好地应对现实世界中的复杂问题。统计概率是基于大量观察和数…

【Spring总结】基于配置的方式来写Spring

本篇文章是对这两天所学的内容做一个总结&#xff0c;涵盖我这两天写的所有笔记&#xff1a; 【Spring】 Spring中的IoC&#xff08;控制反转&#xff09;【Spring】Spring中的DI&#xff08;依赖注入&#xff09;Dependence Import【Spring】bean的基础配置【Spring】bean的实…

一键云端,AList 整合多网盘,轻松管理文件多元共享!

hello&#xff0c;我是小索奇&#xff0c;本篇教大家如何使用AList实现网盘挂载 可能还是有小伙伴不懂&#xff0c;所以简单介绍一下哈 AList 是一款强大的文件管理工具&#xff0c;为用户提供了将多种云存储服务和文件共享协议集成在一个平台上的便利性。它的独特之处在于&am…

彩色年终工作总结汇报PPT模板下载

这是一套彩色年终工作总结汇报PPT模板&#xff0c;共27页&#xff1b; PPT模板封面&#xff0c;使用了红黄蓝色块、网格背景。中间填写年终工作总结汇报PPT标题。界面为简约商务风格。 PowerPoint模板内容页&#xff0c;由25张彩色动态幻灯片图表&#xff0c;搭配PPT文字排版…

Python 双门双向门禁控制板实时监控源码

本示例使用设备&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) #python通过缩进来表示代码块&#xff0c;不可以随意更改每行前面的空白&#xff0c;否则程序会运行错误&#xff01;&#xff01;&#xff01;如果缩进不一致&a…

Python---函数练习:编写一个打招呼程序

函数的定义-------相关链接&#xff1a;Python---函数的作用&#xff0c;定义&#xff0c;使用步骤&#xff08;调用步骤&#xff09;-CSDN博客基本语法&#xff1a; def 函数名称([参数1, 参数2, ...]):函数体...[return 返回值] 函数的调用 Python中&#xff0c;函数和变量一…