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

【算法】退火算法 Simulated Annealing

退火算法(Simulated Annealing, SA)是一种基于热力学模拟的优化算法,用于求解全局优化问题。它通过模拟物理退火过程来寻找全局最优解。以下是退火算法的基本原理和步骤:

一、基本原理

退火算法的灵感来源于金属在高温下缓慢冷却至低温的过程,这一过程中,金属原子逐渐排列成能量最低的晶格结构。类似地,退火算法通过模拟这一过程,在解空间中逐渐收敛到全局最优解。

二、算法步骤

  1. 初始解与温度设定

    • 随机生成一个初始解。
    • 设定初始温度 T 。
  2. 循环过程

    • 在当前解的邻域内随机生成一个新解。
    • 计算新解与当前解的目标函数值差异ΔE。
    • 如果 ΔE≤0,接受新解(新解更优)。
    • 如果 ΔE>0,以概率 P=exp(−ΔE/T) 接受新解(防止陷入局部最优)。
    • 逐步降低温度 T(根据某个降温函数,如T=T×α,其中 α 为冷却速率,通常 0.8≤α≤0.99)。
  3. 终止条件

    • 当温度 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步骤
  1. 初始解与温度设定

    • 随机生成一个初始路径作为初始解。
    • 设定初始温度 T 和降温速率 α。
  2. 生成邻域解

    • 在当前路径中随机交换两个城市的位置,生成一个新路径。
  3. 目标函数

    • 计算路径的总距离。
  4. 接受新解的准则

    • 根据退火算法的准则接受或拒绝新解。
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)
解释
  1. total_distance: 计算路径的总距离。
  2. swap_two_cities: 在路径中随机交换两个城市的位置,生成一个新路径。
  3. simulated_annealing: 退火算法的主函数,接受距离矩阵、初始温度、冷却速率和停止温度作为参数。
  4. distance_matrix: 一个示例距离矩阵,定义了各个城市之间的距离。
  5. initial_temperature, cooling_rate, stopping_temperature: 退火算法的参数。

运行此代码将输出最短路径及其对应的总距离。

结果示例
最短路径: [0, 2, 3, 1]
最短路径距离: 80

四、优缺点

优点

  • 能够逃避局部最优,找到全局最优解。
  • 适用于各种复杂优化问题。
  • 实现相对简单,参数可调节性强。

缺点

  • 计算量较大,尤其在早期迭代阶段。
  • 参数设置(初始温度、冷却速率、停止温度等)对算法性能影响较大,需要实验调整。

总之,退火算法通过模拟物理退火过程,有效地解决了许多复杂的全局优化问题,是一种通用且强大的优化算法。

相关文章:

【算法】退火算法 Simulated Annealing

退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种基于热力学模拟的优化算法&#xff0c;用于求解全局优化问题。它通过模拟物理退火过程来寻找全局最优解。以下是退火算法的基本原理和步骤&#xff1a; 一、基本原理 退火算法的灵感来源于金属在高温下缓慢冷却…...

深入理解 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 中&#xff0c;依赖可以是&#xff1a; 一个函数&#xff0c;它的返回值会被传递给视图函数作为参数。可以被其他依赖函…...

AttributeError: module ‘jwt‘ has no attribute ‘decode‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

C++——C++11

前言&#xff1a;本篇文章将分享一些C11版本所产生的一些新的技术以及对老版本的优化。 目录 一.C11简介 二.统一的列表初始化 1.{}初始化 2.std::initializer_list 三.右值引用和移动语义 1.左值引用和右值引用 2.两者的比较 &#xff08;1&#xff09;左值引用 &#…...

day12 多线程

目录 1.概念相关 1.1什么是线程 1.2什么是多线程 2.创建线程 2.1方式一&#xff1a;继承Thread类 2.1.1实现步骤 2.1.2优缺点 2.1.3注意事项 2.2方式二&#xff1a;实现Runnable接口 2.2.1实现步骤 2.2.2优缺点 2.2.3匿名内部类写法 2.3方式三&#xff1a;实现cal…...

