赞
踩
欢迎来到动物园!
在已有的众多的优化算法里,生物的行为是研究者们最常模仿的对象,所以你就会经常看到狼啊、麻雀啊、鲸鱼啊,甚至还有小龙虾。
当然这些算法的解决思路都很优秀,而对优化算法的应用和改进,也是写论文中极佳的创新点——能研究出新的优化算法固然最好;就算没有,单是将参数寻优加到你的主算法流程中,也可以算是可以说道说道的创新点之一了,在我们乏善可陈(并不)的论文中,也可以提一点亮色~
然而此时同学们可能就纠结了,究竟哪一种优化算法更好呢?又该怎样实现“无痛”编程呢?
我们在使用优化算法时,就像是在一个大山上寻宝。这座大山就是我们的搜索空间,山上的每一个位置对应着一组参数的取值。而山的高低起伏,则代表了不同参数组合下模型性能的好坏。我们的目标,就是在这座山上找到最高的峰,也就是最优的参数组合。但是山太大了,我们不可能把每个位置都走一遍。所以,我们就需要一些"小伙伴"来帮忙,它们就是优化算法中的"粒子"或"个体"。
一开始,我们让这些小伙伴随机地分散在山的各个位置。然后,它们各自开始向山顶进发。每走一步,小伙伴们就会比较一下当前位置的海拔高度,也就是适应度函数的大小。它们会记住自己走过的最高点,也会跟其他小伙伴交流各自的最高点。这样,大家就可以朝着最有希望的方向前进。
这个过程,就对应着优化算法中的"迭代"。每一轮迭代,都像是小伙伴们爬山的一步。迭代的次数,就是小伙伴们爬山的总步数。迭代越多,小伙伴们就爬得越高,找到山顶的机会也就越大。
当然,小伙伴们爬山也是有规则的。它们不能爬出我们规定的区域,这就是"参数边界"。
此外,小伙伴们的数量,也就是"种群数",也会影响寻宝的效率。种群数越多,搜索的范围就越广,但计算量也会增加。
优化算法的奥妙,就在于如何指挥这些小伙伴,让它们既能高效地寻找山顶,又不会陷入"陷阱"(局部最优)。不同的算法,就像是不同的领队,有不同的搜索策略。
归根究底,大多数寻优算法都是按照上边的思路实现的。
回到具体的学术问题上来,很多同学在提到想要对参数做寻优时,并不知道优化的目标是什么。
其实这要从你的研究的目的出发,这里句几个例子大家就明白了:
所以,寻优首先要明确你想要达到的目标,对于分类算法,目标是正确率最高;对于预测算法,目标是误差值最低——这是两类最常见的场景。这个目标还可以是收益率最高、熵值最低、路径最短等等不一而足。相信看到这儿,你应该知道你的优化目标是什么了。
但是需要强调的是,我们寻优有时候不仅仅要找到目标的极值,还要找到能够计算出该极值对应的参数数值,原因和结果有时候是同样重要的!
寻优通常就在超曲面寻找最大值或最小值
适应度函数是优化算法中最关键的部分之一。(甚至没有之一,因为优化策略我已经帮你们集成好了哈哈)
在前面的例子中,我们提到了一些常见的适应度函数,如准确率、误差等,这些函数都能够量化地反映出解的好坏。
不过需要注意的是,在实操层面,各种优化算法都是向最小值方向搜寻,所以“误差”可以直接作为适应度函数,因为我们一定是希望误差值越小越好;但对于分类算法,是需要将(1-准确率)作为适应度函数的,也即以“错误率”为适应度函数。
除此之外,还会有五花八门的适应度函数。不过只要你知道自己想要的是什么,设计一个合适的适应度函数就不是太大的难题。
参数边界值定义了优化搜索的范围。它告诉优化算法,每个参数允许取的最小值和最大值是多少。
设定合理的边界值可以大大缩小搜索空间,提高优化效率。如果边界设置得过宽,算法可能花费大量时间在无意义的区域搜索;如果边界设置得过窄,又可能错过最优解。
参数边界通常由我们对问题的先验知识来决定。
"种群数"和迭代次数是两个关键的超参数,它们控制着优化算法的计算资源和时间。
"种群数"表示算法在每一轮迭代中维护的候选解的数量。种群数越大,算法的搜索能力越强,但计算开销也越大。当然,这里的“种群数”是笼统的说法,到具体优化算法中,可能指的是狼群数量、麻雀数量、小龙虾数量等等。
迭代次数表示算法运行的轮数。一般来说,迭代次数越多,算法得到的解就越接近最优。但是,迭代次数的增加也意味着计算时间的增长。
在实践中,我们需要根据问题的复杂度和可用的计算资源来权衡种群数和迭代次数。对于比较简单的问题,较小的种群和较少的迭代可能就足够了;但对于复杂的问题,我们可能需要增大这两个参数。
自20世纪50年代以来,研究者们提出了各种各样的优化算法,从经典的数学规划方法,到启发式的智能优化算法,再到借鉴自然界的生物启发算法,优化算法的发展历程可谓是丰富多彩。这里举几个例子让大家感受一下[1],详细的算法流程我就不展开一一讲了,因为大多还是比较好理解的。想深入了解的,参考论文我也都附在文末了:
这种算法模拟了灰狼群体的社会等级制度和狩猎行为。在灰狼群体中,等级最高的是头狼(α),负责决策;其次是副头狼(β)和侍从狼(δ),协助头狼;等级最低的是奥米加狼(ω),服从其他狼的命令。在算法中,候选解被看作是一群灰狼,最优解对应α狼,次优解对应β狼和δ狼,其他解对应ω狼。算法通过模拟灰狼的围捕、攻击和搜索行为来更新解,不断逼近最优解。
灵感来自座头鲸的独特捕食方式,座头鲸会潜入鱼群下方,吐出气泡形成一个螺旋状的气泡网,将鱼群围困其中,然后穿过气泡网捕食鱼群。鲸鱼算法通过模拟这种行为来搜索最优解。算法分为三个阶段:包围猎物、萃取攻击和搜索猎物。在包围阶段,鲸鱼会不断更新自己的位置,逼近最优解;在萃取攻击阶段,鲸鱼会沿着螺旋路径接近猎物;在搜索阶段,鲸鱼会随机搜索猎物。通过这三个阶段的迭代,算法最终找到最优解。
这种算法模拟了麻雀群体的捕食、警戒和迁徙行为。在麻雀群体中,有一部分麻雀负责觅食(生产者),另一部分麻雀负责警戒(防御者)。当生产者找到食物时,会通过发出叫声来吸引其他麻雀;当防御者发现危险时,会通过发出警报来提醒其他麻雀。在算法中,候选解被看作是一群麻雀,分为生产者和防御者两类。算法通过模拟麻雀的觅食、警戒和迁徙行为来更新解。生产者负责探索新的区域,防御者负责在当前最优解附近搜索。通过生产者和防御者的协作,算法可以在探索和利用之间取得平衡,高效地找到最优解。
*剩余十三种优化算法概述及其参考文献我放到文末了。
网上的各类代码琳琅满目[1],但是大家在使用过程中就会面临一个问题:我想要试验不同的优化算法效果,可能还要做对比图,但是没更换一次优化算法,就需要重构整套代码的方方面面,一不小心就各种报错。
那有没有把各种优化算法集合成一条代码,只需要修改优化算法名称就能轻松使用不同类型算法的代码呢?
现在有了!它集合了总共16种优化算法(见附录介绍)。
使用这个代码,你需要做的基本只有替换你自己的适应度函数,剩下的都交给封装函数做就好了。
下面举个例子,我们将寻优的目标模型设置为这样一个二元二次方程:
- % 定义目标函数
- fitness = (a-1)^2 + (b-2)^2;
大家一眼就能看出来,fitness最小值对应的参数值为a=1,b=2。
下边我们交给程序:
- %% 1.设置寻优相关参数
- dim = 2; % 优化参数的个数,这里设定为2,表示有两个需要寻优的参数
- lb = [-100,-100]; % 定义每个优化参数的取值下限,这里对两个参数都设置为-100
- ub = [100,100]; % 定义每个优化参数的取值上限,这里对两个参数都设置为100
- OAmethod = 'SSA'; % 选择使用的优化算法,这里使用'SSA'即麻雀搜索算法
- dataforFitness = []; % 这里可以定义需要传递给适应度函数的额外数据,由于本测试中不需要,因此留空
- pop = 300; % 设置优化算法的种群大小
- Max_iteration = 100; % 设置优化算法的最大迭代次数
-
- %% 2.调用优化算法函数,传入上述定义的参数
- % 返回最优位置Best_pos,最优适应度值Best_score,迭代过程的适应度曲线curve
- [Best_pos,Best_score,curve] = kOptimizationAlgorithm(OAmethod, dataforFitness, lb, ub, dim, pop, Max_iteration);
核心算法就只有调用的最后一行代码,上边七行是必要的参数设置,其中主要参数在上边章节中我们都提到了。
此时运行代码,可以得到:
适应度函数收敛曲线
从上边的图中可以看出,寻优算法迅速将适应度函数的输出降到0附近,但是从第5代以后的进一步寻优效果就有些不明显了,此时另外一张对数坐标图就可以派上用场了:
适应度函数收敛曲线-对数坐标
可见从第三代之后,程序还是在不断逼近最优解的。
程序运行完之后,还会在命令行窗口打印出寻优结果、最佳适应度值和程序运行时间,这些都是写论文时必要的参数。
如果我们想换成其他优化算法(比如灰狼优化算法,GWO),只需要将设置改成:
OAmethod ='GWO';% 选择使用的优化算法
其他的都不用修改,就可以得到以下结果:
只要你愿意,甚至可以把所有的16种优化算法都试一遍:
对于上述例子,综合来看MFO飞蛾扑火优化算法的效果是最好的。
上述提到的通用优化算法框架函数的介绍如下:
- function [Best_pos,Best_score,curve] = kOptimizationAlgorithm(OAmethod, dataforFitness, lb, ub, dim, pop, Max_iteration)
- % 通用优化算法框架,该代码提供了多种优化算法的接口。用户可以根据需要选择不同的算法来解决特定的优化问题。
- % 输入参数:
- % OAmethod:字符串,指定使用的优化算法。可选方法包括:(截至2024.3.16,共16种方法,后续更新见手册网页:)
- % 'SSA' - Sparrow Search Algorithm (麻雀搜索算法)
- % 'GWO' - Grey Wolf Optimizer (灰狼优化算法)
- % 'WOA' - Whale Optimization Algorithm (鲸鱼优化算法)
- % 'ALO' - Ant Lion Optimizer (蚁狮优化算法)
- % 'MFO' - Moth Flame Optimizer (飞蛾扑火优化算法)
- % 'DA' - Dragonfly Algorithm (蜻蜓优化算法)
- % 'MVO' - Multi-Verse Optimizer (多元宇宙优化算法)
- % 'SCA' - Sine Cosine Algorithm (正弦余弦算法)
- % 'SSA2'- Salp Swarm Algorithm (樽海鞘优化算法)
- % 'MPA' - Marine Predator Algorithm (海洋捕食者算法)
- % 'AOA' - Arithmetic Optimization Algorithm (算术优化算法)
- % 'COA' - Crayfish Optimization Algorithm (小龙虾优化算法)
- % 'PSO' - Particle Swarm Optimization (粒子群优化算法)
- % 'IPSO'- 非线性权重粒子群优化算法
- % 'MPSO'- 运动编码粒子群优化算法
- % 'TACPSO'- 基于非对称时变加速系数调整策略的粒子群算法
- % dataforFitness:数据集,用于评估优化问题中目标函数的适应度。
- % lb:数组,定义了每个参数的下限。
- % ub:数组,定义了每个参数的上限。
- % dim:整数,优化问题的维度,即需要优化的参数数量。
- % pop:整数,优化算法中的种群数量。比如在GWO算法中代表狼群数量
- % Max_iteration:整数,优化算法的最大迭代次数。
- %
- % 输出参数:
- % Best_pos:数组,表示获得的最佳参数位置。
- % Best_score:浮点数,最佳位置对应的适应度值。
- % curve:数组,记录了每次迭代最佳适应度值的变化,用于绘制收敛曲线。
需要上边这个kOptimizationAlgorithm函数文件以及测试代码的同学,可以在公众号 khscience(看海的城堡)中回复“优化算法”获取。
参考文献:
[1] Xue, J., & Shen, B. (2020). A novel swarm intelligence optimization approach: sparrow search algorithm. Systems Science & Control Engineering, 8(1), 22-34.
[2] Mirjalili, S., Mirjalili, S. M., & Lewis, A. (2014). Grey wolf optimizer. Advances in engineering software, 69, 46-61.
[3] Mirjalili, S., & Lewis, A. (2016). The whale optimization algorithm. Advances in engineering software, 95, 51-67.
[4] Mirjalili, S. (2015). The ant lion optimizer. Advances in engineering software, 83, 80-98.
[5] Mirjalili, S. (2015). Moth-flame optimization algorithm: A novel nature-inspired heuristic paradigm. Knowledge-Based Systems, 89, 228-249.
[6] Mirjalili, S., & Lewis, A. (2016). The whale optimization algorithm. Advances in Engineering Software, 95, 51-67.
[7] Mirjalili, S., Mirjalili, S. M., & Hatamlou, A. (2016). Multi-verse optimizer: a nature-inspired algorithm for global optimization. Neural Computing and Applications, 27(2), 495-513.
[8] Mirjalili, S. (2016). SCA: a sine cosine algorithm for solving optimization problems. Knowledge-Based Systems, 96, 120-133.
[9] Mirjalili, S., Gandomi, A. H., Mirjalili, S. Z., Saremi, S., Faris, H., & Mirjalili, S. M. (2017). Salp Swarm Algorithm: A bio-inspired optimizer for engineering design problems. Advances in Engineering Software, 114, 163-191.
[10] Faramarzi, A., Heidarinejad, M., Mirjalili, S., & Gandomi, A. H. (2020). Marine predators algorithm: a nature-inspired metaheuristic. Expert Systems with Applications, 152, 113377.
[11] Abualigah, L., Diabat, A., Mirjalili, S., Abd Elaziz, M., & Gandomi, A. H. (2021). The arithmetic optimization algorithm. Computer Methods in Applied Mechanics and Engineering, 376, 113609.
[12] Zhang, Y., Liu, R., Asghar Heidari, A., Wang, X., Chen, Y., Wang, M., & Chen, H. (2022). Crayfish optimization algorithm: A bio-inspired metaheuristic optimizer for solving constrained engineering problems. Expert Systems with Applications, 195, 116533.
[13] Kennedy, J., & Eberhart, R. (1995, November). Particle swarm optimization. In Proceedings of ICNN'95-international conference on neural networks (Vol. 4, pp. 1942-1948). IEEE.
[14] Feng, Y., Teng, G. F., Wang, A. X., & Yao, Y. M. (2007, August). Chaotic inertia weight in particle swarm optimization. In Second International Conference on Innovative Computing, Informatio and Control (ICICIC 2007) (pp. 475-475). IEEE.
[15] Zhang, J., Xiao, M., Gao, L., & Pan, Q. (2019). Queuing search algorithm: A novel metaheuristic algorithm for solving engineering optimization problems. Applied Mathematical Modelling, 63, 464-490.[16] Tian, D., Zhao, X., & Shi, Y. (2019). Chaotic particle swarm optimization with sigmoid-based acceleration coefficients for numerical function optimization. Swarm and Evolutionary Computation, 51, 100552.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。