【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 第五函数的图像。

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所示,其中展示了最优点、最优值、当前点和当前值等优化信息。算法在点 (-31.9772, -31.9778) 处找到了函数的最小值。
关于计算结果
由于模拟退火算法是一种随机算法,在优化过程中存在随机选择的因素,因此每次运行相同的命令,结果可能会有所不同。有时算法可能会陷入局部最优,导致某些结果较大。为了获得更理想的解,即更小的目标函数值,通常需要多次调用优化函数,并在多次计算结果中选择最优的结果作为最终输出。
在模拟退火算法的计算过程中,MATLAB 使用了均匀随机数和正态随机数生成器。决定是否接受新的点时,算法会使用 rand 和 randn 函数进行选择。由于每次调用 rand 和 randn 函数时,其种子都会发生变化,因此每次调用这些函数时都会生成不同的随机数。
如果需要精确地再现计算结果,可以在调用 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日
相关文章:
【MATLAB】模拟退火算法
模拟退火算法的MATLAB实现 模拟退火算法简介模拟退火算法应用实例关于计算结果 模拟退火算法简介 1982年,Kirkpatrick 将退火思想引入组合优化领域,提出了一种能够有效解决大规模组合优化问题的算法,尤其对 NP 完全问题表现出显著优势。模拟…...
什么是Kubernetes RBAC?
什么是Kubernetes RBAC? 1、什么是RBAC?2、核心组件3、优势💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes集群中,RBAC(基于角色的访问控制)是保障系统安全的关键。它通过角色和绑定管理不同实体对资源的访问权限,具有显著优势: 1、什么是RBAC? RBAC是Kube…...
在Spring Boot中通过自定义注解、反射以及AOP(面向切面编程)
在Spring Boot中,通过自定义注解、反射以及AOP(面向切面编程)来动态修改请求参数是一种高级且强大的技术组合,它允许开发者在不修改原始方法实现的情况下,对方法的执行过程进行干预和定制。这种技术通常用于日志记录、…...
安防监控视频平台LntonAIServer视频智能分析平台新增视频质量诊断功能
随着安防行业的快速发展,视频监控系统已经成为维护公共安全和个人隐私的重要工具。然而,由于各种因素的影响,视频流的质量可能会受到影响,从而导致监控效果不佳。为了解决这一问题,LntonAIServer推出了全新的视频质量诊…...
vscode从本地安装插件
1. 打开VSCode。 2. 点击左侧菜单中的“扩展”(或按CtrlShiftX)。 3. 点击“更多操作”(三个点)> “从VSIX安装”。 4. 选择下载的.vsix文件。 5. 点击“安装”即可安装插件。...
Superset二次开发之新增复选框Checkbox筛选器
一. 背景 Superset目前支持的筛选类型:值、数值范围、时间列、时间粒度、时间范围 5种类型,显然无法满足业务需求。根据产品需要,需要支持复选框、单选框、级联选择等类型的筛选器。本文探讨复选框、单选框的技术实现方式。 二. 效果预览 三. 实现思路 复用 值 筛选器模块,…...
PromQL 语法
什么是 PromQL PromQL (Prometheus Query Language) 是 Prometheus 监控系统中用于查询时间序列数据的语言。它允许用户编写查询,以从 Prometheus 中检索并处理监控数据。 PromQL 的基础概念 1. 时间序列 Prometheus 中的时间序列由以下几个部分组成:…...
掌握Go语言中的时间与日期操作
Go语言中的时间与日期操作 在编写程序时,处理时间和日期看似是一项无关紧要的任务,但在需要同步多个任务或从文本文件中读取时间时,它的重要性便凸显出来。Go语言中的time包为我们提供了丰富的时间与日期操作功能。本文将详细介绍如何在Go语…...
4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)
MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构&…...
spring数据校验Validation
文章目录 需要的依赖创建校验对象Validator 需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>创建校验对象Validator 测试的实体类 //创建…...
Uniapp基于uni拦截器+Promise的请求函数封装
最近在学Uniapp,到封装请求的时候本来还想用axios,但是看到一些教学视频有更简单的方法, 基于uni的拦截器和Promise封装的请求函数 但是他们是用TS写的,还没学到TS,我就把JS写了,最终也是请求成功 // src/…...
【工具】使用 Jackson 实现优雅的 JSON 格式化输出
说明 在 Java 开发中,我们经常需要处理 JSON 数据。无论是从服务器端返回的数据,还是本地存储的数据,JSON 格式都因其轻量级和易于解析的特点而被广泛使用。当我们需要查看或调试 JSON 数据时,优雅、格式化的输出将大大提高我们的…...
ApacheKafka中的设计
文章目录 1、介绍1_Kafka&MQ场景2_Kafka 架构剖析3_分区&日志4_生产者&消费者组5_核心概念总结6_顺写&mmap7_Kafka的数据存储形式 2、Kafka的数据同步机制1_高水位(High Watermark)2_LEO3_高水位更新机制4_副本同步机制解析5_消息丢失问…...
.NET 自定义过滤器 - ActionFilterAttribute
这个代码片段定义了一个自定义的 ASP.NET Core 过滤器(GuardModelStateAttribute),用于在控制器动作执行之前验证模型状态(ModelState)。如果模型状态无效,则构造一个 ProblemDetails 对象来描述错误&#…...
VMware Fusion Pro 13 for Mac虚拟机软件
Mac分享吧 文章目录 效果一、下载软件二、开始安装安装完成!!! 效果 一、下载软件 下载软件 地址:www.macfxb.cn 二、开始安装 安装完成!!!...
HarmonyOS应用开发环境搭建
本文主要讲述的是HarmonyOS应用开发环境的搭建,HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造,为运行在HarmonyOS系统上的应用和服务提供一站式的开发平台。具体下载链接DevEco Studio 一、下载 DevEco Studio 只需要下载对应的版本&…...
YOLOv8改进实战 | 注意力篇 | 引入ICCV2023顶会LSKNet:大选择性卷积注意力模块LSKA,助力小目标检测
YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前…...
00Mac安装playwright
文章目录 前言一、执行以下命令安装二、安装如果报错zsh: command not found: pip三、安装浏览器驱动 前言 现在常用的三个自动化测试(或者爬虫)库,是Selenium、Puppeteer、Playwright。Playwright是未来趋势,主要学习Playwright…...
materail3 CircularProgressIndicator和LinearProgressIndicator有难看的白块和断点
看看,就是这个垃圾效果: 圆圈的进度条有断点,不连接; 横线进度条,有尾部亮色,进度处又有分割。 它的原出处在这里:https://m3.material.io/components/progress-indicators/overview࿰…...
菜鸟入门Docker
初始Docker Docker的概念 Docker的用途 DOcke的安装 Docker架构 配置Docker镜像加速器 Docker常用命令 Docker服务相关的命令。 Docker镜像相关的命令 Docker容器相关的命令 容器的数据卷 数据卷的概念和作用 配置数据卷 Docker应用部署 Docker部署mysql Docker…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
