先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出的新型智能优化算法,并附MATLAB代码。
此外,欢迎添加算法交流群进行交流:912369858
先说明一下,这篇推文针对的是进化算法的常见文章来讨论的。什么叫常见文章呢?就是三大件:算法改进+跑CEC测试集+简单应用(工程案例、WSN节点覆盖优化、PID参数整定、特征选择等)。或者:提新算法+跑CEC测试集+简单应用。这种文章在进化算法领域是非常常见的,八股文。在这类文章的基础上,我们讨论一下数值实验的设计,以及博主的一些建议(仅代表个人观点)。此外,阐述进化算法的一些常用性能指标的含义和它们彼此的区别。
Part1 数值实验设计
这里分两种情况进行阐述。第一种情况是改进别人的算法,第二种情况是自己提出新算法。这两种情况下的数值实验分别怎么设计,博主给出自己的看法。注意是博主自己的建议,仅代表个人观点,不要来抬杠。
1.1 改进算法类文章
第一种情况:改进算法类文章。假设原始算法是GWO,自己改进的算法取名为IGWO。它的数值实验可以如图1这样设计:
图1
这幅图是去年我作报告时候的一张PPT,4.1、4.2……是因为数值实验一般是第4章,即Section 4。这个不重要。下面对这些实验进行解释:
这里面4.2的意思是,如果你改进的算法设计了新的参数,并且这个参数是需要人为赋值的,那么审稿人有可能问你:你这个参数的赋值为什么是0.9,这个参数的最优设置值有没有被网格搜索过?所以,你可以增加一个这样的实验,找出最优的参数设置值。当然,如果这个实验做不了,就要好好解释你为什么设置参数值为0.9,有理有据,而不是直接给出,容易被怼。如果4.2不需要做(新算法没有参数),或者4.2做不了,那么就把这个实验换成:策略有效性验证。比如IGWO包含三个改进策略A、B、C,那就分别验证这几个策略的有效性,看一下是不是都对算法性能的提升有贡献。即:GWO+策略A、GWO+策略B、GWO+策略C。或者:IGWO缺少策略A、IGWO缺少策略B、IGWO缺少策略C。
4.3、4.4、4.5的实验应该不用过多解释,一方面是堆工作量,一方面是验证算法有效性必须有的实验。当然,你可以合成一个实验,跑不同的测试集,这样也是可行的。
4.6是可以增加的实验,一方面也是堆工作量,另一方面是为了更全面的分析算法在进化过程中的收敛状态。这个可以参考文章10.1109/TCYB.2019.2925015,里面进行了详细介绍和实验说明。如图2所示,是这篇文章改进算法和原始PSO的种群多样性在进化过程中的变化曲线。
图2
注意,图2的这种种群多样性变化曲线和平均收敛曲线是相对应的。意思就是,平均收敛曲线有波动,种群多样性曲线也会波动。这是有对应的,前者有什么变化,后者也会作出相应的反应。至于什么原因,大家可以自己分析,也欢迎在下面讨论。
4.7是可增加的实验,算法在收敛过程中,种群的勘探和开发的占比变化曲线。关于这个实验,可以仔细阅读我之前的推文:种群的勘探(Exploration)与开发(Exploitation)(含MATLAB代码)。里面有详细的解释。
4.8是算法的应用。实际上,现在那几十个工程应用也可以理解为测试集。4.8的实验就是套一些应用案例进去,验证一下算法在实际问题上的实用性。这里需要特别注意:如果应用的问题是约束优化问题(比如工程案例),而你的算法是针对无约束优化问题设计的(就是你前面跑的测试集是CEC2005、CEC2013、CEC2014、CEC2017、CEC2020或CEC2022等),这里一定要说明一下对于约束条件的处理方法。这个不用太详细,但是要有,阐明你是怎么处理的约束条件。不然容易被怼。
4.9是建议写的。因为算法没有最好,只有更好!这个是写来感动审稿人的。这孩子实事求是,勇于承认自己的缺点,那就让他过吧~
最后是关于对比算法组成,我一般建议是:原始算法、6-8个同类算法、6-8个其他EA。4.8的对比算法则多多益善,可以直接去找文献。
1.2 提出新算法类文章
第二种情况:提出新算法类文章。就是提出一个新的算法,别人都没有提过的。假如我们把这个算法命名为牛马算法(Ox & horse algorithm, OHA)。(这是随便取的名字,是没有这个算法的哈~)。它的数值实验可以如图3这样设计:
图 3
除了4.3、4.4和4.5外,其他和上面的改进算法类文章差不多。4.3、4.4和4.5的测试集可以自己挑选,但肯定是要跑多个测试集的。提出新算法,如果前面的创新性不够,那后面的工作量一定要堆够,做大量的实验。所以多跑几个测试集、多对比一些算法,并且每个测试集要跑不同的维度。
Part2 算法几种性能指标的含义与区别
2.1 常见的几种性能指标
灵敏性。也叫灵敏度,就是算法对参数的灵敏程度。是不是参数稍微动一下,算法的性能就会受到很大的影响。
收敛性。一般针对具体问题而言。比如针对问题A,这个算法的收敛性如何。不能脱离问题去讨论算法的收敛性。收敛性在数值实验结果上从两个方面表现:收敛速度、收敛精度
稳定性。算法在同一个问题上多次运行的结果差异是否较大。比如A算法在CEC2017的F4上运行30次,这30次结果的方差很大,那就说明这个算法在这个函数上稳定性较差。
鲁棒性。算法在不同问题上的求解结果。比如问题A、B、C的最优值都是0,维度都是20,但算法只在A上求得最优值,在B和C上的效果都很差。这就说明这个算法的鲁棒性较差。鲁棒性是用来验证算法的通用性,是不是只适合某个问题或者某一类问题,而换一个问题就不行了。
延展性。算法在同一个问题不同维度上表现出的性能。比如在30维上性能优越,在50维上就收敛效果很差,那么它的延展性较低。
多样性,即种群多样性。有专门的计算公式,可以参考文章10.1109/TCYB.2019.2925015,里面进行了详细介绍。反映的是种群的分散程度和解的相似程度。
2.2 区别
这个主要从数值实验层面来说:
收敛速度与收敛精度:算法在某个测试函数上得到的最优值只能展示算法的收敛精度,显示不出收敛速度;收敛曲线既可以显示算法的收敛速度,也可以展示收敛精度。在进行实验描述时注意区分。
稳定性与鲁棒性:算法在测试函数上多次运行得到的标准差、方差或箱线图展示的是算法在这个问题上的稳定性,而不是鲁棒性。鲁棒性目前好像是没有专门的指标,这个可以自己查一下。鲁棒性一般是观察算法在整个测试集所有基准函数上的实验结果来进行说明的。比如测试集包含20个基准函数,算法在20个函数上的误差都是0,或者很小,算法鲁棒性就较优,在不同问题上的性能没有太大差异。
稳定性和延展性:这个是最容易混淆的。算法在测试函数上多次运行得到的标准差、方差或箱线图展示的是算法在这个问题上的稳定性,而不是延展性。延展性是算法在同一个函数上跑不同的维度反映出来的性能。比如CEC2017测试集的F5,算法在30维、50维和100维上跑的结果没有太大的差异,那么算法在F5上的延展性就较好。换言之,延展性衡量的是维度变化对算法性能的影响,稳定性衡量的是算法多次求解同一个问题时,结果的变化大小。在进行实验描述时注意区分。
最后要说明的是,算法是不具备普适性的。如果算法具备普适性,就和没有免费午餐定理矛盾了。如果算法具备普适性,就不需要改进算法了~
近几年网络环境不太好,希望大家多多讨论和文明评论,少些酸言酸语~