【算法】模拟退火算法(SAA,Simulated Annealing Algorithm)

模拟退火算法(SAA)简介

模拟退火算法(SAA,Simulated Annealing Algorithm)的灵感来源于工艺铸造流程中的退火处理,随着铸造温度升高,分子运动趋于无序,徐徐冷却后,分子运动趋于有序。这是一种基于概率突跳特性(取决于温度状态)的算法,在解空间中概率寻找(或趋近于)最优解。它是跳出局部最优解的一个常用解决办法。在超大规模集成电路(Very Large Scale Integration Circuit,VLSI)、神经网计算机、计算机视觉、TSP和Knapsack问题等有重要且广泛的应用。

模拟退火算法采用了串行结构。

SAA步骤

模拟退火算法的三要素是解空间,目标函数和初始解。它的基本思想是:

  1. 初始化
    首先确定一个初始温度T,初始解状态S,每个T值的迭代次数L。
  2. 迭代
    在1-L次数中做这些操作:(2)
    产生新解S’。
    计算温度增量△t’=C(S’)-C(S)。(C(S)为评估函数)
    若Δt′<0则接受S′作为新的当前解,否则以概率exp(-Δt′/(KT))接受S′作为新的当前解(k为波尔兹曼常数)
    如果终止条件已经满足,则接受当前解作为最优解,并停止迭代计算。如果不是,则继续。
    T逐渐减少,且t趋近于0,则转到2.迭代。(1)
      在这里插入图片描述

SAA原理

模拟退火算法包含两个部分,即Metropolis和退火过程,分别对应着内循环和外循环。外循环将固体加热至较高的温度(初始温度T0),然后按照降温系数alpha使温度按照一定的比例下降,当达到终止温度Tf时,冷却结束,退火过程结束,对应上述的(1)过程。

Metropolis算法是内循环,即在每次更新的温度下迭代L次,并寻找该温度下能量的最小值(最优解)。对应的是上述的(2)过程。

用能量变化来解释模拟退火算法接受新解的情况:

Metropolis准则:
1953年提出。若在温度T时,由状态i转变为状态j,那么若Ej<Ei,则接受j状态为新状态。否则,进入新一轮判断:若概率P=exp(-(Ej-Ei)/KT)大于[0,1]区间的随机数,则接受j为新状态;若不成立,则保留i为新状态。
Metropolis算法是退火算法的基础,同样是在局部最优中选取全局最优。

在“退火”过程中,铸件徐徐冷却,分子运动趋于有序,每个分子都趋于平衡态,最终温度下降到常温时,达到基态,内能减为最小,能量减小原子趋于稳定。

在一定的某温度 T 0 T_0 T0下,存在状态变换(由一个波谷变化至下一个波谷),那么如果下一个波谷能量 E ( n + 1 ) E(n+1) E(n+1)大于原先的 E ( n ) E(n) E(n),就接受它成为新解,否则进入判断,设置一个概率P:

