模拟退火算法详细说明

article/2025/9/21 0:01:28

来源:固体退火。一种处理工艺:将金属缓慢加热到一定程度,保持足够的时间,然后以适宜的速度冷却。退火后的金属具有了新的属性降低硬度等。

一、爬山算法

1.爬山算法是一种局部择优的方法,是一种局部贪心的最优算法。采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。 

2.主要思想
(1)随机选择一个登山的起点;
(2)每次拿相邻点与当前点进行比对,取两者中较优者,作为爬坡的下一步;
(3)重复第2步,直至该点的邻近点中不再有比其大的点;选择该点作为本次爬山的顶点,即为该算法获得的最优解。

实现简单,但存在缺陷,它可以搜索到局部最优解,不一定是全局最优解,如图:

 当前解是C点,那么做一个局部搜索(寻找最大值),从G点搜索,可能会找到D点,但当我们去观看上图发现它最终寻找的点并不是全局最优解。这就是它的缺陷但是呢模拟退火就改善了这个缺陷。

二、模拟退火

模拟退火机制在一定程度上避免陷入局部最优解,与爬山算法不同那么它是如何改变的呢?在局部搜索即使找到一个比当前解较差的解,也会以一定的概率跳到这个解上。

那就是Metropolis准则,公式如下:

代表t+1时刻的内能:Et+1,(可以理解为函数值 ,在进行优化搜索的时候我们一般找最小值为标准)那么这个准则,当下一个时刻的函数值比这个时刻的小,它跳出当前值的概率为1,亮点在当下一个时候内能比此时刻大的时候它并没有立即拒绝而是以一定的概率进行选择,我们也会发现相差越多,概率越小。此外接受新解的概率还受到降温系数和初始温度T的影响。温度的作用就是来计算转移概率P的。当温度每次下降后,转移概率也发生变化,因此在所有温度下迭代L次的结果也都是不相同的。在每个温度下迭代L次来寻找当前温度下的最优解,然后降低温度继续寻找,直到到达终止温度,即转移概率P接近于0.

接受状态的三条原则:

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

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

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

三、模拟退火的流程 

大概的来讲分为升温过程、降温过程:内循环(分子在每个温度内达到的平衡)、外循环(温度降到最终温度)。

步骤为:

1.开始给定相对较高的初始温度T,产生初始解X0(可以采用随机产生),计算对应的目标函数值E(X0)。

2.令T=kT,其中k的范围是(0—1)的值,为温度下降系数。

3.对当前解Xt做随机扰动,在其领域内产生一个新解X(t+1),计算对应函数值,根据蒙特卡洛准则进行判断是否接受新解。

4.在温度T下,迭代L次扰动和接受过程。

5.判断是否达到终止温度。若达到,则终止,否则步骤二。如图(画的有些丑,但意思没错):

6.实例

f(x)=4*x1^2-2*x1^4+x1^6/3+x1*x2-4*x2^2+4*x2^2,|xi|<5.最优解。

 1.导包设置参数

import math
from random import random
import matplotlib.pyplot as pltdef func(x, y):                  #函数优化问题res= 4*x**2-2*x**4+x**6/3+x*y-4*y**2+4*y**4return res
T0=100#初始温度
Tf=1#终止温度
alpha=0.98#降温系数
l=100#内循环迭代次数
T=T0#当前温度
#自变量取值
x = [random() * 11 -5  for i in range(l)] #随机生成100个x的值范围[-5,5]
y = [random() * 11 -5  for i in range(l)] #随机生成100个y的值范围[-5,5],y表示x2

2.设置扰动

 def generate_new(func, x, y):   #扰动产生新解的过程while True:x_new = x + T * (random() - random())y_new = y + T * (random() - random())if (-5 <= x_new <= 5) & (-5 <= y_new <= 5):  break                                  #重复得到新解,直到产生的新解满足约束条件return x_new, y_new 

3.Metropolis准则

def Metrospolis(func, f, f_new):   #Metropolis准则if f_new <= f:return 1else:p = math.exp((f - f_new) / self.T)if random() < p:return 1else:return 0

