模拟退火算法(SA)

article/2025/9/21 0:19:31

一、算法简介

模拟退火算法(SA)

一种模拟物理退火过程而设计的优化算法
初始处于一个高温状态下,然后逐渐退火,在每个温度下慢慢冷却,最终达到物理基态(相当于算法找到最优解)
求解TSP问题(旅行商问题)、最值问题、全局优化、生产调度、控制工程、机器学习、信号处理等

爬山算法(贪心算法):对问题求解时,总是做出当前看起来是最好的选择,不考虑整体最优,得到的一般是局部最优解。

模拟退火算法:也是贪心算法,但是在其过程中引入了随机因素,以一定的概率接受一个比当前解还要的解。

模拟退火算法在某一初温下,伴随温数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解。即:在局部最优解的空间内能概率性地调处并最终区域全局最优。

概率突跳特性:不再局限于局部最优

二、算法流程

1. 设定当前解(即为当前最优解):令 T=T0 ,即开始退火的初始温度,随机生成一个初始解x0,并计算相应的目标函数值E(x0)

2. 产生新解与当前解的差值:根据当前解xi进行扰动,产生一个新解xj,计算相应的目标函数值E(xj),得到△E=E(xj) - E(xi)

3.判断新解是否被接受:若△E<0,则新解xj被接受;若△E>0,则新解xj按如下概率被接受。Ti 是当前温度。

请添加图片描述

4. 当新解被接受时:新解xj被当做当前解

5. 循环以上四个步骤:在温度Ti下,重复k次的扰动和接受过程,接着执行下一步骤

6. 最后找到全局最优解:判断T是否已经达到终止温度Tf ,若是,则终止算法;若否,则转到循环步骤继续执行。

三、算法流程图

求解最小值

请添加图片描述

1. metropolis 准则:

在某个温度下,固体分子从一个状态转移到另一个状态时,如果新状态的内能小,则无条件接受;若新状态的内能大,则以一定的概率接受它。

请添加图片描述

if △E<0 :    xi=xj;
elif exp(-△E/T)>rand() :  #按概率接受xi=xj;

2. 马尔科夫链的长度Lk:任意温度的迭代次数

算法在Lk内持续进行“产生新解–判断–接受/舍弃”的迭代过程,对应着固体在某一恒定温度下趋于热平衡的过程。一般选取Lk=100N,N为问题的规模。

3. 控制参数T的终止值 Tf (停止准则)

最终温度通常是0,但会消耗许多模拟时间。温度趋近于0,其周围状态几乎一样。所以寻找一个低到可接受的温度即可(T>0.001)。

4. 控制温度T的衰减函数

不同退火方法的温度下降速度是不一样的,其中指数降温是最常用的一种退火策略,其温度变化很有规律,直接与参数相关,是研究的主要对象。

衰减函数:t(k+1) = αt(k) k = 0,1,2…

其中α是一个接近1的常数,一般取 0.5 ~ 0.99

该衰减函数对控制参数的衰减量是随算法进程递减的。

四、模拟算法优缺点

优点:高效地求解NP完全问题(多项式复杂程度的非确定性问题),如TSP问题、0-1背包问题等。编程工作量小,易于实现。

缺点:使用不当,可能会陷入局部最优。参数难以控制,所得结果可能为接近最优解但并非最优解。

五、例题

TSP问题

一位旅行者从一个出发点出发,要求经过31个城市(目标点的坐标已经给出),并且每个点只能经过一次,最终经过所有点后回到起点。要求:为旅行者制定一条最短路径。

matlab算法

