超详细 | 模拟退火-粒子群自适应优化算法及其实现(Matlab)

news2024/9/27 15:19:24

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

作者在前面的文章中介绍了经典的优化算法——粒子群算法(PSO),各种智能优化算法解决问题的方式和角度各不相同,都有各自的适用域和局限性,对智能优化算法自身做的改进在算法性能方面得到了一定程度的提升,但算法缺点的解决并不彻底。

为了克服使用单一智能优化算法在求解复杂问题中表现出的精度不高、易陷入局部最值、不能在全局搜索等一系列不足,算法融合的思想开始被研究和应用。因此本文将SA与PSO这两种经典算法进行融合,并辅以改进,从而利用它们的互补性,取长补短,提高求解复杂问题的能力。

00 文章目录

1 研究背景
2 模拟退火-粒子群自适应优化算法模型
3 代码目录
4 算法性能分析
5 源码获取

01 研究背景

1.1 SA与PSO混合意义

无免费午餐定理,对任何优化问题,任两种优化算法的平均性能是相等的,没有任何一种优化算法在计算效率、通用性、全局搜索能力等性能方面都能表现得很好。

算法的混合也就成了算法优化领域的一个研究热点和趋势,混合有着固有的内在需求,不是简单地将算法组合叠加,要按照一定的策略和模式进行。

模拟退火算法(SA)是基于金属退火的机理而建立起的一种全局最优化方法,模拟退火算法由于它以某种概率接受较差点,从而具有跳出局部最优解的能力,理论上只要计算时间足够长, 模拟退火法就可以保证以概率 1.0 收敛于全局最优点,但在实际算法实现中,由于计算速度和时间限制,其优化效果和计算时间存在矛盾,收敛时间往往过长。
PSO算法原理简单,用速度、位移公式迭代易于实现,需要调节的参数少,在寻优稳定性和全局性收敛性方面具有很大优势,但容易陷入局部最优值出现早熟,种群多样性差,搜索范围小,在高维复杂问题寻优时更为明显。

因此,将模拟退火引入粒子群算法中后,算法能够具有较强的全局搜索能力,在接受新解时既可以接受好解又可以接受差解,从而保证种群多样性,有利于跳出局部最优解,提高其收敛速度和寻优精度。同时,作者在前面的文章中提出的自适应混沌粒子群能够使得初始解更加均匀,自适应变化的权重和学习因子能在一定程度上增加算法在进化后期搜索多样解的概率,因此将此改进引入混合模型中以期能提高算法性能。

1.2 模拟退火算法

模拟退火是80年代初发展起来的一种随机性组合优化方法。它模拟高温金属降温的热力学过程,并广泛应用于组合优化问题。模拟退火在进行优化时先确定初始温度,随机选择一个初始状态并考察该状态的目标函数值;对当前状态附加一小扰动,并计算新状态的目标函数值;以概率 1接受较好点,以某种概率接受较差点作为当前点,直到系统冷却。
模拟退火方法在初始温度足够高、温度下降足够慢的条件下,能以概率1收敛到全局最优值,由于它以某种概率接受较差点,从而具有跳出局部最优解的能力。

模拟退火算法采用 Metropolis 准则,在算法的每一步随机产生一个新的候选解,如果这个新解使目标函数减小那么它是可以接受的;否则要以指数概率的形式来决定它是否接受,接受新解的概率P由下式给出:在这里插入图片描述

式中‚Δf 是由随机扰动引起的目标函数的变化;T是温度,从式中不难看出,对于一个给定的 Δf,当 T 相对较大时,接受正能量的概率大于 T 相对较小时的概率。整个过程归结如下:

  1. 初始化退火温度Tk,(令k=0)随机选择初值 x(0);
  2. 在温度Tk下重复执行如下操作,直至达到温度Tk的平衡状态:
    在解x的领域中产生新的可行解x’
    计算x’的目标函数f(x’)和x的目标函数f(x)的差值Δf;
    依照概率min{1,exp(-Δf/Tk)}>random[0,1] 接收x’,其中random[0,1]是区间内的随机数。
  3. 退火操作:Tk+1=CTk,其中C在0-1直接,若满足收敛判据,则退火过程结束,否则转2)
    其中退火温度T控制着求解过程向最优值的优化方向进行,同时它又以概率exp(-Δf/Tk)来接收劣质解,因此算法可以跳出局部极值点,只要初始温度足够高,退火过程足够慢,算法 就能收敛到全局最优解。

1.3 自适应粒子群算法

自适应混沌粒子群

02 模拟退火-粒子群自适应优化算法模型

