智能算法系列之模拟退火算法

article/2025/9/20 23:00:55

在这里插入图片描述

  本博客封面由ChatGPT + DALL·E 2共同创作而成。

文章目录

    • 前言
    • 1. 算法思想
    • 2. 细节梳理
      • 2.1 超参数的选择
      • 2.2 一些trick
    • 3. 算法实现
      • 3.1 问题场景
      • 3.2 从算法角度分析
      • 3.3 python实现
    • 代码仓库:IALib[GitHub]

前言

  本篇是智能算法(Python复现)专栏的第二篇文章,主要介绍模拟退火算法(Simulate Anneal Algorithm, SAA)的思想,python实现及相关应用场景模拟。

  模拟退火算法,顾名思义,就是对固体退火这一热力学过程的模拟,它是一种适合解决大规模组合优化问题的随机搜索算法。与一般的局部搜索算法不同的是,SAA以一定的概率选择邻域中目标值相对较小的状态,从理论上来说,它是一种全局最优算法。

1. 算法思想

  固体退火过程是指将固体加热到熔化,再徐徐冷却使之凝固成规整晶体的热力学过程,主要由加温过程、等温过程以及冷却过程3个阶段组成。
  (1) 加温过程:对固体加热时,随着温度的升高,粒子的热运动不断加强,逐渐偏离平衡位置,粒子排列也呈现出随机状态,此时,宏观上物体表现为液态,这就是熔化现象。熔化过程消除了系统内原先可能存在的非均匀状态,同时系统的能量也随着温度升高而增大;
  (2) 等温过程:退火过程要求温度缓慢降低,使得系统在每个温度下都达到平衡状态。这一过程可以根据自由能减少定律给出解释:对于与环境发生热量交换而温度保持不变的封闭系统,系统状态的自发变化总是朝着自由能减少的方向进行,当自由能达到最小值时,系统达到平衡态;
  (3) 冷却过程:温度的降低使得粒子热运动慢慢减弱,粒子排列渐趋有序,系统能量不断减小,最终得到低能的晶体结构。当液体凝固成固体的晶态时,退火过程完成。

  SAA是用来在一个大的搜寻空间内找寻最优解的基于概率的算法,采用类似于固体退火的过程,先将固体加温至充分高(相当于算法的随机搜索),然后徐徐冷却(相当于算法的局部搜索),在每一个温度(相当于算法的每一次状态转移)达到平衡态,最终达到物理基态(相当于算法找到最优解)。
  具体可以表述为:粒子在温度 T T T 时趋于平衡的概率为 e x p ( − Δ E k T ) exp(- \frac {\Delta E} {kT}) exp(kTΔE),其中 E E E 为温度 T T T 时的内能, Δ E ΔE ΔE 为其改变量, k k k 为玻耳兹曼常数。用固体退火模拟组合优化问题,将内能 E E E 模拟为目标函数值 f f f,温度 T T T演化成控制参数 t t t,即得到解组合优化问题的SAA
  由初始解 x x x 和控制参数初值 t t t 开始,对当前解重复 "产生新解 --> 计算目标函数差 --> 接受或舍弃" 的迭代,并逐步衰减 t t t 值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡洛迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表控制,包括控制参数的初值 t t t 及其衰减因子 Δ t Δt Δt、每个 t t t 值时的迭代次数 L L L 和停止条件 S S S等。

在这里插入图片描述

2. 细节梳理

2.1 超参数的选择

  初始温度T建议选择较大的值,终止温度T_end建议选择较小的值,这里选择初始温度T=100, T_end=0.001,过大或过小会影响算法收敛的速度;每个温度下的迭代次数和冷却系数可以根据问题场景适当控制,过大也会影响收敛的速度;玻尔兹曼常数k这里设置为1

2.2 一些trick

  其实,也可以不必完全按照上述流程图来实现SAA,比如,每个温度下的迭代次数,从原理上来看,这部分是影响了迭代次数,如果将冷却系数设置为稍大一些,比如0.99,那么这部分在实现的时候可以省略掉,算法仍然能够得到最优解。当然啦,博主只是在该问题上得出的一个结论,是否具有普适性还需要验证。本篇为了算法的完整性,仍然按照流程图来实现SAA算法。

3. 算法实现

3.1 问题场景

  最值问题,求解 f ( x ) = x s i n ( 5 x ) − x c o s ( 2 x ) f(x) = xsin(5x) - xcos(2x) f(x)=xsin(5x)xcos(2x)在定义域[0, 5]上的最小值。我们先手动计算一下:

f ′ ( x ) = 2 x s i n ( 2 x ) + s i n ( 5 x ) − c o s ( 2 x ) + 5 x c o s ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x) f(x)=2xsin(2x)+sin(5x)cos(2x)+5xcos(5x)  令 f ′ ( x ) = 0 f^\prime (x) = 0 f(x)=0之后,理论上可以求得驻点,但又不太好计算。。。

