【MATLAB】模拟退火算法

模拟退火算法的MATLAB实现

  • 模拟退火算法简介
  • 模拟退火算法应用实例
  • 关于计算结果

模拟退火算法简介

1982年,Kirkpatrick 将退火思想引入组合优化领域,提出了一种能够有效解决大规模组合优化问题的算法,尤其对 NP 完全问题表现出显著优势。模拟退火算法的灵感源自固体退火过程,即先将温度升至极高,然后缓慢降温(即退火),使系统达到能量的最低点。相较于快速降温(即淬火)无法达到最低能量状态,退火的缓慢降温过程更有助于系统找到全局最优解。

模拟退火算法是一种适用于求解最小化问题或更新学习过程(随机或确定性)的随机搜索算法。在该过程中,每一步的更新长度与对应的参数成正比,这些参数类似于物理过程中的温度。在优化开始时,为了更快地实现最小化或学习,温度被设置得很高,随后逐渐降温以实现系统的稳定性。

这算法将物理系统的退火过程类比于优化问题的求解过程,优化的目标函数对应于金属的内能,优化问题的自变量组合状态空间对应于金属的内能状态空间,求解过程即是在组合状态空间中寻找目标函数值最小的组合状态。

根据 Metropolis 准则,粒子在温度 T \mathrm{T} T 时趋于平衡的概率为 exp ⁡ ( − △ E / ( k T ) ) \exp(-\bigtriangleup E/(k\mathrm{T})) exp(E/(kT)) ,其中 E E E 为温度 T \mathrm{T} T 时的内能, △ E \bigtriangleup E E 为其变化量, k k k 为 Boltzmann 常数。将固体退火过程模拟到组合优化问题中,内能 E E E 对应于目标函数值 f f f,温度 T \mathrm{T} T 演化为控制参数 t t t,从而得出模拟退火算法:从初始解 i i i 和控制参数初值 t t t 开始,对当前解反复进行 “生成新解、计算目标函数差、接受或舍弃” 的迭代,并逐步衰减 t t t 值。算法终止时的当前解即为近似最优解。这是基于蒙特卡罗迭代求解方法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数初值 t t t 及其衰减因子 △ t \bigtriangleup t t、每个 t t t 值时的迭代次数 L L L 和停止条件 S S S 等。

模拟退火算法应用实例

MATLAB 遗传算法和模式搜索工具箱提供了 simulannealbnd 函数,用于通过模拟退火算法求解无约束或带有边界约束的多变量最小化问题。该函数的调用语法如下:

  • x = simulannealbnd(fun, x0):从初始值 x0 开始,搜索目标函数 fun 的最小值 x。目标函数的输入为变量 x,并在 x 处返回一个标量值。x0 可以是标量或向量。
  • x = simulannealbnd(fun, x0, lb, ub):在边界条件 lb 和 ub 的约束下,优化求解目标函数 fun。
  • x = simulannealbnd(fun, x0, lb, ub, options):使用自定义的 options参数,而非默认值,进行优化求解。
  • x = simulannealbnd(problem):求解 problem,其中 problem 是一个包含输入变量的结构体。
  • [x, fval] = simulannealbnd(...):返回点 x 处的目标函数值 fval。
  • [x, fval, exitflag] = simulannealbnd(...):返回退出标志 exitflag,用于描述函数计算的退出条件。
  • [x, fval, exitflag, output] = simulannealbnd(fun, ...):返回结构体 output,其中包含优化过程中的信息。

【例1】 求解 MATLAB 自带的测试函数 De Jong 第五函数的最小值。De Jong 第五函数是一个具有多个局部极小值的二维函数。在 MATLAB 命令行中输入 dejong5fcn 可查看 De Jong 第五函数的图像,如图 1 所示。

>> dejong5fcn% 注意:命令行中输入查看 De Jong 第五函数的图像。

在这里插入图片描述

图1. De Jong 第五函数

x0 = [0 0];
[x,fval] = simulannealbnd(@dejong5fcn,x0)% 注意:.m文件名必要和simulannealbnd一样,否则报错。

运行结果:

在这里插入图片描述


另外,在具有上下边界条件约束的情况下也可以调用simulannealbnd数来求解:

x0 = [0 0];
lb = [-64 -64];  % 下边界约束
ub = [64 64];   % 上边界约束
[x,fval] = simulannealbnd(@dejong5fcn,x0,lb,ub)

运行结果:

在这里插入图片描述

在优化过程中,可以实时绘制图像,显示优化信息,包括当前迭代中的最优点、最优值、当前点和当前值等。可以使用以下 MATLAB 命令实现这一功能。