粒子群算法在函数优化过程中主要依赖粒子之间的信息不断更新粒子的位置和速度,使其不断向最优解方向靠拢。 PSO 算法存在易早熟,易陷入局部最优,后期收敛速度较慢,搜索精度较差等缺点。模拟退火算法具有很强的全局搜索能力,存在接受较差解的可能,在运算时遇到较差解能够以一定的概率接受,从而可以跳出局部最优解陷阱,收敛于全局最优解区域,拥有较高的搜索精度,但在算法运算时,因其需要非常高的退火温度,故收敛速度十分缓慢。PSO 算法和 SA 算法各具优缺点,因此本文采用融合粒子群和模拟退火的模拟退火粒子群算法,融合的方法是引入模拟退火的概率突跳的思想,以克服 PSO 算法早熟收敛的弊端,改善 SA 算法收敛速度慢的缺点,从而提升了算法的整体性能。
模拟退火-粒子群自适应优化算法流程如图所示.
参考:基于遗传模拟退火粒子群算法的微电网优化运行研究
在这里插入图片描述
在这里插入图片描述

其中,粒子群算法部分将分别采用作者前面提到的自适应混沌粒子群算法与标准粒子群算法。

03 代码目录

在这里插入图片描述

04 算法性能分析

4.1 测试函数

为了能够验证遗传-粒子群自适应算法对比本文提到的粒子群算法、遗传算法、遗传-粒子群算法有更好的效果,本文选用3个CEC的标准测试函数Sphere、Rastrigin、Rosenbrock对算法的寻优精度、跳出局部能力、全局寻优能力进行检验。3个函数的表达式如下:
4.1.1 Sphere函数
在这里插入图片描述

Sphere 函数的自变量𝑥𝑖的取值的范围:-100<𝑥𝑖<100;该函数存在唯一的一个全局的最小值,且当𝑥=(0,0,…,0)时,函数取得全局最小值 f1(x) = 0。选择该函数是对算法寻优的精度进行测试。
在这里插入图片描述

4.1.2 Rastrigin函数
在这里插入图片描述

Rastrigin 函数的自变量𝑥𝑖的取值的范围:-5.12<𝑥𝑖<5.12;在 x = ( 0,0 ,…, 0 ) 处的时候存在全局极小点 0,该函数是一个非线性的多峰值函数,存在大量的局部最小值,寻找全局极小值时有一定的困难,因此用此函数可以,对算法的全局寻优能力检验测试。
在这里插入图片描述

4.1.3 Rosenbrock函数
在这里插入图片描述

Rosenbrock 函数的自变量𝑥𝑖的取值的范围:-30<𝑥𝑖<30;该函数是一单峰函数, 存在全局极小值,位于一个类似开口向上的抛物线的最低点处,虽然能够比较容易找到,但是很难收敛到最低处,因此可以测试全局寻优的能力。
在这里插入图片描述

4.2 测试结果

Sphere函数
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到SA-IPSO和SA-PSO的收敛速度以及精度都远好于PSO,而SA达到最优解需迭代超万代,因此改进的算法是十分高效可行的。
Rastrigin函数
在这里插入图片描述
在这里插入图片描述

Rosenbrock函数
在这里插入图片描述
在这里插入图片描述

可以看到经模拟退火算法和粒子群算法经混合后能够极大的提升其全局寻优的性能,而经过改进后的粒子群与遗传算法进行混合仍能够在其基础上提升性能,因此此改进有效。

05 源码获取

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

https://mbd.pub/o/bread/ZJuVmZhu

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

如果有伙伴有待解决的优化问题(各种领域都可),可以发我,我会选择性的更新利用优化算法解决这些问题的文章。

如果这篇文章对你有帮助或启发,可以点击右下角的赞 (ง •̀_•́)ง(不点也行),若有定制需求,可私信作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生公寓智能电表控电系统的技术要求

学生公寓电表智能控电石家庄光大远通电气有限公司模块采用高精度计量芯片,的计量计费功能。 控制路数:可输出1~4路输出,每个回路都可以设置负载识别,定时断送过载功率等控电参数。 自动断电 :具有自动断电功能,可用电量为0时,应自动切断该分路电源 支持正…

创建Spring CloudDEMO流程

创建普通的maven工程作为父工程 然后设置字符集为UTF-8 再注解生效激活 java编译版本选择8 idea文件忽略(忽略乱七八糟的文件) *.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;vssver2.scc;.idea;*.iml…

TencentOS3.1安装PHP+Nginx+redis测试系统

PHP和Nginx应用统一安装在/application下。 Nginx选用了较新的版本1.25.0 官网下载安装包,解包。执行如下命令编译: ./configure --prefix/application/nginx-1.25.0 --usernginx --groupnginx --with-http_ssl_module --with-http_stub_status_modu…

win系统电脑在线打开sketch文件的方法

自Sketch诞生以来,只有Mac版本。Windows计算机如何在线打开Sketch文件? 即时设计已经解决了你遇到的大部分问题,不占用内存也是免费的。 您可以使用此软件直接在线打开Sketch文件,完整预览并导出CSS、SVG、PNG等,还具…

解析JSON格式数据