4.外循环和内循环

 count = 0#外循环迭代,当前温度小于终止温度的阈值while T > Tf:       #内循环迭代100次for i in range(l): f = func(x[i],y[i])    #f为迭代一次后的值x_new, y_new = generate_new(x[i],y[i]) #产生新解f_new = func(x_new, y_new)                        if Metrospolis(f, f_new):                         x[i] = x_new           y[i] = y_new 
#温度按照一定的比例下降(冷却)T = T * alpha        count += 1

5.结果:


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

相关文章

【算法】模拟退火

文章目录 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个问题如…

Java探针 Instrumentation

背景&#xff1a;假如我们想打印出某些系统->某些类->某些方法的执行耗时&#xff0c;方式有很多&#xff0c;但是想要无侵入的做到这一点&#xff0c;只有Java探针一种方式。这也是很多调用链系统依赖的技术基础。 什么是Java探针 通俗来讲&#xff0c;就是Java提供的一…

opentelemetry-java-instrumentation翻译

原文地址&#xff1a;原文 OpenTelemetry Instrumentation for Java 这个项目提供了一个Java agent JAR&#xff0c;这个jar可以attached to任何Java8的应用上&#xff0c;动态地注入&#xff08;inject&#xff09;字节码从大量的流行库和框架&#xff08;popular libraries …

Instrument

使用Instruments 里面的Automation&#xff0c;可以对iOS进行自动化测试。 参考这篇文章&#xff1a;http://www.codeproject.com/KB/iPhone/UI_Automation_Testing.aspx 我用的是xcode4.2。 在这里下载修改好的项目&#xff0c;xcode4.2下用的&#xff1a;http://download.csd…

android Instrumentation

Android提供了一系列强大的测试工具&#xff0c;它针对Android的环境&#xff0c;扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程&#xff0c;但Android工具允许你为应用程序的各个方面进行更为复杂的测试&#xff0c;包括单元层面及框架层面。 Android测…

Instrumentation 应用简介

引用&#xff1a; java-instrumentation 引用&#xff1a;Instrumentation 新功能 简介 java Instrumentation指的是可以用独立于应用程序之外的代理&#xff08;agent&#xff09;程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态&#…

AndroidStudio单元测试——instrumentation

前言&#xff1a;这几天老大要我搞代码自动测试&#xff0c;eclispe的已经解决了&#xff0c;可他们都是用android studio&#xff0c;所以要在android studio 上重新试验&#xff0c;这个有难度啊&#xff0c;android studio国内资料极少&#xff0c;更不要说单元测试了。goog…

Android Instrumentation 简介

Instrumentation 简介 APIs && Source code 官方APIs地址(需要翻墙)Source code Instrumentation 特点 该框架基于JUnit&#xff0c;因此既可以直接使用Junit 进行测试&#xff0c;也可以使用Instrumentation 来测试Android 组件其为Android 应用的每种组件提供了测…

冲突域和广播域?

如何理解冲突域和广播域&#xff1f; 冲突域&#xff1a; 【定义】在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。 【分层】基于OSI的第一层物理层 【设备】第二层设备能隔离冲突域&#xff0c;比如Switch。交…

广播域与冲突域

广播域与冲突域 一个集线器&#xff08;中继器&#xff09;连接的网络成为冲突域&#xff0c;因为每台主机都连接在了同一条线路上&#xff0c;所以传送信息时会冲突。 冲突域是基于第一层(物理层) 而交换机的本质是一个多借口网桥&#xff0c;就是说由交换机组成的网络中&…

冲突域广播域

网络互连设备可以将网络划分为不同的冲突域、广播域。但是&#xff0c;由于不同的网络互连设备可能工作在OSI模型的不同层次上。因此&#xff0c;它们划分冲突域、广播域的效果也就各不相同。如中继器工作在物理层&#xff0c;网桥和交换机工作在数据链路层&#xff0c;路由器工…

广播域和冲突域问题

该图中有几个冲突域几个广播域&#xff1f; 解答&#xff1a; 1、两个广播域&#xff0c;七个冲突域。 这样的&#xff1a;集线器属于物理层&#xff0c;所有接口同属于一个冲突域、一个广播域&#xff1b;交换机属于数据链路层&#xff0c;每个接口是一个单独的冲突域…