x0 = [0 0];
options = saoptimset('PlotFcns' {@saplotbestx, @saplotbestf, @saplotx, @saplotf});  %绘图参数设置
simulannealbnd(@dejong5fcn, x0, [ ], [ ], options)

运行结果:

在这里插入图片描述


在这里插入图片描述

图2. 使用模拟退火算法优化 De Jong 第5函数

在模拟退火算法的运行过程中,程序实时显示了结果的图形。最终生成的图像如图2所示,其中展示了最优点、最优值、当前点和当前值等优化信息。算法在点 (-31.9772, -31.9778) 处找到了函数的最小值。

关于计算结果

由于模拟退火算法是一种随机算法,在优化过程中存在随机选择的因素,因此每次运行相同的命令,结果可能会有所不同。有时算法可能会陷入局部最优,导致某些结果较大。为了获得更理想的解,即更小的目标函数值,通常需要多次调用优化函数,并在多次计算结果中选择最优的结果作为最终输出。

在模拟退火算法的计算过程中,MATLAB 使用了均匀随机数和正态随机数生成器。决定是否接受新的点时,算法会使用 randrandn 函数进行选择。由于每次调用 randrandn 函数时,其种子都会发生变化,因此每次调用这些函数时都会生成不同的随机数。

如果需要精确地再现计算结果,可以在调用 simulannealbnd 函数时返回 output 结构数组。output 结构数组中包含了当前随机数生成器的种子状态。在再现计算前,可以将种子设置为 output 中保存的种子。例如,在使用模拟退火算法计算 De Jong 第5函数的最优值时,可以返回变量 output,相应的 simulannealbnd 调用语法为:

[x, fval, exitflag, output]= simulannealbnd(@dejong5fcn, [0 0]);

运行结果:

随机种子包含在 output.rngstate 中,可以通过以下命令重新设置随机数生成器的状态。如果现在再次运行 simulannealbnd 命令,就可以验证是否得到与上次相同的结果。

>> set(RandStream.getGlobalStream,'State', output.rngstate.State);
>> [x, fval, exitflag, output]= simulannealbnd(@dejong5fcn, [0 0])% 注意:这两句在运行过一次退火寻优后,在命令行中直接运行。

运行结果:

在这里插入图片描述


不过,如果不需要重复验证结果,最好不要设置随机种子。因为不设置种子可以充分利用模拟退火算法的随机性,增加获得更优结果的机会。其他具有随机性的算法,如遗传算法等,也具有类似的特性,此处不再赘述。


END
2024年9月7日

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32+ESP8266+MQTT协议连接阿里云实现温湿度上传

前期步骤: ESP8266下载固件→连接阿里云-CSDN博客 keil文件:大家可以直接下载,也可以在后台私信我获取 《STM32ESP8266MQTT协议连接阿里云实现温湿度上传》 keil文件源码 一、代码修改部分 1、mqtt.h文件中的修改 2、wifi.h文件中的修改 3、main.…

MWORKS 2024b 新版发布:全球首创的Julia静态代码生成

MWORKS 2024b现已正式发布!上一版本自发布以来便受到广泛关注,用户遍及航天、航空、车辆、能源等各大产业及全国超过200所高校。在取得一系列应用成果的同时,也在吸纳海量用户反馈。MWORKS 2024b的重磅升级包括以下几个方面: 1.两…

ST官方 VSCode 插件安装及配置工程参考

写在前头 VSCode的用法和插件是月初参加ST官方北京站举办的线下培训中,厂家AE工程师给我们讲的,不同于已经很多人用的(并且一直在吵的)keil assistant什么的,用的是CMake编译,抛弃了原有的keil,…

ASUS华硕ROG幻16 Air 2024款锐龙AI版GA605WI,GA605WV工厂模式原厂Win11系统,含MyASUS WinRE恢复重置还原功能

适用型号:【GA605WI、GA605WV】,原装出厂Windows11系统工厂包下载 链接:https://pan.baidu.com/s/1IVolLwB7fddGKZY0IxOqaA?pwd62e2 提取码:62e2 华硕原装系统工厂安装包,带有MyASUS WinRE RECOVERY恢复功能、自带…

控价中数据清洗有什么创新方法

在品牌控价的过程中,数据清洗犹如一把精准的雕刻刀,雕琢出准确而有价值的信息宝藏。以下是关于有效进行数据清洗的创新之策: 智能清洗助手 引入先进的人工智能技术,打造智能数据清洗助手。通过机器学习算法,让助手自…

CCF推荐B类会议和期刊总结:(计算机网络领域)

CCF推荐B类会议和期刊总结(计算机网络领域) 在计算机网络领域,中国计算机学会(CCF)推荐的B类会议和期刊代表了该领域的较高水平。以下是对所有B类会议和期刊的总结,包括全称、出版社、dblp文献网址以及所属…