3.2 从算法角度分析

  根据上述问题场景及算法原理,需要考虑两种情况:
  (1)当前解是局部最优解,即 f ( x ′ ) < f ( x ) f(x^ \prime) < f(x) f(x)<f(x),保留当前局部最优解,继续产生新解;
  (2)当前解非局部最优解,即 f ( x ′ ) ≥ f ( x ) f(x^ \prime) \geq f(x) f(x)f(x),计算出当前温度下该解收敛的概率,如果概率大于一定阈值(随机的),则该解可以作为局部最优解,保留该解并继续产生新解,否则就丢弃该解,继续产生新解。

3.3 python实现

# -*- coding:utf-8 -*-
# Author:   xiayouran
# Email:    youran.xia@foxmail.com
# Datetime: 2023/1/16 11:12
# Filename: sa.py
import numpy as np
from matplotlib import pyplot as pltdef f(x):return x*np.sin(5*x) - x*np.cos(2*x)seed = 10086
np.random.seed(seed)T = 100     # 初始温度
T_end = 1e-3    # 终止温度
coldrate = 0.9    # 冷却系数
max_count = 15  # 每个温度值下的迭代次数
x_range = [0, 5]    # 定义域if __name__ == '__main__':plt.figure()plt.ion()x_ = np.linspace(*x_range, num=200)plt.plot(x_, f(x_))x = np.random.uniform(*x_range)  # 初始解while T > T_end:for _ in range(max_count):y = f(x)x_new = np.clip(x + np.random.randn(), a_min=x_range[0], a_max=x_range[1])# something about plottingif 'sca' in globals() or 'sca' in locals():sca.remove()sca = plt.scatter(x, y, s=100, lw=0, c='red', alpha=0.5)plt.pause(0.01)y_new = f(x_new)if y_new < y:  # 局部最优解x = x_newelse:p = np.exp(-(y_new - y) / T)  # 粒子在温度T时趋于平衡的概率为exp[-ΔE/(kT)]r = np.random.uniform(0, 1)if p > r:  # 以一定概率来接受最优解x = x_newT *= coldrateplt.scatter(x, f(x), s=100, lw=0, c='green', alpha=0.7)plt.ioff()plt.show()print('最小值对应的坐标点: ({}, {})'.format(x, f(x)))

  得到的最优解如下:

最小值对应的坐标点: (3.435632058805234, -6.276735466829619)

  模拟过程如下:

在这里插入图片描述

代码仓库:IALib[GitHub]

  本篇代码已同步至【智能算法(Python复现)】专栏专属仓库:IALib
  运行IALib库中的SAA算法:

git clone git@github.com:xiayouran/IALib.git
cd examples
python main.py -algo saa

http://chatgpt.dhexx.cn/article/kBy07J2p.shtml

相关文章

你也能看懂的:退火算法

模拟退火算法来源于固体退火原理&#xff0c;是一种基于概率的算法&#xff0c;将固体加温至充分高&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;而徐徐冷却时粒子渐趋有序&#xff0c;在每个温度都…

优化算法-模拟退火算法

一、概念 模拟退火算法(SA)来源于固体退火原理&#xff0c;是一种基于概率的算法。 将固体加温至充分高的温度&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;分子和原子越不稳定。而徐徐冷却时粒子…

模拟退火算法的优化

优化模拟退火算法 作为现代算法的一种&#xff0c;模拟退火算法是一种用降低搜索的覆盖面积来提高运算速度的算法&#xff0c;适用于解决各种优化类问题。它利用了物理学中一个常见的原理&#xff1a;当物体具有一定的温度时&#xff0c;假设它内部含有的能量为E(I),那么物体从…

模拟退火算法的改进

模拟退火算法的物理模型 在物理退火过程中&#xff0c;当固体的温度很高时&#xff0c;内能较大&#xff0c;固体内部的粒子处于无序运动状态&#xff0c;当温度慢慢降低时&#xff0c;固体的内能减小&#xff0c;粒子的运动趋于有序&#xff0c;如果温度降低得足够慢&#xff…

模拟退火算法简单理解

模拟退火算法 算法流程图 1. 引言 模拟退火算法&#xff08;Simulate Anneal&#xff0c;SA&#xff09;是一种通用概率演算法&#xff0c;用来 在一个大的搜寻空间内找寻命题的最优解 。模拟退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所发明的。V.Čern在198…

理解模拟退火算法

目录 文章目录 目录退火原理爬山算法模拟退火模拟退火伪代码算法评价参考文献 退火原理 模拟退火算法来源于固体退火原理&#xff0c;将固体加温至充分高&#xff0c;再让其徐徐冷却。加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;而徐徐冷…

量子退火算法入门(6):初识量子退火算法的发明过程

文章目录 一、量子计算机二、模拟退火算法三、量子退火算法的物理基础1. 量子涨落替换热涨落&#xff0c;提出量子退火算法2. 绝热量子演化解决横向磁场强度缓慢变化3. D-Wave Systems公司实现物理量子退火机 总结 一、量子计算机 提示&#xff1a;量子退火机的发展简史&#…

