【算法】退火算法 Simulated Annealing
退火算法(Simulated Annealing, SA)是一种基于热力学模拟的优化算法,用于求解全局优化问题。它通过模拟物理退火过程来寻找全局最优解。以下是退火算法的基本原理和步骤:
一、基本原理
退火算法的灵感来源于金属在高温下缓慢冷却至低温的过程,这一过程中,金属原子逐渐排列成能量最低的晶格结构。类似地,退火算法通过模拟这一过程,在解空间中逐渐收敛到全局最优解。
二、算法步骤
-
初始解与温度设定:
- 随机生成一个初始解。
- 设定初始温度 T 。
-
循环过程:
- 在当前解的邻域内随机生成一个新解。
- 计算新解与当前解的目标函数值差异ΔE。
- 如果 ΔE≤0,接受新解(新解更优)。
- 如果 ΔE>0,以概率 P=exp(−ΔE/T) 接受新解(防止陷入局部最优)。
- 逐步降低温度 T(根据某个降温函数,如T=T×α,其中 α 为冷却速率,通常 0.8≤α≤0.99)。
-
终止条件:
- 当温度 T 低于某一阈值时,停止循环。
- 或者达到预设的最大迭代次数时,停止循环。
伪代码
function SimulatedAnnealing(InitialSolution, InitialTemperature, CoolingRate, StoppingTemperature):currentSolution = InitialSolutioncurrentTemperature = InitialTemperaturewhile currentTemperature > StoppingTemperature:newSolution = GenerateNeighbor(currentSolution)deltaE = Evaluate(newSolution) - Evaluate(currentSolution)if deltaE < 0:currentSolution = newSolutionelse if exp(-deltaE / currentTemperature) > random():currentSolution = newSolutioncurrentTemperature = currentTemperature * CoolingRatereturn currentSolution
三、应用领域
退火算法在许多领域得到了广泛应用,包括但不限于:
- 组合优化问题,如旅行商问题(TSP)。
- 连续优化问题,如函数最优化。
- 工程设计优化,如电路设计、结构优化等。
应用举例:旅行商问题(Traveling Salesman Problem, TSP)
旅行商问题是经典的组合优化问题,描述的是一名旅行商需要访问若干城市并返回出发城市,要求访问每个城市一次且总距离最短。
问题描述
给定若干城市和城市间的距离矩阵,找到一个访问所有城市的最短路径。
退火算法求解TSP步骤
-
初始解与温度设定:
- 随机生成一个初始路径作为初始解。
- 设定初始温度 T 和降温速率 α。
-
生成邻域解:
- 在当前路径中随机交换两个城市的位置,生成一个新路径。
-
目标函数:
- 计算路径的总距离。
-
接受新解的准则:
- 根据退火算法的准则接受或拒绝新解。
import random
import mathdef simulated_annealing(dist_matrix, initial_temp, cooling_rate, stopping_temp):def total_distance(path):return sum(dist_matrix[path[i]][path[i+1]] for i in range(len(path) - 1)) + dist_matrix[path[-1]][path[0]]def swap_two_cities(path):new_path = path[:]i, j = random.sample(range(len(path)), 2)new_path[i], new_path[j] = new_path[j], new_path[i]return new_pathcurrent_solution = list(range(len(dist_matrix)))random.shuffle(current_solution)current_distance = total_distance(current_solution)current_temp = initial_tempbest_solution = current_solution[:]best_distance = current_distancewhile current_temp > stopping_temp:new_solution = swap_two_cities(current_solution)new_distance = total_distance(new_solution)delta_distance = new_distance - current_distanceif delta_distance < 0 or math.exp(-delta_distance / current_temp) > random.random():current_solution = new_solutioncurrent_distance = new_distanceif new_distance < best_distance:best_solution = new_solutionbest_distance = new_distancecurrent_temp *= cooling_ratereturn best_solution, best_distance# 示例距离矩阵
distance_matrix = [[0, 10, 15, 20],[10, 0, 35, 25],[15, 35, 0, 30],[20, 25, 30, 0]
]initial_temperature = 1000
cooling_rate = 0.95
stopping_temperature = 0.01best_path, best_path_distance = simulated_annealing(distance_matrix, initial_temperature, cooling_rate, stopping_temperature)print("最短路径:", best_path)
print("最短路径距离:", best_path_distance)
解释
- total_distance: 计算路径的总距离。
- swap_two_cities: 在路径中随机交换两个城市的位置,生成一个新路径。
- simulated_annealing: 退火算法的主函数,接受距离矩阵、初始温度、冷却速率和停止温度作为参数。
- distance_matrix: 一个示例距离矩阵,定义了各个城市之间的距离。
- initial_temperature, cooling_rate, stopping_temperature: 退火算法的参数。
运行此代码将输出最短路径及其对应的总距离。
结果示例
最短路径: [0, 2, 3, 1]
最短路径距离: 80
四、优缺点
优点:
- 能够逃避局部最优,找到全局最优解。
- 适用于各种复杂优化问题。
- 实现相对简单,参数可调节性强。
缺点:
- 计算量较大,尤其在早期迭代阶段。
- 参数设置(初始温度、冷却速率、停止温度等)对算法性能影响较大,需要实验调整。
总之,退火算法通过模拟物理退火过程,有效地解决了许多复杂的全局优化问题,是一种通用且强大的优化算法。
相关文章:
【算法】退火算法 Simulated Annealing
退火算法(Simulated Annealing, SA)是一种基于热力学模拟的优化算法,用于求解全局优化问题。它通过模拟物理退火过程来寻找全局最优解。以下是退火算法的基本原理和步骤: 一、基本原理 退火算法的灵感来源于金属在高温下缓慢冷却…...
深入理解 Git `git add -p` 命令中的交互选项
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…...
HTML JavaScript 闪光涟漪
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>闪光涟漪</title><style>.ripple-conta…...
FastAPI之Depends
文章目录 基本概念基本用法复杂场景中的 Depends数据库会话管理处理请求用户嵌套依赖全局依赖 作用域与生命周期可选依赖类依赖总结 基本概念 在 FastAPI 中,依赖可以是: 一个函数,它的返回值会被传递给视图函数作为参数。可以被其他依赖函…...
AttributeError: module ‘jwt‘ has no attribute ‘decode‘解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
C++——C++11
前言:本篇文章将分享一些C11版本所产生的一些新的技术以及对老版本的优化。 目录 一.C11简介 二.统一的列表初始化 1.{}初始化 2.std::initializer_list 三.右值引用和移动语义 1.左值引用和右值引用 2.两者的比较 (1)左值引用 &#…...
day12 多线程
目录 1.概念相关 1.1什么是线程 1.2什么是多线程 2.创建线程 2.1方式一:继承Thread类 2.1.1实现步骤 2.1.2优缺点 2.1.3注意事项 2.2方式二:实现Runnable接口 2.2.1实现步骤 2.2.2优缺点 2.2.3匿名内部类写法 2.3方式三:实现cal…...
DeferredResult 是如何实现异步处理请求的
最近遇到了一个问题,我们的一个接口需要去轮询另一个第三方接口,导致这个接口占用了太多工作线程,这些工作线程长时间 running,我们需要解决这个问题。 于是,我们的方案是:用 DeferredResult 实现接口异步。…...
VUE3——001(03)、开发环境配置(node.js/mvn/java/ngix/tomact/vue3)
嫌麻烦的请下载安装包,有点强迫(懒的)可以看看。 解释:安装目录,即软件安装所在目录,如 node.js 我装在 D:\AppFolder\nodejs 系统变量修改 path增加 安装目录 在系统变量 p…...
TCP/IP_TCP协议
目录 一、TCP协议 1.1 确认应答 1.2 超时重传 1.3 连接管理 1.4 TCP状态 1.5 滑动窗口 1.6 流量控制 1.7 拥塞控制 1.8 延迟应答 1.9 捎带应答 1.10 粘包问题 1.11 异常情况 二、TCP/UDP对比 总结 一、TCP协议 TCP 协议和 UDP 协议是处于传输层的协议。 【TCP协…...
鸿蒙应用框架开发【简单时钟】 UI框架
简单时钟 介绍 本示例通过使用ohos.display接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。 例如:"2 * Math.PI / …...
MySQL是如何实现数据排序的
MySQL是如何实现数据排序的 MySQL实现数据排序主要依赖于其内部的排序和索引机制。当执行包含ORDER BY子句的SQL查询时,MySQL会采用以下一种或多种策略来对数据进行排序 索引排序 如果ORDER BY子句中的列是表的一个索引(或索引的一部分)&a…...
【测试架构师修炼之道】读书笔记
六大质量属性 效率性能 测试类型:六种-XX属性转化为XX测试 产品测试车轮图 一个软件测试者要从哪些方面(测试类型)用哪些方法(测试方法)去测试产品(质量属性)的关系图 全面性与深度 稳定性测试:多并复异 性能测试: 系统能够正确处理新业…...
C++ Functor仿函数
Functor 对象模拟函数 把类对象,像函数名一样使用。 仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现 一个 operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 operator() 语法格式 clas…...
【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)
重要信息 会议官网:www.icbase.org(查看详情) 中文主页:【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)_艾思科蓝_学术一站式服务平台 会议时间:2024年9月2…...
微信小程序多端框架实现app内自动升级
多端框架生成的app,如果实现app内自动升级? 一、Android 实现app自动升级,华为应用市场 1、获取 应用市场地址 下载地址 2、在微信开放平台进行配置 应用下载地址:应用市场点击分享,里面有一个复制连接功能 应用市…...
C# Log4Net应用
1 需求分析 日志记录是程序开发中必不可少的环节,对于bug调试和后期项目维护都十分重要.其中Log4net是C#环境下广泛使用的日志记录库,功能十分强大.本教程提供的日志记录需求如下 1,日志文件统一保存到项目启动目录下的logs文件夹 2,以天为单位进行日志…...
pytest8.x版本 中文使用文档-------32.示例:使用自定义目录收集器
默认情况下,pytest 使用pytest.Package来收集包含 __init__.py 文件的目录,使用 pytest.Dir来收集其他目录。如果你想要自定义目录的收集方式,你可以编写自己的pytest.Directory 收集器,并使用 pytest_collect_directory钩子来连接…...
c语言第七天笔记
作业题: 设计TVM(地铁自动售票机)机软件。 输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。 输入钱数,计算找零(找零时优先找回面额大的钞票)࿰…...
软件测试经理工作日常随记【8】-UI自动化_加密接口的传输
软件测试经理工作日常随记【8】-UI自动化_加密接口的传输 工具类 #utils_api.py class RequestUtils:classmethoddef send_request_splicing(cls, dicts, url): # 对应请求的入参及请求的函数Logger.logger_in().info(-----------------{}接口开始执行-----------------.for…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
