当前位置: 首页 > news >正文

一种自适应模拟退火粒子群优化算法-附代码

一种自适应模拟退火粒子群优化算法

文章目录

  • 一种自适应模拟退火粒子群优化算法
    • 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 ∗ ( k max ⁡ − k ) / k max ⁡ ) ( ω 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(kmaxk)/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]; k k k 是当前迭代次数, k max ⁡ k_{\max } kmax 是最大迭代次数。

c 1 > c 2 c_{1}>c_{2} c1>c2 时, 粒子的运动更偏向个体最优的方向, 反之则更偏向群体最优方向. 笔者所提的优化算法初 始阶段注重全局搜索, 着重突出粒子的自我认知能力, 注重粒子运动的遍历性, 减小陷入局部最优解的概 率; 随着迭代的进行, 加强粒子间的交流, 使种群最优解的位置对每个粒子的运行起到更大的影响, 着重 渐增大. 笔者采取如下参数变化策略:
c 1 = c 1 max ⁡ − k ( c 1 max ⁡ − c 1 min ⁡ ) / k max ⁡ (9) c_{1}=c_{1 \max }-k\left(c_{1 \max }-c_{1 \min }\right) / k_{\max } \tag{9} c1=c1maxk(c1maxc1min)/kmax(9)

c 2 = c 2 min ⁡ − k ( c 2 min ⁡ − c 2 max ⁡ ) / k max ⁡ (10) \begin{aligned} &c_{2}=c_{2 \min }-k\left(c_{2 \min }-c_{2 \max }\right) / k_{\max } \end{aligned} \tag{10} c2=c2mink(c2minc2max)/kmax(10)
其中, c max ⁡ , c min ⁡ c_{\max }, c_{\min } cmax,cmin 是自我学习因子的最大值和最小值, c max  , c min  c_{\text {max }}, c_{\text {min }} cmax ,cmin  分别社会学习因子的最大值和最小值. 参照文 献 [16]并进行大量实验后, 本文取 c max ⁡ = 2.5 ; c man ⁡ = 1.25 ; c min ⁡ = 1.25 c_{\max }=2.5 ; c_{\operatorname{man}}=1.25 ; c_{\min }=1.25 cmax=2.5;cman=1.25;cmin=1.25 c 2  min  = 2.5 c_{2 \text { min }}=2.5 c2 min =2.5. 随着迭代次数 k k k 的增加, c 1 c_{1} c1 2.5 2.5 2.5 线性减小至 1.25 1.25 1.25, 而 c 2 c_{2} c2 则由 1.25 1.25 1.25 逐步线性增加到 2.5 2.5 2.5, 这样设置就满足了初期注重粒子在空间上的遍 历性, 增强全局搜索能力, 在迭代次数过半时 c 1 < c 2 c_{1}<c_{2} c1<c2, 且差距越来越大, 局部搜索的能力也随之增强。

将模拟退火算法中的Metropolis准则引入迭代中, 根据最初的粒子最优值设置初始温度, 并且每次迭代 后以一定的而降温系数 μ \mu μ 衰减, 具体操作如下:
T ( k ) = { E ( G best  ) / log ⁡ ( 0.2 ) , k = 1 T ( 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(k1)μ,k=1,k>1.(11)
其中T为初始温度. 每次迭代后计算更新后位置的内能 (适应度) 与种群最优点内能的差距, 根据式 (5) 计 算得出的概率与rand () 进行对比, 判断是否接受较差的解. 本文中取降温系数 μ = 0.95 \mu=0.95 μ=0.95. 笔者所提出的自适 应模拟退火粒子群算法对粒子群算法的三个重要参数进行了自适应变化且加入了模拟退火操作, 增加了寻 优的精度和速度, 具体步骤如下:
步骤 1 设置搜索空间及搜索速度的边界值, 设置种群规模 Size 及最大迭代次数 k max ⁡ k_{\max } kmax.
步骤 2 随机产生种群中所有粒子的初始位置和初始速度.
步骤 3 评价全局粒子的适应度值并记录 G soss  G_{\text {soss }} Gsoss , 并根据式 (11) 设置模拟退火的初始温度.
步骤 4 根据式 (8) ∼ ( 10 ) \sim(10) (10) 自适应的改变 ω 、 c 1 \omega 、 c_{1} ωc1 c 2 c_{2} c2.
步骤 5 根据式 (1) 改变粒子速度, 根据式 (2) 进行一次迭代寻优.
步骤 6 计算移动后粒子的适应度.

步骤 7 根据式 (3) 更新粒子的自身的历史最优位置.
步骤 8 根据式 (5) 计算接受新解的概率 p i ( k ) p_{i}(k) pi(k).
步骤 9 以 Metropolis 准则为依据, 对比概率 p i ( k ) p_{i}(k) pi(k) 与 rand () 判断是否由产生的新解替代全局最优解 进行退火操作, 更新温度.
步骤 10 判断是否达到最大迭代次数 k max ⁡ k_{\max } kmax, 若末达到返回步骤 4 .
步骤 11 输出当前最优粒子, 即寻优结果, 算法终止.

3.实验结果

请添加图片描述

4.参考文献

[1]闫群民,马瑞卿,马永翔,王俊杰.一种自适应模拟退火粒子群优化算法[J/OL].西安电子科技大学学报:1-9[2021-06-17].http://kns.cnki.net/kcms/detail/61.1076.TN.20210303.1129.011.html.

5.Matlab代码

6.Python代码

相关文章:

  • 大模型系统和应用——Transformer预训练语言模型
  • fastapi定时任务,增量构建可转债交易数据入mongo和qlib
  • python+java+springboot快递物流之家管理系统
  • k8s之ConfigMap和Secret
  • 停更的公众号
  • 商汤绝影车路协同“进城”!10+个智能网联应用,100+场景算法应用,感知范围扩大1000倍...
  • 阿里“通义”大模型炸场WAIC,背后要从一篇论文讲起
  • 执行 crictl image 命令报错
  • Android移动安全攻防实战 第二章
  • 读书笔记(一)C++prime
  • 【华为机试真题 JAVA】工号不够用了怎么办-100
  • MySQL教程 - 存储过程与自定义函数(Produce Function)
  • R语言从列表中移除元素、删除列表中的指定元素(单个元素或者多个元素)
  • 带你刷(牛客网)C语言百题(第九天)
  • 带着upp闯关----性能考验
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 2017届校招提前批面试回顾
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • es6--symbol
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Hibernate【inverse和cascade属性】知识要点
  • Netty源码解析1-Buffer
  • python_bomb----数据类型总结
  • RxJS: 简单入门
  • unity如何实现一个固定宽度的orthagraphic相机
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 复杂数据处理
  • 利用DataURL技术在网页上显示图片
  • 盘点那些不知名却常用的 Git 操作
  • 最简单的无缝轮播
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #includecmath
  • #Linux(帮助手册)
  • %@ page import=%的用法
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)逆序输出字符串
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (python)数据结构---字典
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三)mysql_MYSQL(三)
  • (一) springboot详细介绍
  • (一)UDP基本编程步骤
  • (转)nsfocus-绿盟科技笔试题目
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .libPaths()设置包加载目录
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Micro Framework初体验