P = { 1 E ( n + 1 ) < E ( n ) e − ( E ( n + 1 ) − E ( n ) ) / T E(n+1)≥E(n) P= \begin{cases} \displaystyle1 & E(n+1)<E(n)\\e^{-(E(n+1)-E(n))/T} & \text{E(n+1)≥E(n)} \end{cases} P={1e(E(n+1)E(n))/TE(n+1)<E(n)E(n+1)≥E(n)

退火过程由冷却温度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件Tf。

在这里插入图片描述
接受状态的三条原则:

(1)在固定温度下,接受使目标函数下降的候选解的概率 > > >使目标函数上升的候选解概率;

(2)随着温度的下降,接受使目标函数上升的解的概率要逐渐减小;

(3)当温度趋于零时,只能接受目标函数下降的解。

可见参数的选择控制构成了模拟退火算法的重点和创新点。

SAA的参数选择控制

  1. 选择足够高的初始温度 T 0 T_0 T0意味着有更多的选择可以被触及,也就更接近全局最优解。
  2. 指数式下降的温度下降方式尤为便捷,而且收敛速度较慢。
  3. 终止温度的选取。

SAA的改进方向

模拟退火算法的缺点:

  1. 收敛速度慢
  2. 优化解和运行时间存在一定矛盾
  3. 难以判断是否达到最终平衡态

目前,已有一些高效的改进方案,比如并行模拟退火算法、快速模拟退火算法等。

改进的可行方案 :
采用并行搜索结构,并改进状态产生函数,改进退火历程,增加新的环节,例如增加升温/重升温过程,增加补充搜索过程,增加多次搜索策略等。

SAA简单应用实例

用模拟退火算法求解 f ( x ) = x 2 f(x)=x^2 f(x)=x2的最小值:

import math  
import random  def simulated_annealing():  # 初始化  x = 20*(random.random()-0.5)  # 初始解  T = 1000  # 初始温度  T_min = 1e-3  # 温度下限,当T小于此值时,停止迭代  alpha = 0.99  # 温度衰减系数  y = x**2  # 初始解的质量  while T > T_min:  # 在当前解附近随机选择一个新解  delta_x = (random.random()-0.5)  new_x = x + delta_x  new_y = new_x**2  # Metropolis准则:若新解比旧解好,或者根据概率接受不良解,以避免陷入局部最小值  if new_y < y:  x = new_x  y = new_y  else:  p = math.exp((y - new_y) / T)  if random.random() < p:  x = new_x  y = new_y  # 降温  T *= alpha  return x, y  if __name__ == "__main__":  x, y = simulated_annealing()  print(f"最优解: x = {x}, y = {y}")

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

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

相关文章

ES6初步了解Symbol的用法

ES6中为我们新增了一个原始数据类型Symbol&#xff0c;让我为大家介绍一下吧&#xff01; Symbol它表示是独一无二的值 Symbol要如何创建 第一种创建方式&#xff1a; let sy Symbol()第二种创建方式&#xff1a; let sy Symbol.for()具体独一无二在哪呢&#xff1f;它们的地…

几道面试题记录20231023

1, JVM优化 -Xms-Xmx -Xmn -Xss -XX:PermSize -XX:MaxPermSize -NewRatio -SuvriorRatio 收集器配置&#xff1a; 一般&#xff1a;串行收集 Serial 吞吐优先&#xff1a;并行收集Pramllel 响应优先&#xff1a;并发收集Conc 2,支付掉单如何解决&#xff1f; 因为网络等原…

Docker安装MariaDB

Docker安装MariaDB 1 docker search mariadb 搜索mariadb镜像&#xff08;非必须&#xff09; 2 docker pull mariadb 下载docker镜像 3 docker images 查看本地已有的所有镜像 4 mkdir -p /data/mariadb/data 建一个目录作为和容器的映射目录 5 docker run --name mariadb…

Python11-正则表达式

Python11-正则表达式 1.正则表达式简介2.正则表达式常见用法和符号3.正则查找4.re.Match对象与group5.re.compile6.正则表达式修饰符7.正则匹配规则8.正则表达式匹配练习9.正则替换10.贪婪模式和非贪婪模式 1.正则表达式简介 正则表达式&#xff08;Regular Expression&#x…

JS-文件下载,实现在ios也是下载 而不是预览,

需求 通过A链接的方式&#xff0c;把从后台获取到的文件下载到本地&#xff0c;实现在移动端,PC端都能下载 问题 通过ajax请求后端生成的文件流之后&#xff0c;创建BLOB文件进行下载&#xff0c;在PC端和移动安卓端都可以实现下载到本地和对应的手机&#xff0c;而在IOS端的…

开源思维导图白板工具

https://okso.app https://drawio.com https://tldraw.com https://excalidraw.com

18 Transformer 的动态流程

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from333.1007.0.0 b 站直接看 配套 github 链接&#xff1a;https://github.com/nickchen121/Pre-training-language-model 配套博客链接&#xff1a;https://www.cnblogs.com/nickchen121/p/15105048.html 机…

npm install 报node-sass command failed

一、前言 最近在前端项目Vue项目install时会出现node-sass command failed的错误&#xff0c;原因是NodeJS和node-sass的版本不对应导致的&#xff0c;本文将给出解决方案。 二、解决方案 以下是NodeJS和node-sass版本的对照关系&#xff1a;

【Linux Screen命令】Linux用户注销后可长时间运行的命令行

1. 使用情境 你有没有这样的经历&#xff1a;你有一台远程计算机&#xff0c;并在上面执行长时间运行的任务&#xff0c;突然连接断开&#xff0c;SSH 会话终止&#xff0c;而导致你的工作进度丢失。 幸运的是&#xff0c;有一个名为 Screen 的实用程序可以让我们持续会话。甚…

C++前缀和算法的应用:摘水果 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 在一个无限的 x 坐标轴上&#xff0c;有许多水果分布在其中某些位置。给你一个二维整数数组 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共…

代码随想录 | Day63 总结篇

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 代码随想录刷题总结 代码随想录刷题总结 这应该是我第一次完整的刷完一本书&#xff0c;以前最多刷到树就会有畏惧和退缩心理&#xff0c;这次报名了卡哥的训练营&…

1221. 四平方和--(暴力,二分)

题目&#xff1a; 1221. 四平方和 - AcWing题库 思路1&#xff1a;暴力 暴力枚举 1.枚举顺序为从a到c&#xff0c;依次增大。 2.tn-a*a-b*b-c*c&#xff0c;求得dsqrt(t) 3.判断求出的d是否成立。d要求&#xff1a;d*dt&&d>c #include<iostream> #include&…

pytorch实战---IMDB情感分析

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

原始航片匀色调色方法

使用PhotoRC 2.0软件&#xff0c;对原始航片进行批量匀色&#xff0c;可以自动处理和人机交互&#xff0c;保留exif信息。 软件下载链接&#xff1a; https://pan.baidu.com/s/1Jj4cMpq8xzYvSa1hhozH-g?pwdndfm 提取码&#xff1a;ndfm

知识点滴 - Email地址不区分大小写

电子邮件地址本身对字符大小写不敏感。这意味着实际的电子邮件地址&#xff0c;如 "exampleemail.com"&#xff0c;并不区分字母的大小写。无论你输入的是大写字母还是小写字母&#xff0c;它仍然会到达同一个电子邮件账户。例如&#xff0c;如果您的电子邮件地址是 …

Linux 用户必备的 Git 图形化工具

Git 是一个免费的开源分布式版本控制系统&#xff0c;用于软件开发和其他几个版本控制任务。它旨在根据速度、效率和数据完整性来处理从小到大的项目。 Linux 用户主要可以通过命令行管理 Git&#xff0c;但是&#xff0c;有几个图形用户界面 (GUI) Git 客户端可以促进在 Linux…

DevOps持续集成-Jenkins(3)

文章目录 DevOpsDevOps概述Jenkins实战3&#xff1a;实战1和实战2的加强版&#xff08;新增SonarQube和Harbor&#xff09;⭐环境准备⭐项目架构图对比Jenkins实战1和实战2&#xff0c;新增内容有哪些&#xff1f;SonarQube教程采用Docker安装SonarQube &#xff08;在Jenkins所…

linux-防火墙

目录 一、防火墙概念 1.软件防火墙 2.iptables默认规则 3.iptables的五链 4.iptables动作 5.四表五链 6.iptables实例 一、防火墙概念 linux下防火墙一般分为软件防火墙、硬件防火墙 硬件防火墙&#xff1a;在硬件的级别实现防火墙过滤功能&#xff0c;性能高&#xf…

实践小记—静态成员的使用注意(或许由此产生的不知名Bug)

序言 在实际生产过程中&#xff0c;为了便于调用&#xff0c;static修饰的成员会比较容易出现。 如果后期该变量并不会被修改&#xff0c;可以考虑使用。但如果后期需要被修改&#xff0c;使用该变量修饰符则需要慎重考虑。 尤其是在对硬件控制的实际生产中&#xff0c;更需…

依据《中华人民共和国教育法》,以作弊、剽窃、抄袭等欺诈行为或者其他不正当手段获得学位证书、学历证书或者其他学业证书的,由( )撤销相关证书。

需要查看详细试题题库及其参考答案的&#xff0c;请到&#xff08;题海舟&#xff09;里进行搜索查看。可搜试题题干或者搜索关键词&#xff0c;搜题的时候&#xff0c;先进行题目识别&#xff0c;能大大提高学习效率&#xff0c;感谢使用&#xff01; 截取几个关键字查&#…