【Qt网络编程基础】Tcp服务器和客户端(只支持一对一)

目录 一、编写思路 1、服务器 总体思路 详细思路 1. 构造函数 (Widget::Widget) 2. 启动监听 (Widget::on_btn_start_clicked) 3. 停止监听 (Widget::on_btn_cease_clicked) 4. 发送消息 (Widget::on_btn_info_clicked) 5. 接收消息 (Widget::receive_message) 6. 处…

了解Redis集群概念,集群如何选举主节点

请给胡广一个免费的三连吗?感谢! 1. Redis集群 1.1 集群概念 Redis主从架构和Redis集群架构是两种不同的概念,大家刚接触Redis时经常弄混淆。胡广给大家贴下Redis官网对两者的解释。 (1)Redis主从架构 Redis主从实…

通讯录

在写一个程序前需要了解的知识,需要对通讯录的流程了如指掌,才能写出一个完整的程序 。 写一个主函数,里面包含菜单、对菜单的选择、以及循环。创建个人信息结构体,多人构成的结构体数组。分析每一个函数: 1).增加信…

图文教程 | 2024年IDEA安装使用教程,JDK简易下载方法

前言 📢博客主页:程序源⠀-CSDN博客 📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正! 目录 一、IDEA安装 二、激活 三、JDK安装 四、JDK环境配置 五、验证 一、IDEA安装 进入官网下载: Other…

模拟网络丢包常用方法以及工具

文章目录 背景常用方法代码实现使用方法测试代码 使用网络流量控制工具 常用工具Clumsy 背景 在软件开发过程中,经常需要模拟不同的网络环境来测试应用在不同条件下的表现。 这些模拟可以采用多种方式进行,包括在代码中实现随机丢包、随机延时、乱序&am…

C++ IO流全解析:标准库中的数据处理与文件读写艺术

🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 一: 🔥 C语言的输入与输出 二: 🔥 流是什么 三: 🔥 CIO流🚀 3.1 C标准IO流🚀 ist…

野生动物检测-目标检测数据集(包括VOC格式、YOLO格式)

野生动物检测-目标检测数据集(包括VOC格式、YOLO格式) 数据集: 链接:https://pan.baidu.com/s/1RHpKHAyRyl0FDD4Up3MOmQ?pwdrbjq 提取码:rbjq数据集信息介绍: 共有 1504 张图像和一一对应的标注文件 标…

QStackedWidget类的使用

本文介绍QStackedWidget类的使用。 StackedWidget控件在Qt应用程序开发过程中用的还是比较多的,配合按钮可以实现多个页面之间相互切换,方便了应用程序的开发,本文简要介绍QStackedWidget类实际使用过程中的常用方法,并给出一个简…

Python画笔案例-042 绘制空心十字架

1、绘制空心十字架 通过 python 的turtle 库绘制空心十字架,如下图: 2、实现代码 绘制空心十字架,以下为实现代码: """空心十字架.py """ import turtledef draw_pattern(length):for _ in range(…

Java 学习中使用文件、网络连接等资源时,未正确关闭资源,导致资源泄漏应该怎么办?

在Java编程中,处理文件、网络连接、数据库连接等资源时,如果没有正确关闭资源,就会发生资源泄漏。资源泄漏会导致系统性能下降、内存占用增加,甚至可能导致程序崩溃,特别是在高负载的系统中。 一、什么是资源泄漏&…

仕考网:哈尔滨2024下半年事业单位招考公告

招聘岗位需求计划 本次计划招聘事业单位工作人员共计588名。具体招聘单位、岗位、人数、条件等情况详见《哈尔滨市2024年下半年事业单位公开招聘工作人员岗位计划表》 年龄要求: 满18周岁(2006年9月18日以前出生)、35(含)周岁以下(1988年9月18日及以后出生) 博士…

基于SpringBoot+Vue的考研学习分享互助平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的考研学习…

企业图纸加密软件哪个最好用?10款常用图纸加密软件强力推荐!

在现代企业中,保护图纸和设计文件的安全性至关重要。以下是十款常用且功能强大的图纸加密软件推荐,帮助企业更好地保护其知识产权和敏感数据。 1. 安秉网盾 安秉网盾凭借其强大的加密技术和灵活的权限管理功能,成为企业保护图纸安全的首选。…

JavaScript高级——函数中的this

1、this是什么? ① 任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是 window 。 ② 所有函数内部都有一个变量 this 。 ③ 它的值是调用函数的当前对象。 2、如何确定 this 的值? ① test()&#xff…