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= X1⋮Xi⋮XN N×m= x1,1⋮xi,1⋮xN,1⋯⋱⋯⋯x1,j⋮xi,j⋮xN,j⋯⋯⋱⋯x1,m⋮xi,m⋮xN,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 ⋅(ubj−lbj),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= F1⋮Fi⋮FN 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 =A∗Rα=1−t/TA=2×αR=2×r1−1
其中 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 =(Xmt−Xnt)∙β∙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)} β=1−1+exp(−Tt−2T×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,jt∙LF
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×∣y∣a1xσ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 t−Xi,jt 表示当前海象与第二只海象之间的距离,a和b为聚集系数, r 5 r_5 r5为随机数,位于[0,1], θ \theta θ取的值范围为0到π。
四、流程图
在WO中,危险信号用于确定WO是执行勘探阶段还是开发阶段。当危险信号绝对值不小于1时,海象群迁移到解空间内的新域,即算法早期的探索阶段;相反,海象群繁殖,这是算法后期的开发阶段。安全信号在开发阶段起着关键作用,它影响着个体海象是选择栖息行为还是觅食行为。其中,觅食行为包括聚集和逃跑两种典型现象,它们受危险信号的控制。

五、伪代码

六、算法复杂度
在求解优化问题时,计算复杂度对于评估算法的效率非常有用,它取决于三个主要过程:初始化、适应度评估和解决方案的更新。初始化过程和更新机制的计算复杂度分别为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)-5fn = 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 onview(0,90)for i = 1:length(All_Pos)temp = All_Pos{i};scatter(temp(:,1),temp(:,2),12,'k')endtitle('Search history')box ongrid onnexttileplot(fitness1st,'Color',[6, 253, 244]./255,'LineWidth',1.5)title('Trajectory in 1st agents')box ongrid onnexttileplot(fitnessallmean,'Color',[28, 29, 252]./255,'LineWidth',1.5)title('average fitness of all agents')box ongrid onnexttilesemilogx(PO_cg_curve,'Color',[245, 42, 237]./255,'LineWidth',1.5)title('Convergence curve')box ongrid 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'];%设置当前路径
tryexcelApp=actxGetRunningServer('Excel.Application');%如果Excel 服务器已经打开,返回其句柄
catchexcelApp=actxserver('Excel.Application');%如果Excel服务器没有打开,则创建一个Excel服务器,并返回句柄
end
excelApp.Visible = true; % 使 Excel 可见
%% 添加一个新的工作簿
%如果存在test.xlsx文件,则打开文件,若不存在则创建一个,然后保存
if exist(file_path,'file')workbook=excelApp.Workbooks.Open(file_path);%打开 注意这里打开的必须是绝对路径
elseworkbook=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' + irangeStr = 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();% endend
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 linerange.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:4fn = 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);nexttilesemilogy(AEO_curve)hold onsemilogy(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:4F1 = resultall{i};figure('NumberTitle','off', ...'Color','w', ...'Name','稳定性分析', ...'Units','centimeters', ...'Position',[4,15,30,7])handelbox = boxchart(F1);box onset(gca,'xticklabels',algorithms, ...'LineWidth',2)xlabel('Algorithm')ylabel('Fitness Value')grid onhandelbox.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 onend
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')

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 onend
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')

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 onend
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')

从上面三幅图中可以看出,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.

实际工程优化问题


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

注:原文已经进行大量实验结果分析,感兴趣的请阅读原文,学习学习一篇好的论文是怎么写的。源代码也已公开,我就不点运行和截图了,大家自行下载。
特别提示:不要买什么基本的算法,这些算法都是全网公开的,优秀的东西从来都不保密,不怕任何人抄袭的,各位不要再交智商税了。
相关文章:
Matlab群体智能优化算法之海象优化算法(WO)
文章目录 一、灵感来源二、算法的初始化三、GTO的数学模型Phase1:危险信号和安全信号Phase2:迁移(探索)Phase3:繁殖(开发) 四、流程图五、伪代码六、算法复杂度七、WO搜索示意图八、实验分析和结…...
go语言学习-结构体
1、简介 Go语言中的结构体是一种自定义数据类型,可以将不同类型的数据字符组合在一起形成一个单独的实体。结构体可以用于存储和操作复杂的数据结构,以及创建自定义数据类型。通过自定义结构体创建的变量,可以存储不同类型的数据字段。在实际开发中,结构体的用途非常广泛,…...
Stable Diffusion进阶玩法说明
之前章节介绍了Stable Diffusion的入门,介绍了文生图的魅力,可以生成很多漂亮的照片,非常棒 传送门: Stable Diffusion新手村-我们一起完成AI绘画-CSDN博客 那我们今天就进一步讲讲这个Stable Diffusion还能做些什么, …...
PDF控件Spire.PDF for .NET【转换】演示:将PDF 转换为 HTML
由于各种原因,您可能想要将 PDF 转换为 HTML。例如,您需要在社交媒体上共享 PDF 文档或在网络上发布 PDF 内容。在本文中,您将了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中将 PDF 转换为 HTML。 Spire.Doc 是一款专门对 Word 文档进行…...
二分查找——34. 在排序数组中查找元素的第一个和最后一个位置
文章目录 1. 题目2. 算法原理2.1 暴力解法2.2 二分查找左端点查找右端点查找 3. 代码实现4. 二分模板 1. 题目 题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 给你一个按照非递减顺序排列的整数数组 nums&#…...
MFC中的主窗口以及如何通过代码找到主窗口
MFC程序中的主窗口 在MFC程序中,可以设置主窗口,主窗口在应用程序类中设置,即设置应用程序类(通常以App结尾,通常包括InitInstance方法的类)的m_pMainWnd属性,将其设置为主窗口的指针。 一般在…...
Typora下载安装 (Mac和Windows)图文详解
目录 Windows版本 一、下载 二、安装 Mac版本 一、下载 二、安装...
32位单片机PY32F040,主频72M,外设丰富,支持断码LCD
PY32F040 系列微控制器采用高性能的 32 位 ARM Cortex-M0 内核,宽电压工作范围的 MCU。嵌入高达 128 Kbytes flash 和 16 Kbytes SRAM 存储器,最高工作频率 72 MHz。LQFP64封装两块出头就可以拿到,我们还有开发板和开发资料帮助客户更好的开发。 PY32F040 系列微控…...
Shell判断:模式匹配:case(二)
简单的JumpServer 1、需求:工作中,我们需要管理N多个服务器。那么访问服务器就是一件繁琐的事情。通过shell编程,编写跳板程序。当我们需要访问服务器时,看一眼服务器列表名,按一下数字,就登录成功了。 2、…...
从android.graphics.Path中取出Point点,Kotlin
从android.graphics.Path中取出Point点,Kotlin /*** 从一条Path中获取多少个Point点*/private fun getPoints(path: Path, pointCount: Int): Array<FloatPoint?> {val points arrayOfNulls<FloatPoint>(pointCount)val pm PathMeasure(path, false)…...
力扣C++学习笔记——C++ 给vector去重
要使用std::set对std::vector进行去重操作,您可以将向量中的元素插入到集合中,因为std::set会自动去除重复元素。然后,您可以将集合中的元素重新存回向量中。以下是一个示例代码,演示如何使用std::set对std::vector进行去重&#…...
Flutter笔记:使用相机
Flutter笔记 使用相机 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134493373 【简介】本文介绍在 Fl…...
包装类型的缓存机制
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or Fal…...
【BUG】第一次创建vue3+vite项目启动报错Error: Cannot find module ‘worker_threads‘
问题描述 第一次创建vue3vite项目启动报错如下: Error: Cannot find module worker_threadsat Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)at Function.Module._load (internal/modules/cjs/loader.js:562:25)at Module.require (…...
多目标应用:基于非支配排序的鲸鱼优化算法NSWOA求解微电网多目标优化调度(MATLAB代码)
一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、基于非支配排序的鲸鱼优化算法NSWOA 基于非支配排序的鲸鱼优化算法NSWOA简介: 三、基于非支配排序的鲸鱼优化算法NSWOA求解微电网多目标优化…...
网络爬虫|Selenium——find_element_by_xpath()的几种方法
Xpath (XML Path Language),是W3C定义的用来在XML文档中选择节点的语言 一、从根目录/开始 有点像Linux的文件查看,/代表根目录,一级一级的查找,直接子节点,相当于css_selector中的>号 /html/body/div/p 二、根据…...
【Kingbase FlySync】命令模式:部署双轨并行,并实现切换同步
【Kingbase FlySync】命令模式:安装部署同步软件,实现Oracle到KES实现同步 双轨并行方案说明一.准备工作二.环境说明三.目标实操(1).准备安装环境Orcle服务器(Oracle40)1.上传所有工具包2.操作系统配置a.增加flysync 用户、设置密码b.配置环境变量c.调整limits.conf…...
echarts 多toolti同时触发图表实现
需求背景解决效果ISQQW代码地址energyChart.vue 需求背景 需要实现同x轴,4个图表的的多图表联动效果,且滑动会触发各个图表的tooltip,即一个图表拥有4个tooltip(目前echarts不支持,我这里绕过了这个问题) 解决效果 ISQQW代码地…...
2023.11.22使用flask做一个简单的图片浏览器
2023.11.22使用flask做一个简单的图片浏览器 功能: 实现图片浏览(翻页)功能 程序页面: 程序架构: 注意:在flask中常会使用src“{{ url_for(‘static’, filename‘images/’ image) }}”,…...
万字解析设计模式之桥接模式、外观模式
一、桥接模式 1.1概述 桥接模式是一种结构型设计模式,它的作用是将抽象部分和实现部分分离开来,使它们能够独立地变化。这样,抽象部分和实现部分可以分别进行扩展,而不会相互影响。它是用组合关系代替继承关系来实现,…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