DeferredResult 是如何实现异步处理请求的

最近遇到了一个问题&#xff0c;我们的一个接口需要去轮询另一个第三方接口&#xff0c;导致这个接口占用了太多工作线程&#xff0c;这些工作线程长时间 running&#xff0c;我们需要解决这个问题。 于是&#xff0c;我们的方案是&#xff1a;用 DeferredResult 实现接口异步。…...

VUE3——001(03)、开发环境配置(node.js/mvn/java/ngix/tomact/vue3)

嫌麻烦的请下载安装包&#xff0c;有点强迫&#xff08;懒的&#xff09;可以看看。 解释&#xff1a;安装目录&#xff0c;即软件安装所在目录&#xff0c;如 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实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI / …...

MySQL是如何实现数据排序的

MySQL是如何实现数据排序的 MySQL实现数据排序主要依赖于其内部的排序和索引机制。当执行包含ORDER BY子句的SQL查询时&#xff0c;MySQL会采用以下一种或多种策略来对数据进行排序 索引排序 如果ORDER BY子句中的列是表的一个索引&#xff08;或索引的一部分&#xff09;&a…...

【测试架构师修炼之道】读书笔记

六大质量属性 效率性能 测试类型&#xff1a;六种-XX属性转化为XX测试 产品测试车轮图 一个软件测试者要从哪些方面(测试类型)用哪些方法(测试方法)去测试产品(质量属性)的关系图 全面性与深度 稳定性测试&#xff1a;多并复异 性能测试&#xff1a; 系统能够正确处理新业…...

C++ Functor仿函数

Functor 对象模拟函数 把类对象&#xff0c;像函数名一样使用。 仿函数(functor)&#xff0c;就是使一个类的使用看上去像一个函数。其实现就是类中实现 一个 operator()&#xff0c;这个类就有了类似函数的行为&#xff0c;就是一个仿函数类了。 operator() 语法格式 clas…...

【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

重要信息 会议官网&#xff1a;www.icbase.org&#xff08;查看详情&#xff09; 中文主页&#xff1a;【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09;_艾思科蓝_学术一站式服务平台 会议时间&#xff1a;2024年9月2…...

微信小程序多端框架实现app内自动升级

多端框架生成的app&#xff0c;如果实现app内自动升级&#xff1f; 一、Android 实现app自动升级&#xff0c;华为应用市场 1、获取 应用市场地址 下载地址 2、在微信开放平台进行配置 应用下载地址&#xff1a;应用市场点击分享&#xff0c;里面有一个复制连接功能 应用市…...

C# Log4Net应用

1 需求分析 日志记录是程序开发中必不可少的环节,对于bug调试和后期项目维护都十分重要.其中Log4net是C#环境下广泛使用的日志记录库,功能十分强大.本教程提供的日志记录需求如下 1&#xff0c;日志文件统一保存到项目启动目录下的logs文件夹 2&#xff0c;以天为单位进行日志…...

pytest8.x版本 中文使用文档-------32.示例:使用自定义目录收集器

默认情况下&#xff0c;pytest 使用pytest.Package来收集包含 __init__.py 文件的目录&#xff0c;使用 pytest.Dir来收集其他目录。如果你想要自定义目录的收集方式&#xff0c;你可以编写自己的pytest.Directory 收集器&#xff0c;并使用 pytest_collect_directory钩子来连接…...

c语言第七天笔记

作业题&#xff1a; 设计TVM&#xff08;地铁自动售票机&#xff09;机软件。 输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0…...

软件测试经理工作日常随记【8】-UI自动化_加密接口的传输

软件测试经理工作日常随记【8】-UI自动化_加密接口的传输 工具类 #utils_api.py class RequestUtils:classmethoddef send_request_splicing(cls, dicts, url): # 对应请求的入参及请求的函数Logger.logger_in().info(-----------------{}接口开始执行-----------------.for…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...