解析JSON格式数据 比起XML,JSON的体积更小,语义性更差 传入的JSON文件如下 使用JSONObject private fun parseJSONWithJSONObject(jsonData: String) { try { val jsonArray JSONArray(jsonData) for (i in 0 until jsonArray.length()){ val j…

视频去除水印怎么弄?这几个实用方法分享给大家!

在我们观看或分享视频时,可能会遇到一些带有水印的视频。这些水印可能会影响我们的观看体验,或者在我们需要使用这些视频时造成不便。下面,我将为你介绍三种去除视频水印的方法。 方法一:使用记灵在线工具 记灵在线工具是一个非…

Leetcode:684. 冗余连接(并查集C++)

目录 684. 冗余连接 题目描述: 实现代码与解析: 并查集 原理思路: 684. 冗余连接 题目描述: 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的…

Python安装解释器

文章目录 一、下载Python解释器二. Linux环境的安装三. pycharm创建项目四、验证安装是否成功 一、下载Python解释器 首先,您需要从官方Python网站(https://python.org)下载Python解释器。Python的当前稳定版本是3.9.x系列。网站上提供了针对…

Anoym:一种以组合质押策略为特点的 LSD 设施

LSD(Liquid Staking Derivatives),即流动性质押衍生品,目前主要包括Lido、Frax等主要项目,它是伴随着ETH 2.0升级成长起来的DeFi衍生品赛道。ETH 2.0 以 POS 为共识机制,节点需要质押 32 ETH 才能参与网络维…

三分钟了解 RocketMQ消息队列

文章目录 基本概念详细介绍主题(Topic)消息类型(MessageType)消息队列(MessageQueue)消息(Message)消息视图(MessageView)消息标签(MessageTag&am…

【Linux后端服务器开发】Shell外壳

目录 一、Shell外壳概述 二、描述Shell外壳原理的生动例子 三、C语言模拟实现Shell外壳 一、Shell外壳概述 在狭义上 , 我们称Linux操作系统的内核为 Linux 在广义上 , Linux发行版 Linux内核 外壳程序 就比如市面上现在的redhat, centos, ubuntu等等我们耳熟能详的Linux发…

Apache Tomcat 信息泄露漏洞CVE-2023-28708处理

一、漏洞描述 Apache Tomcat软件是Jakarta Servlet、 Jakarta Server Pages、 Jakarta Expression Language、 Jakarta WebSocket、 Jakarta Annotations和 Jakarta Authentication 规范的开源实现 。Apache Tomcat实现了对Servlet和JavaServer Page(JSP&#xff09…

C++输出编译器名称和版本以及编译器位数、C/C++常见编译器

使用C输出编译器的名称、版本和位数 #include<iostream>int main() {#ifdef __clang__std::cout << "Compiler: Clang" << std::endl;std::cout << "Version: " << __clang_major__ << "." << __cla…

Anaconda配置可视化绘图库seaborn的方法

本文介绍在Anaconda的环境中&#xff0c;安装Python语言中&#xff0c;常用的一个绘图库seaborn模块的方法。 seaborn模块是基于Matplotlib的数据可视化库&#xff0c;它提供了一种更简单、更漂亮的界面来创建各种统计图形。seaborn模块主要用于数据探索、数据分析和数据可视化…

多线程与并发编程【守护线程、线程同步】(三)-全面详解(学习总结---从入门到深化)

目录 守护线程 什么是守护线程 守护线程的使用 线程同步 实现线程同步 线程同步的使用 守护线程 什么是守护线程 在Java中有两类线程&#xff1a; User Thread(用户线程)&#xff1a;就是应用程序里的自定义线程。 Daemon Thread(守护线程)&#xff1a;比如垃圾回收线程&am…

串口问题案例分享

最近在调试一个新板子的时候&#xff0c;发现一个问题&#xff0c;板子使用的是一个国产的处理器芯片&#xff0c;表现为如果板子232串口的发送和接收与电脑串口连接时&#xff0c;板子可以正常进入系统。 但是如果板子与电脑只接232串口的发送信号&#xff0c;不接232串口的接…

Java入门--字面量

字面量 字面量是指在代码中直接表示特定的常量或值&#xff0c;可以是整数&#xff0c;浮点数&#xff0c;布尔值&#xff0c;字符等 演示 整数和小数 System.out.println(666);//小数System.out.println(99.5);快捷写法&#xff1a;666.sout 加回车 字符 字符必须用单引号…

docker安装es集群(三台)

文章目录 1、防火墙设置&#xff0c;开启所需端口2、创建目录&#xff0c;并更改目录权限3 设置系统参数4 启动5 安装ik分词器6 配置7 安装elasticsearch-head&#xff08;用于访问es&#xff0c;界面化工具&#xff09;8、 修改es中每次返回的数据数量参数&#xff08;默认100…

剑指offer55-II.平衡二叉树

我这个方法比较笨&#xff0c;用的是用的是昨天写的求二叉树深度的方法&#xff0c;先定义dfs求二叉树深度的方法&#xff0c;再定义cur方法&#xff0c;比较左子树和右子树的深度&#xff0c;递归比较每一个子树的左子树和右子树的深度&#xff0c;一旦有一个不平衡就把flag改…

vue3使用Eharts案例

文章目录 安装Eharts代码演示最终效果 安装Eharts 官方快速上手地址 npm install echarts --save代码演示 <script setup> import {onMounted, ref} from "vue"; // import echarts from "echarts"; import * as echarts from echarts; const opt…