C=[ 1304 2312;       %城市坐标
3639 1315;
4177 2244;
3712 1399;
3488 1535;
3326 1556;
3238 1229;
4196 1044;
4312 790;
4386 570;
3007 1970;
2562 1756;
2788 1491;
2381 1676;
1332 695;
3715 1678;
3918 2179;
4061 2370;
3780 2212;
3676 2578;
4029 2838;
4263 2931;
3429 1980;
3507 2376;
3394 2643;
3439 3201;
2935 3240;
3140 3550;
2545 2357;
2778 2826;
2370 2975 ];   % 31个城市的坐标
n=size(C,1);     %TSP问题规模,即城市数目
T=1000;  %初始温度
L=100; %马尔科夫链长度
K=0.99; %衰减参数
%%%%%%%%%%%%%城市坐标结构体%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
city=struck([]); %结构体变量,类似于Python中的
for i=1:ncity(i).x = C(i,1);city(i).y = C(i,2);
end       %city(i) 的值为第i座城市的坐标
l=1;   %统计迭代次数
len(1) = func3(city , n);   %每次迭代后的路线长度
while T>0.001   %0.001为终止温度
%%%%%%%%%多次迭代扰动,温度降低之前多次试验%%%%%%%%%%%%for i=1:L%%%%%%%%%%%%%计算原路线总距离%%%%%%%%%%%%%%%%len1=func3(city,n);%%%%%%%%%%%%%%产生随机扰动%%%%%%%%%%%%%%%%%%%%%%%%%%随机置换两个不同城市的坐标%%%%%%%%%p1=floor(1+n*rand());   %朝负无穷方向取整(向下取整)p2=floor(1+n*rand());  while p1==p2p1=floor(1+n*rand());p2=floor(1+n*rand());endtmp_city=city;tmp=tmp_city(p1);tmp_city(p1)=tmp_city(p2);tmp_city(p2)=tmp;%%%%%%%%%%%%计算新路线总距离%%%%%%%%%%%%%%%%len2=func3(tmp_city,n);%%%%%%%%%%%%新老距离的差值,相当于能量%%%%%%%%%%delta_e=len2-len1;%%%%%%%%%%%%判断是否用新路线替换就路线%%%%%%%%%%if delta_e<0city=tmp_city;else%%%%%%%%以概率选择是否接受新解%%%%%%%%%%%%%%%%if exp(-delta_e/T)>rand()city=tmp_city;endendendl=l+1;%%%%%%%%计算新路线距离%%%%%%%%%%%%%len(1)=func3(city,n);%%%%%%%%温度不断下降%%%%%%%%%%%%%%T=T*K;  %K就是衰减系数α
end

步骤

1)初始化:初始温度、初始新解
2)添加随机扰动,产生新解
3)比较能量差,判断新解是否接受
4)如果接受,并且迭代没有结束,继续产生新解,重复 2),3)
5)判断是否达到终止条件,如果没有则降低温度,重新产生新解,再次进入循环


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

相关文章

模拟退火算法(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;每个接口是一个单独的冲突域…

冲突域和碰撞域的理解

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

如何计算冲突域和广播域-图解分析

如何理解冲突域和广播域?冲突域:【定义】在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。【分层】基于OSI的第一层(数据链路层)物理层【设备】第二层设备能隔离冲突域,比如Switch。交换机能缩小冲突域的范围,交…

有关冲突域的定义

一开始学习网络的时候&#xff0c;对于冲突域和广播域的理解仅仅是从设备上进行理解的&#xff0c;即集线器是一个冲突域&#xff0c;交换机能够分离冲突域&#xff0c;不能够分离广播域&#xff0c;路由器可以分离组播域。至于冲突域到底是什么&#xff0c;怎么样定义的&#…

如何辨别数清冲突域和广播域

1、首先&#xff0c;须知第一层不能隔离冲突域和广播域。例如集线器或者直接连PC 2、其次&#xff0c;第二层可以隔离冲突域&#xff0c;但不能隔离广播域。例如&#xff0c;二层交换机 3、接着&#xff0c;第三层可以隔离广播域&#xff0c;默认隔离冲突域&#xff0c;例如&…

详解广播域和冲突域的区别

总览 1、广播域可以跨网段&#xff0c;而冲突域只是发生的同一个网段的。以太网中&#xff0c;冲突域是由hub组织的。一个hub就是一个冲突域。交换机的每个端口都是一个冲突域。网段&#xff0c;又叫潜在冲突域。 2、冲突域在同一个冲突域中的每一个节点都能收到所有被发送的…