模拟退火算法:原理与Python实现

模拟退火算法:原理与Python实现

模拟退火算法(Simulated Annealing,SA)是一种用于全局优化问题的随机算法,尤其适用于大规模、复杂的组合优化问题。该算法受启发于物理冶金学中的退火过程,通过缓慢降低系统温度来寻找最优解。在优化过程中,模拟退火允许以一定概率接受比当前解更差的解,从而避免陷入局部最优解。

一、模拟退火算法原理

1. 退火过程

在物理学中,退火是指加热金属或玻璃材料到高温,使其分子能够自由移动,然后通过缓慢降低温度,使其达到一个较低能量的稳定状态。模拟退火算法通过模拟这一过程,在高温下允许系统在解空间内大幅度地随机跳跃(甚至接受较差的解),而在低温时趋于收敛,找到接近全局最优解。

2. 算法流程

模拟退火算法的核心步骤包括:

  1. 初始解与初始温度:从一个随机解开始,温度设为一个较高的初值。
  2. 邻域搜索:在当前解的邻域中生成一个新的解。
  3. 接受准则
    • 若新解优于当前解,则接受新解;
    • 若新解不如当前解,则以一定的概率接受该解。这个概率与温度和解的质量差有关,通常使用Metropolis准则
      [
      P(\text{接受新解}) = \exp \left( \frac{f_{\text{new}} - f_{\text{current}}}{T} \right)
      ]
      其中 ( T ) 是当前温度,( f_{\text{new}} ) 和 ( f_{\text{current}} ) 分别是新解和当前解的目标函数值。
  4. 降温:逐步降低温度,一般使用指数降温方式 ( T_{k+1} = \alpha T_k ),其中 ( 0 < \alpha < 1 )。
  5. 终止条件:当温度降到一定阈值或者达到设定的迭代次数时,停止搜索。

3. 关键要素

  • 温度控制:温度的下降速度直接影响算法的收敛性。过快的降温可能导致算法早早陷入局部最优,而过慢的降温则会增加算法的运行时间。
  • 接受概率:在较高温度下,算法允许较大范围的随机搜索,而在低温时则趋向于搜索更优解。

二、模拟退火算法Python实现

我们通过一个简单的实例来展示如何在Python中实现模拟退火算法。假设我们要优化一个二维函数,例如著名的 Rastrigin 函数

[
f(x, y) = 20 + x^2 + y^2 - 10 (\cos(2 \pi x) + \cos(2 \pi y))
]

Rastrigin函数具有多个局部最优点,是测试全局优化算法的经典例子。

1. 模拟退火算法代码

import numpy as np
import matplotlib.pyplot as plt# 定义Rastrigin函数
def rastrigin(x, y):return 20 + x**2 + y**2 - 10 * (np.cos(2 * np.pi * x) + np.cos(2 * np.pi * y))# 退火算法参数设置
T_init = 1000  # 初始温度
T_min = 1e-6   # 最低温度
alpha = 0.9    # 降温系数
max_iter = 1000  # 每个温度下的最大迭代次数# 邻域内随机产生新解
def neighbor(x, y):x_new = x + np.random.uniform(-1, 1)y_new = y + np.random.uniform(-1, 1)return x_new, y_new# 模拟退火算法
def simulated_annealing():# 随机生成初始解x_current = np.random.uniform(-5, 5)y_current = np.random.uniform(-5, 5)f_current = rastrigin(x_current, y_current)x_best, y_best = x_current, y_currentf_best = f_currentT = T_init  # 初始温度while T > T_min:for _ in range(max_iter):# 产生邻域内的新解x_new, y_new = neighbor(x_current, y_current)f_new = rastrigin(x_new, y_new)# 判断是否接受新解if f_new < f_current:x_current, y_current = x_new, y_newf_current = f_new# 更新全局最优解if f_new < f_best:x_best, y_best = x_new, y_newf_best = f_newelse:# 根据接受概率决定是否接受差的解delta_f = f_new - f_currentaccept_prob = np.exp(-delta_f / T)if np.random.rand() < accept_prob:x_current, y_current = x_new, y_newf_current = f_new# 降温T *= alphareturn x_best, y_best, f_best# 运行模拟退火算法
x_opt, y_opt, f_opt = simulated_annealing()print(f"最优解: x = {x_opt}, y = {y_opt}, 最优函数值: f(x, y) = {f_opt}")# 可视化Rastrigin函数与最优点
x = np.linspace(-5, 5, 400)
y = np.linspace(-5, 5, 400)
X, Y = np.meshgrid(x, y)
Z = rastrigin(X, Y)plt.figure(figsize=(8, 6))
plt.contourf(X, Y, Z, levels=50, cmap='viridis')
plt.colorbar()# 标记最优解
plt.plot(x_opt, y_opt, 'ro', label='Optimal Point')
plt.legend()
plt.title("Simulated Annealing on Rastrigin Function")
plt.xlabel('x')
plt.ylabel('y')
plt.show()

