近十年涌现了众多优秀的智能优化算法,然而一个算法在某些优化问题上的优异表现并不能保证其在其他问题上的有效性,即不存在一个算法能有效解决所有的优化问题,即著名的“无免费午餐”定理。
同时,新算法的提出是否能跳出仿生的思路而开拓新的思路也是我们的研究方向之一。正余弦算法的提出者 归纳了仿生智能优化算法的迭代策略并利用简单的正余弦函数逻辑构思出了正弦余弦算法(SCA) ,这也极大拓宽了开发新算法的思路。
SCA是一种新颖的随机优化算法,该算法最显著的特点是其通过简洁明了的形式完备了一个智能优化算法所应具备的必要要素,其仅利用正弦和余弦函数的波动性和周期性作为实现算子的设计目标来搜索和迭代最优解。与遗传算法,粒子群算法,等众多智能优化算法相比,正弦余弦算法具有参数少、结构简单、易实现、收敛速度快等优点,在实际应用中具有较优的性能。
正弦余弦算法(SCA)归纳吸收了部分群智能优化算法的迭代策略,以包含特定个数随机解的集合作为算法的初始解集,重复地通过目标函数评价解的适应度并按照特定更新策略随机迭代解集,最终求得最优解或满足适应度要求的满意解。同大部分群智能优化算法一样,SCA 依靠迭代策略实现解空间的随机搜索,并不能保证在一次运算中找到最优解,但当初始解集规模和迭代次数足够大时,求得最优解的概率大大提高。
SCA把迭代策略归纳结构为全局搜索和局部开发两个线程。
在全局搜索线程中,对当前解集中的解施加较大的随机波动来搜索解空间中的未知区域
在局部开发线程中,对解集施加微弱的随机扰动来充分搜索当前解的邻域。
SCA 利用正弦、余弦函数的周期波动性构造了实现全局搜索和局部开发两个线程功能的迭代方程,通过该简洁的更新迭代方程来施加扰动并更新解集,具体的迭代方程分为以下正弦迭代或余弦迭代方程两种:
其中 表示当前迭代次数, X i j ( t ) X_{i}^{j}(t) Xij(t) 表示个体 i i i 在第 次迭代时的位置在第 j j j 维 的分量, r 1 r_1 r1, r 2 r_2 r2 , r 3 r_3 r3 为随即参数, r 1 r_1 r1 由更新函数确定, r 2 r_2 r2 ~ [ 0 , 2 π ] [0,2\pi] U[0,2π] , r 3 r_3 r3 ⋳ ( 0 , ∞ ) (0,∞) (0,∞), P ( ) P^ () Pj(t) 表示候选解集在第 次迭代的最优候选解在第 j j j 维度的分量。
为了消除迭代步长和方向的相关关系,通过随即参数 r 4 r_4 r4 ~ [ 0 , 1 ] [0,1] U[0,1] 将上面的两个迭代方程结合到完整的迭代方程:
以二维随机变量为例:
当 r 1 s i n ( r 2 ) r_1sin(r_2) r1sin(r2) 或 r 1 c o s ( r 2 ) r_1 cos(r_2) r1cos(r2) 的值在 -1 和 1 之间时,迭代应用局部开发策略,算法搜索候选解和当前最优解之间的解空间,即侯选解的某个邻域; r 1 s i n ( r 2 ) r_1sin(r_2) r1sin(r2) 或 r 1 c o s ( r 2 ) r_1 cos(r_2) r1cos(r2) 的值 > 1 >1 >1 或者 < − 1 <-1 <−1 时,则应用全局开发策略.SCA 正是借此实现了对解空间全局搜索和局部开发.
考虑到全局搜索和局部开发两个过程的平衡性和算法收敛到全局最优解的必要性,随着迭代的进行适应性地调整 r 1 r_1 r1:
r 1 = a − a T t r_1=a-\frac{a}{T}t r1=a−Tat
a a a是一个常数; t t t 为当前迭代次数; T T T 为最大迭代次数; 由于 r 1 r_1 r1 的值随迭代次数逐渐减小,平衡了算法局部开发和全局搜索的能力;
当我们设置 a = 2 a =2 a=2 时,如图下图所示,此时 r 1 s i n ( r 2 ) r_1sin(r_2) r1sin(r2) 和 r 1 c o s ( r 2 ) r_1 cos(r_2) r1cos(r2) (正余弦参数部分)的波动幅度随着迭代次数的增加逐渐衰减,其值在 ( 1 , 2 ] (1,2] (1,2] 和 [ − 2 , − 1 ) [-2,-1) [−2,−1) 范围内,算法进行全局搜索,在 [ − 1 , 1 ] [-1,1] [−1,1]之间进行局部开发。
迭代式上下两个式子各以 0.5 的概率选取,由于正弦函数平移后便可以得到余弦函数,所以正弦函数和余弦函数的 函数值分布是相同的。因此,虽然 r 2 r_2 r2 ~ [ 0 , 2 π ] [0,2\pi] U[0,2π] 是随机数,但是从概率角度而言, r 1 s i n ( r 2 ) r_1sin(r_2) r1sin(r2) 和 r 1 c o s ( r 2 ) r_1 cos(r_2) r1cos(r2) 的函数值分布几乎相同。 取 a = 2 , T = 10000 , r 1 = a − a t / T , r 2 ∈ U [ 0 , 2 π ] a = 2,T = 10 000, r_1 = a - at/T,r_2 ∈ U[0,2π] a=2,T=10000,r1=a−at/T,r2∈U[0,2π], 下给出了 r 2 r_2 r2 ~ [ 0 , 2 π ] [0,2\pi] U[0,2π] 函数值的频数分布直方图。
我们可以看出
r 1 s i n ( r 2 ) r_1sin(r_2) r1sin(r2) 和 r 1 c o s ( r 2 ) r_1 cos(r_2) r1cos(r2) 频数直方图几乎是等效的。结合此图和 r 1 r_1 r1的计算公式,我们也可以发现,当迭代次数到达一定频数后, r 1 < 1 r_1<1 r1<1,即算法后期不再进行全局搜索,而是局部开发。
在原论文中,研究人员试图在尽可能多的测试用例上测试他们的算法。本文采用了三组不同特性的测试函数。
所使用的案例研究包括单模态、多模态和复合测试函数。第一组测试函数没有局部最优值,只有一个全局最优值。这使得它们非常适合于测试算法的收敛速度和开发。第二组测试函数除了全局最优外,还有多个局部解。这些特征有利于测试算法的局部最优避免和探索能力。最后,复合测试函数是几个单模态和多模态测试函数的旋转、移位、偏置和组合版本。
为了求解上述测试函数,总共允许30个搜索代理在500次迭代中确定全局最优。将SCA算法与萤火虫算法(FA)、蝙蝠算法(BA)、花授粉算法(FPA、引力搜索算法(GSA)、粒子群算法(PSO)和遗传算法进行了比较,验证结果。由于元启发式的随机性质,单次运行的结果可能不可靠,所有算法都运行了30次,统计结果(均值和标准差) 如表所示。结果在[0,1]中进行了归一化,以比较所有测试函数的结果。
表中的结果表明,SCA算法在大多数测试用例中都优于其他算法。SCA算法在6个单模态测试函数中有3个显示出较好的结果。在所有的多模态测试函数上比其他算法表现得都要好(7,9,11,12),表1的最后一行给出了算法在所有测试函数上的平均值和标准差的总和。很明显,SCA的ave和std的都是最小的,证明该算法在总体上可靠地优于其他算法。
SCA 在候选解集规模和迭代次数充分的情况下求解优化问题的全局最优解的理论优势在于:
其测试函数集的表现也说明了其存在的一些不足:
第一类改进策略研究了转换参数 r 1 r_1 r1 对 SCA 全局搜索和局部开发两个线程平衡的影响,提出了参数 r 1 r_1 r1非线性递减的正余弦算法,实现了算法计算精度和收敛速度一定程度的提高。其测试了凸函数中的抛物线函数和凹函数中的指数函数来作为 r 1 r_1 r1的更新策略:
抛物线函数: r 1 = a ( 1 − t T ) 2 ,指数函数: r 1 = a e − t T 抛物线函数:r_1=a(1-\frac{t}{T})^{2} ,指数函数:r_1=ae^{-\frac{t}{T}} 抛物线函数:r1=a(1−Tt)2,指数函数:r1=ae−Tt
转换参数非线性递减的 SCA算法流程仅参数 r 1 r_1 r1 同标准SCA 不同,算法流程同与SCA相同。
为了改善迭代过程中父代个体的信息具有惯性权重所导致的搜索后期震荡性,提出了应用个体适应度调整的权重更新机制的正余弦算法(WSCA)
在WSCA 中,除了当前最优解及扰动幅度,每个候选解还受到一个按其适应度线性调整的权重的影响,该权重取决于其在候选集中适应度的排序值,适应度较高的候选集分配较高的权重,在更新过程中对一下代候选解集影响较大:
W x i ( t ) = 1 − i × ( 1 m ) W_{x_{i}(t)}=1-i×(\frac{1}{m}) Wxi(t)=1−i×(m1)
其中 表示当前迭代次数, ( ) _ () xi(t) 表示第 次迭代中适应度第高的候选解, W x i ( t ) W_{x_{i}(t)} Wxi(t) 表示在 次迭代中 ( ) _ () xi(t)所获得的权重, m m m表示候选解集规模。
在确定每个候选解的权重之后再选择一部分适应度较高的候选集计算平均位的分量:
A u g i j = s u m ( W x 1 ( t ) x 1 ( t ) , W x 2 ( t ) x 2 ( t ) , . . . , W x c ( t ) x c ( t ) ) c t Aug_{i}^{j}=\frac{sum(W_{x_{1}(t)}x_1(t),W_{x_{2}(t)}x_2(t),...,W_{x_{c}(t)}x_c(t))}{c_t} Augij=ctsum(Wx1(t)x1(t),Wx2(t)x2(t),...,Wxc(t)xc(t))
其中 c c_ ct为参与平均位置计算的优选候选解的规模,随迭代次数的增加而减少, c t = [ m − 1 m t ] c_t=[m-\frac{1}{m}t] ct=[m−m1t]
以上的权重机制(WUPM)着眼于消除迭代过重中候选解的惯性权重所可能导致的算法后期震荡性,WSCA候选解迭代更新方程如下:
根据上式,一方面,算法初始所有候选解都参与平均位置的计算,描述了算法进行全局搜索的随机性;随着迭代次数的增加,只有适应度较高的候选解参与平均位置的计算,适应度较低的候选解对迭代策略的影响越来越小。另一方面,迭代过重中适应度较低的候选解的权重越来越小,平均位置最终只保留当前最优解,算法充分开发当前最优解的邻域并最终求得问题的全局最优解.算法的流程如下:
将优化启发式算法收敛性常用的反向学习(OBL)运用到SCA当中并提出了反向学习正余弦算法(OBSCA)。OBL改进策略考虑了候选解在解空间对称位置的解的信息并在迭代过程中保留适应度较高的一方,以可接受的计算成本提高算法的有效程度和收敛性.
OBL 策略首先定义实数 x ∈ [ 1 , u ] x∈[1,u] x∈[1,u] 的反向数 x ˉ , x ˉ = l + u − x \bar{x},\bar{x}=l+u-x xˉ,xˉ=l+u−x,则多维变量 X = ( 1 , 2 , … , ) ∈ , ∈ [ , ] X=(_1,_2,…,_ ) ∈ ^,^ ∈[_,_] X=(x1,x2,…,xn)∈Rn,xi∈[li,ui]的反向目标 X ˉ , \bar{X}, Xˉ, 可定义为:
X ˉ = ( x ˉ 1 , x ˉ 2 , … , x ˉ ) , x ˉ i = + i − , = 1 , 2 , … \bar{X}=(\bar{x}1,\bar{x}_2,…,\bar{x}_ ),\bar{x}_i=_+_i−_,=1,2,… Xˉ=(xˉ1,xˉ2,…,xˉn),xˉi=li+ui−xi,i=1,2,…n
基于反向目标的定义, 对于 m m m个候选解的候选解集 M M M,计算 M M M中每个候选解 X X X和其反向目标的适应度,保留两个集合中适应度最高的 m m m个解组成新的候选集 M M M,完成候选解的反向学习.将OBL 整合到SCA 中,在每次迭代过程对当前候选解集应用OBL 得到适应度较高的新候选解集M之后再依据标准SCA迭代公式更新候选解集,就得到了OBSCA.OBSCA的算法流程如下:
引入反向 学习策略增加了可选粒子数量,并择优选取粒子,增大随机性的同时提高种群进化速度。通过可接受的计算成本增加较好地提高了算法的收敛性和准确性。
参考论文:Mirjalili S.SCA:a sine cosine algorithm for solving optimization problems
代码:python实现SCA算法