模拟退火算法(SA)详解

一.算法来源&#xff1a;模拟退火算法(SA)源于固体退火原理&#xff0c;是一种基于概率的算法。将固体加温至充分高的温度&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;分子和原子越不稳定。而徐徐冷…

模拟退火算法介绍和实例实现

一、模拟退火算法简介 模拟退火算法(SA)来源于固体退火原理&#xff0c;是一种基于概率的算法。将固体加温至充分高的温度&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;分子和原子越不稳定。而徐徐冷…

模拟退火算法(Python)

一、模拟退火算法 1、模拟退火算法的定义 模拟退火算法是一种现代优化算法。基于蒙特卡洛迭代求解方法的随机寻优算法&#xff0c;模拟退火算法于1983 年成功地应用到组合优化领域。因固体物理退火过程与组合优化问题存在着相似性&#xff0c;模拟退火算法对固体物质的退火过…

模拟退火算法详细说明

来源&#xff1a;固体退火。一种处理工艺&#xff1a;将金属缓慢加热到一定程度&#xff0c;保持足够的时间&#xff0c;然后以适宜的速度冷却。退火后的金属具有了新的属性降低硬度等。 一、爬山算法 1.爬山算法是一种局部择优的方法&#xff0c;是一种局部贪心的最优算法。…

【算法】模拟退火

文章目录 1.模拟退火介绍1.1模拟退火的可行性1.2退火模型 2.详解退火2.1退火过程2.2各变量说明2.2.1关于接收概率 3.退火模拟求根号n的值4.洛谷POJ-2420 1.模拟退火介绍 ​ 模拟退火是模拟物理上退火方法&#xff0c;通过N次迭代&#xff08;退火&#xff09;&#xff0c;逼近…

模拟退火算法的原理+应用

本文转自https://www.cnblogs.com/ranjiewen/p/6084052.html 模拟退火算法 著名的模拟退火算法&#xff0c;它是一种基于蒙特卡洛思想设计的近似求解最优化问题的方法。 一点历史——如果你不感兴趣&#xff0c;可以跳过 美国物理学家 N.Metropolis 和同仁在1953年发表研究复杂…

优化算法——模拟退火算法

模拟退火算法原理 爬山法是一种贪婪的方法&#xff0c;对于一个优化问题&#xff0c;其大致图像(图像地址)如下图所示&#xff1a; 其目标是要找到函数的最大值&#xff0c;若初始化时&#xff0c;初始点的位置在 C C C处&#xff0c;则会寻找到附近的局部最大值 A A A点处&a…

模拟退火算法详细讲解(含实例python代码)

模拟退火算法详细讲解&#xff08;含实例python代码&#xff09; &#xff08;一&#xff09;模拟退火算法简介&#xff08;二&#xff09;模拟退火算法原理&#xff08;三&#xff09;退火过程中参数控制&#xff08;四&#xff09;算法步骤&#xff08;五&#xff09;实例分析…

模拟退火算法(SA)

一、算法简介 模拟退火算法(SA) 一种模拟物理退火过程而设计的优化算法 初始处于一个高温状态下&#xff0c;然后逐渐退火&#xff0c;在每个温度下慢慢冷却&#xff0c;最终达到物理基态&#xff08;相当于算法找到最优解&#xff09; 求解TSP问题(旅行商问题)、最值问题、全…

模拟退火算法(Simulated Annealing,SA)

这是一篇关于模拟退火算法的总结博客&#xff0c;包括算法思想&#xff0c;算法步骤&#xff0c;Python实现&#xff0c;MATLAB实现&#xff0c;算法进阶等。 目录 1 算法思想2 算法步骤3 SA解函数最小值&#xff08;python实现&#xff09;4 SA解旅行商问题&#xff08;MATLA…

退火算法(Annealing)简介与详解

模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09; 秒懂爬山算法&#xff08;Hill Climbing&#xff09;退火算法 详解算法来源数学推导来源&#xff1a;metropolis准则&#xff08;蒙特卡洛准则&#xff09; 算法流程算法优劣例题 秒懂 爬山算法&#…

Instrumentation框架分析及其使用

本文旨在从Android系统源码出发,简单梳理Instrumentation框架的行为及逻辑结构,供有兴趣的同学一起学习 从am instrument谈起 am instrument命令的执行 我们知道,命令行运行Android测试的命令是adb shell am instrument,这个命令是如何调起我们的测试代码来进行测试的呢,…

android.app.instrumentation解析

已经在Android SDK中学习了很多关于JUnit的内容&#xff0c;但是感觉一直有几个问题没有解决&#xff08;不知道大家是否有同样的感受&#xff09;JUnit的测试都自动化的&#xff0c;完全是不需要任何操作的&#xff0c;有2个问题我一直都还没有找到答案&#xff0c;这2个问题如…