2. 代码说明

  1. Rastrigin函数:定义了目标函数rastrigin(),该函数具有多个局部最优点,用来测试模拟退火算法的性能。
  2. 邻域搜索:在当前解的邻域范围内通过neighbor()函数随机生成新解。
  3. 接受准则:采用了Metropolis准则,如果新解优于当前解,则无条件接受;否则以一定概率接受。
  4. 降温策略:每轮迭代后温度按T *= alpha的规则递减,使得算法逐渐收敛。
  5. 结果展示:算法执行完毕后输出最优解,并将Rastrigin函数的等高线图和最优解进行可视化。

3. 输出结果

运行代码后,算法会输出找到的最优解(即最小的目标函数值)以及相应的坐标点,并绘制出Rastrigin函数的等高线图,红色圆点表示找到的最优点。

4. 参数调优

模拟退火算法的效果高度依赖于参数的设置,例如:

  • 初始温度:较高的初始温度能够更广泛地探索解空间。
  • 降温系数alpha决定了温度下降的速度,通常取0.8~0.99之间。
  • 最大迭代次数:每个温度下的迭代次数,控制算法的运行时间和收敛性。

通过调整这些参数,可以在精度和时间之间取得平衡。

三、总结

模拟退火算法是一种启发式的全局优化算法,能够有效避免陷入局部最优解,适合求解复杂的优化问题。其关键思想是通过在高温下允许劣解,以逃离局部最优,并在低温时逐步收敛至全局最优。尽管它不能保证一定找到全局最优解,但通过适当的参数调节,可以获得非常接近全局最优的解。

通过本案例,我们不仅了解了模拟退火的基本原理和流程,还学习了如何用Python实现该算法并应用于具体问题的优化。

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

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

相关文章

嵌套div导致子区域margin失效问题解决

嵌套div导致子区域margin失效问题解决 现象原因解决方法 现象 <div class"prev"></div> <div class"parent"><div class"child"></div><div class"child"></div> </div> <div cl…

Netty无锁化设计之对象池实现

池化技术是比较常见的一种技术&#xff0c;在平时我们已经就接触很多了&#xff0c;比如线程池&#xff0c;数据库连接池等等。当我们要使用一个资源的时候从池中去获取&#xff0c;用完就放回池中以便其他线程可以使用&#xff0c;这样的目的就是为了减少资源开销&#xff0c;…

MySQL-23.多表查询-内连接

一.内连接 -- 多表查询 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id;-- 内连接 -- A.查询员工的姓名&#xff0c;及所属的部门名称&#xff08;隐式内连接实现&#xff09; select tb_emp.name as 员工姓名,tb_dept.name as 部门名称 from tb_emp,tb_dep…

简单介绍冯诺依曼体系

现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算和逻辑判断。存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制方式存储&#xff09;。输入设备&#xff1a;用户给计算机发号施令。输出设备&#xff1a;计算机…

RISC-V笔记——Pipeline依赖

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Pipeline Dependencies(Pipeline依赖)。 2. Pipeline依赖 Pipeline依赖指的是&a…

LeetCode_2520. 统计能整除数字的位数_java

1、题目 2520. 统计能整除数字的位数https://leetcode.cn/problems/count-the-digits-that-divide-a-number/ 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a;…

TiDB替换Starrocks:业务综合宽表迁移的性能评估与降本增效决策

作者&#xff1a; 我是人间不清醒 原文来源&#xff1a; https://tidb.net/blog/6638f594 1、 场景 业务综合宽表是报表生成、大屏幕展示和数据计算处理的核心数据结构。目前&#xff0c;这些宽表存储在Starrocks系统中&#xff0c;但该系统存在显著的性能瓶颈。例如&#…

如何实现金蝶商品数据集成到电商系统的SKU

如何实现金蝶商品数据集成到电商SKU系统 金蝶商品数据集成到电商SKU的技术实现 在现代企业的数据管理中&#xff0c;系统间的数据对接与集成是提升业务效率和准确性的关键环节。本文将分享一个实际案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将金蝶云星辰V2中的商…

