一种自适应模拟退火粒子群优化算法
文章目录
一种自适应模拟退火粒子群优化算法1.粒子群优化算法2. 改进粒子群算法2.1 自适应模拟退火粒子群优化算法3.实验结果4.参考文献5.Matlab代码6.Python代码摘要:为了提高粒子群算法的寻优速度和精度,避免陷入局部优解,提出一种自适应模拟退火粒子群优化算法。采用双曲正切函数来控制惯性权重系数,进行非线性自适应变化;利用线性变化策略控制社会学习因子和自我学习因子,达到改变不同阶段寻优重点的目的;引入模拟退火操作,根据种群的初始状态设置一个温度,根据Metropolis准则和温度指导种群以一定的概率接受差解,保证了算法跳出局部最优解的能力。
1.粒子群优化算法
基础粒子群算法的具体原理参考网络资料
2. 改进粒子群算法
2.1 自适应模拟退火粒子群优化算法
以往应用经典的粒子群算法算法时,设置 ω 、 c 1 和 c 2 的值,大多依赖经验的判断,或者根据大量的仿真实验来确定一个固定的值.但通过上述的分析,如果这三个参数能够随着优化的进行不断变化的话,粒子群算法将会有着更加优秀的效果.惯性权重系数 ω 直接影响着算法搜索能力的强弱, ω 控制粒子继承以往运动趋势,即搜索飞行的惯性.若需要算法的全局搜索能力较强,则设置 ω 的值比较大,但受前一次迭代速度的影响较大,相应的粒子飞行距离较大,不利于局部寻优 .若需要进行局部精细解的搜索,提升局部区域寻优能力,则设置当 ω 的值较小,但陷入局部最优的概率会变大. ω 值的选取与算法收敛速度和全局搜索能力成正比,与局部搜索能力成反比.本文选取[-4,4]之间负的双曲正切曲线来控制惯性权重系数的变化,双曲正切曲线时一个非线性的控制策略,在搜索初期其递减速度较慢,给粒子充分的时间进行大范围的全局搜索,减小陷入局部最优的情况;中期近似线性递减,逐渐加强局部搜索的能力;后期变化率再次减小,着重细致的局部搜索,精准确定全局最优解,惯性权重函数如下:
ω=(ωmax+ωmin)/2+tanh(−4+8∗(kmax−k)/kmax)(ωmax−ωmin)/2(8)\omega=\left(\omega_{\max }+\omega_{\min }\right) / 2+\tanh \left(-4+8 *\left(k_{\max }-k\right) / k_{\max }\right)\left(\omega_{\max }-\omega_{\min }\right) / 2\tag{8} ω=(ωmax+ωmin)/2+tanh(−4+8∗(kmax−k)/kmax)(ωmax−ωmin)/2(8)
其中, ωmax,ωmin\omega_{\text {max }}, \omega_{\text {min }}ωmax,ωmin 是惯性权重系数的最大值和最小值, 本文中取 ωmax=0.95,ωmin=0.4\omega_{\max }=0.95, \omega_{\min }=0.4ωmax=0.95,ωmin=0.4, 经大量实验证明采用 如上取值时算法性能会大幅度提升 [2]{ }^{[2]}[2]; kkk 是当前迭代次数, kmaxk_{\max }kmax 是最大迭代次数。
当 c1>c2c_{1}>c_{2}c1>c2 时, 粒子的运动更偏向个体最优的方向, 反之则更偏向群体最优方向. 笔者所提的优化算法初 始阶段注重全局搜索, 着重突出粒子的自我认知能力, 注重粒子运动的遍历性, 减小陷入局部最优解的概 率; 随着迭代的进行, 加强粒子间的交流, 使种群最优解的位置对每个粒子的运行起到更大的影响, 着重 渐增大. 笔者采取如下参数变化策略:
c1=c1max−k(c1max−c1min)/kmax(9)c_{1}=c_{1 \max }-k\left(c_{1 \max }-c_{1 \min }\right) / k_{\max } \tag{9} c1=c1max−k(c1max−c1min)/kmax(9)
c2=c2min−k(c2min−c2max)/kmax(10)\begin{aligned} &c_{2}=c_{2 \min }-k\left(c_{2 \min }-c_{2 \max }\right) / k_{\max } \end{aligned} \tag{10} c2=c2min−k(c2min−c2max)/kmax(10)
其中, cmax,cminc_{\max }, c_{\min }cmax,cmin 是自我学习因子的最大值和最小值, cmax,cminc_{\text {max }}, c_{\text {min }}cmax,cmin 分别社会学习因子的最大值和最小值. 参照文 献 [16]并进行大量实验后, 本文取 cmax=2.5;cman=1.25;cmin=1.25c_{\max }=2.5 ; c_{\operatorname{man}}=1.25 ; c_{\min }=1.25cmax=2.5;cman=1.25;cmin=1.25 和 c2min=2.5c_{2 \text { min }}=2.5c2min=2.5. 随着迭代次数 kkk 的增加, c1c_{1}c1 由 2.52.52.5 线性减小至 1.251.251.25, 而 c2c_{2}c2 则由 1.251.251.25 逐步线性增加到 2.52.52.5, 这样设置就满足了初期注重粒子在空间上的遍 历性, 增强全局搜索能力, 在迭代次数过半时 c1<c2c_{1}<c_{2}c1<c2, 且差距越来越大, 局部搜索的能力也随之增强。
将模拟退火算法中的Metropolis准则引入迭代中, 根据最初的粒子最优值设置初始温度, 并且每次迭代 后以一定的而降温系数 μ\muμ 衰减, 具体操作如下:
T(k)={E(Gbest)/log(0.2),k=1T(k−1)∗μ,k>1.(11)T(k)=\left\{\begin{array}{ll} E\left(G_{\text {best }}\right) / \log (0.2) & , k=1 \\ T(k-1) * \mu & , k>1 \end{array} .\right. \tag{11} T(k)={E(Gbest)/log(0.2)T(k−1)∗μ,k=1,k>1.(11)
其中T为初始温度. 每次迭代后计算更新后位置的内能 (适应度) 与种群最优点内能的差距, 根据式 (5) 计 算得出的概率与rand () 进行对比, 判断是否接受较差的解. 本文中取降温系数 μ=0.95\mu=0.95μ=0.95. 笔者所提出的自适 应模拟退火粒子群算法对粒子群算法的三个重要参数进行了自适应变化且加入了模拟退火操作, 增加了寻 优的精度和速度, 具体步骤如下:
步骤 1 设置搜索空间及搜索速度的边界值, 设置种群规模 Size 及最大迭代次数 kmaxk_{\max }kmax.
步骤 2 随机产生种群中所有粒子的初始位置和初始速度.
步骤 3 评价全局粒子的适应度值并记录 GsossG_{\text {soss }}Gsoss, 并根据式 (11) 设置模拟退火的初始温度.
步骤 4 根据式 (8) ∼(10)\sim(10)∼(10) 自适应的改变 ω、c1\omega 、 c_{1}ω、c1 和 c2c_{2}c2.
步骤 5 根据式 (1) 改变粒子速度, 根据式 (2) 进行一次迭代寻优.
步骤 6 计算移动后粒子的适应度.
步骤 7 根据式 (3) 更新粒子的自身的历史最优位置.
步骤 8 根据式 (5) 计算接受新解的概率 pi(k)p_{i}(k)pi(k).
步骤 9 以 Metropolis 准则为依据, 对比概率 pi(k)p_{i}(k)pi(k) 与 rand () 判断是否由产生的新解替代全局最优解 进行退火操作, 更新温度.
步骤 10 判断是否达到最大迭代次数 kmaxk_{\max }kmax, 若末达到返回步骤 4 .
步骤 11 输出当前最优粒子, 即寻优结果, 算法终止.
3.实验结果
4.参考文献
[1]闫群民,马瑞卿,马永翔,王俊杰.一种自适应模拟退火粒子群优化算法[J/OL].西安电子科技大学学报:1-9[-06-17]./kcms/detail/61.1076.TN.0303.1129.011.html.