实战华为AC6508无线控制器+华为无线AP上线配置(AirEngine5762S-12+AirEngine5760-10)+无线WIFI配置

一、适用场景 1、适用于企业环境、校园环境、大户型家庭多层楼环境。 2、对于无线网络需要集中管理和监测的环境&#xff0c;无线wifi覆盖范围面积大&#xff0c;适用本实例。 3、当无线WIFI需要从一个区域到另一个区域无缝漫游时&#xff0c;确保应用不掉线&#xff0c;可使用…

简单有效修复d3d9.dll错误,11种d3d9.dll错误详细解决办法教程

当你遇到d3d9.dll文件丢失的问题时&#xff0c;可以通过今天的这篇文章详细的步骤来尝试修复这个问题&#xff0c;今天将教大家十一种d3d9.dll丢失修复的方法。 1. 重新安装DirectX以恢复d3d9.dll d3d9.dll是DirectX的一部分&#xff0c;因此重新安装DirectX通常可以解决d3d9.…

C#描述-计算机视觉OpenCV(7):MSER特征检测

C#描述-计算机视觉OpenCV&#xff08;7&#xff09;&#xff1a;MSER特征检测 基本概念操作实例效果优化 基本概念 前文C#描述-计算机视觉OpenCV&#xff08;6&#xff09;&#xff1a;形态学描述了如何对图像的前后景特征形态进行检测与运算&#xff0c;本篇将分析基于形态的…

Safari 中 filter: blur() 高斯模糊引发的性能问题及解决方案

目录 引言问题背景&#xff1a;filter: blur() 引发的问题产生问题的原因分析解决方案&#xff1a;开启硬件加速实际应用示例性能优化建议常见的调试工具与分析方法 引言 在前端开发中&#xff0c;CSS滤镜&#xff08;如filter: blur()&#xff09;的广泛使用为页面带来了各种…

大数据-173 Elasticsearch 索引操作 增删改查 详细 JSON 操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

后台管理员登录实现--系统篇

我的小系统后台原来就有一个上传图片的功能还夹带个删除图片的功能&#xff0c;还嵌到了一个菜单里面。之前效果如下 那么现在为了加大安全力度&#xff0c;想增加一个登录页面。通过登录再到这个页面。看着貌似很简单&#xff0c;但是听我细细说来&#xff0c;要新增些什么东西…

KMP 算法

目录 KMP 算法 算法思路 为什么不需要在主串中进行回退 计算 next 数组 代码实现 next 数组优化 查找所有起始位置 KMP 算法 KMP 算法是一种改进的字符串匹配算法&#xff0c;由 D.E.Knuth&#xff0c;J.H.Morris 和 V.R.Pratt 提出的&#xff0c;因此人们称它为 克努特…

(北京政务服务满意度公司)满意度调查助力服务质量提升

在当今社会&#xff0c;&#xff08;政务服务满意度公司&#xff09;政务窗口服务的质量直接关系到市民的日常生活和城市的健康发展。为了解市民对政务窗口服务的满意度&#xff0c;提升服务质量&#xff0c;某市委托民安智库专业市场调查公司开展了政务窗口服务满意度调查&…

【平方矩阵 + 蛇形矩阵】

矩阵找规律题 题目链接&#xff1a; 平方矩阵 I平方矩阵 II平方矩阵 III蛇形矩阵 平方矩阵 I 解法一&#xff1a;找坐标规律 while True:x int(input())if not x:breakfor i in range(x):for j in range(x):print(%d % min(i 1, j 1, x - i, x - j), end )print()prin…

【Hive】3-HiveSQL 数据定义语言(DDL)

HiveSQL 数据定义语言&#xff08;DDL&#xff09; SQL中DDL语法的作用 数据定义语言(Data Definition Language&#xff0c;DDL)&#xff0c;是SQL语言集中对数据库内部的对象结构进行创建&#xff0c;删除&#xff0c;修改等的操作语言&#xff0c;这些数据库对象包括datab…

SpringBoot实现的汽车票在线预订系统

2相关技术 2.1 MySQL 数据库 MySQL 是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非…

5G NR GSCN计算SSB中心频率MATLAB实现

本期给大家带来5G NR中已知GSCN如何计算SSB的中心频率&#xff0c;用MATLAB实现&#xff0c;参考3GPP 38.104 下图是GSCN与SSB中心频率换算关系。 函数说明&#xff1a; 函数的入参是GSCN号 函数的输出是对应的SSB中心频率&#xff0c;单位MHZ function freqency nr_5g_gs…