模拟退火算法的优化

article/2025/9/20 23:25:35

优化模拟退火算法

作为现代算法的一种,模拟退火算法是一种用降低搜索的覆盖面积来提高运算速度的算法,适用于解决各种优化类问题。它利用了物理学中一个常见的原理:当物体具有一定的温度时,假设它内部含有的能量为E(I),那么物体从I状态进入J状态符合以下规则:
若E(i)>E(j),则该状态改变被接受。
若E(i)<E(j),则该状态有e^((E(i)-E(j))/KT)的概率被接受。
在进行了充分的转换后材料将达到热平衡。这时候材料处于状态i的概率为在这里插入图片描述

通过对概率的化简可以推导出所有状态在高温下具有相同的概率,而当温度下降的时候,材料会以很大概率进入最小能量状态。
通过对概率的化简可以推导出所有状态在高温下具有相同的概率,而当温度下降的时候,材料会以很大概率进入最小能量状态。
简单来说 ,就像是我们想去到一群山脉中的最高峰,一般来讲采用的规则是:当到达了一定高的地方,我们把它和周围的山峰进行比较,当周围的山明显比自己所处的山高时,会毫不犹豫的向哪里进发,但是有的山很难判别是否更高,所以我们有一定的概率去那里,在这种算法中,我们赋予的概率是e^((E(i)-E(j))/KT)。

举个例子
如果有一个软件,记录了我们达到的最高海拔,就比如A最高到达过这片山峰的最顶峰,那么他现在有可能在这片山脉中的任何位置,但是C最高在山脚,所以他只可能在山脚。 在这里插入图片描述
模拟退火算法的本质是一个穷举加比较的算法,通过穷举来递推函数并通过比较进行舍弃,但是很明显的它也存在问题:很多时候它对于区间的舍弃都太过粗糙,很有可能因为抽到的点数值不高而导致这一个区域被淘汰。
在学习的同时,我意识到对数值进行舍弃的目的是为了得到极大值,而得到极大值的方法除了穷举-比较-舍弃之外还有排序直接得出,但是排序的问题很明显:他会消耗很大的计算量和计算时间,但是只对局部进行排序效果肯定没有穷举比较舍弃好,所以我开始研究排序算法的优化问题。
**

排序算法的优化问题

对常用的排序算法,我们常用插入排序:每一个数都要从头开始比较一遍来找到相应的位置,这里我用分析算法来度量一个算法所用的代价,为了方便理解我用伪代码进行编写
假设对j=2,3,…,n,其中n=A.length,假设t_j表示对那个值j执行while循环测试的次数

*在这里插入图片描述
*对算法的总代价进行求和:
在这里插入图片描述

当情况最好,也就是说所有的数值都已经被排好的时候,i取j-1,t_j=1,运行的最佳时间为:T(n)=(c1+c2+c4+c5+c8)n-(c2+c4+c5+c8)
很明显的可以看出来这是一个由n决定的线性函数,但是如果数组本来是反向排列,它所需要的代价是:
(c5/2+c6/2+c7/2)n^2+(c1+c2+c4+c5/2-c6/2-c7/2+c8)n-(c2+c4+c5+c8)
这是一个关于n的二次函数。
但是平均算法往往更接近最坏的情况,所以可以认为决定排序算法代价的主要是一个二次函数,因此在考虑算法优化的时候,我们更因该先考虑最坏情况。

回到本质,我认为排序算法可以优化的地方在于有的数并没有必要比那么多次,因为只要确定它大于某一个数就可以确定比这个数之前的数都大,尤其是数据容量比较大的时候,它对程序运行代价的减少就更为明显。同时我还注意到了当n足够大的时候,〖(n-1)〗2比n2要小的很多,这就说明只要我找到一个办法让被分开的数组进行排序且这种办法的代价是一次方式,就可以对排序算法进行比较大的优化。
假设我们的数组是一堆牌,我们将牌分为俩堆排好序,这时候我们对每堆最大的进行比较,较大的放出来,继续比较,直到某一堆见底,就将剩下的一堆全部放进去。从程序上来说,这种过程进行的是重复的比较-删除-比较,如果对设计的比较好甚至可以省去循环的过程,毫无疑问这是一个一次函数。
通过简化,优化后的排序算法结构大致如下:
1.将数组分为俩组,并对每组进行排序
2.对每组的最大值进行比较,选出最大的拿出来
3.继续比较
3.1.当一个组见底后另一个组剩下的直接放入

随机算法

这种方法对于排序算法来讲是一个优化,但是回到问题本身,我们的目标是将排序算法带入模拟退火算法来进行优化,但是首先,模拟退火算法是一个优化类算法,它并没有一个特定的数值解,所以并不存在最优解一说,因此它需要的排序也并不是有限个,而是从中抽取某些来进行排序。在这里我们就要面临另外一个问题:大部分时候,我们在进行递推的时候,我们采用的都是按数轴顺序,其实这种方法就是上面我说比较粗糙的原因所在,因为很多时候值的大小和所处的数轴位置是无关的,由此来说由某一个点舍弃这一片区域并不合理,虽然说当数值比较小的时候可以肉眼观察出来,但是当数值比较大,不足以画出图的时候,我们只能相信计算机的判断,这里我想到了一种随机算法来比较适用。
我们还是用例子来说明,假如公司雇人,一共有十个应聘者,你要从中找到最优秀的,但是每一个应聘者你要现场给他答复,如果收了还要给他签约费。类比一下,你要面对十个数,找到最大值,对每一个遇到的大的数你要消耗内存把他存起来和下一个比较。
假设十个人的能力分别是1-10,分三种情况来面试

  1. 能力从低到高,最亏的方法,要付十次签约费
  2. 能力从高到底,最赚的,只要付一次就可以选到最优秀的人
  3. 乱序,随机抽,所需在俩者之间。
    确实第2种看起来是最优秀的,可是我们现实中面临的问题更多的是无序的问题(要不然也不需要算法来计算了),更何况我们并不需要取遍所有的数值。
    注意:这里随机的并不是对函数结果随机取值,而是对函数的自变量的随机取值。
    这种算法可以对模拟退火算法的哪个部分进行优化呢?我们先回顾模拟退火算法的三个步骤:
    1.给出定义域
    2.设计递推式
    3.比较
    毫无疑问第一步没有什么可以优化的空间,而优化后的排序算法可以代替第三步的比较过程,那么随机算法就是对设计递推式的优化了,具体表现在递推的时候不再是常规的时间顺序或者数轴顺序,而是利用计算机自带的伪随机算法来进行取值,这样可以充分的减少所需的代价。

遗传算法的局部优化

遗传算法和模拟退火算法一样属于近代优化算法的一种,大致上这些算法的区别在于对数值取舍比较方式不同,总的思路并没有什么巨大的变化,但是遗传算法中有一个步骤却是它独有的:变异。
变异是指选取某些结果的某个部分进行交换,这个看起来无厘头的举动。实际上却是在保证偏移程度不大的前提下扩大取值范围,举个例子:
假设正确的答案是1011001
而我们有的四个选项分别是
A.1100111 B.1000001 C.1100001 D.1111111
可以看见没有一个和正确答案很接近,但是如果对C和D的第二三四位进行所谓的变异(杂交)就可以得到1011001,同时因为本来给出的就是经过筛选的答案,所以并不会出现和正确答案越走越远的情况。
但是因为在变异算法里整体程序是按自然界的演化来进行的,所以变异可以很合适的融入进去。
之所以模拟退火算法并不适用于变异环节是因为它得到的往往是某一个解,而不是某一组解,因此也就没有所谓数据之间的演化和变异,但是前面提到的优化排序算法可以很好的解决这个问题,我们得到的解虽然在数轴上并不连续,但是是经过比较的、相对于某些解来说的优化解。这里我的思路分为俩种:

  1. 计算机性能足够的话,可以设计一个寻找这些解的共同点的算法,在寻找到共同点后对相异的部分进行交换,继续计算契合度。直到下一次递推的契合度比原来的低。
  2. 就和原本的方法一样,一定概率一定位置发生交换。这种情况很有可能没有什么显著的改变。

优化后的模拟退火算法

在进行优化后,我们从头到尾再看一遍模拟退火算法:

  1. 确定问题所处的区间/导入数值,这里并没有什么可以优化的部分
  2. 在选取自变量的时候利用电脑的伪随机来选取并算出具体结果
  3. 将得到的结果进行排序
  4. 视情况决定是否使用优化遗传算法来改变数值。
  5. 得到结果。

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

相关文章

模拟退火算法的改进

模拟退火算法的物理模型 在物理退火过程中&#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个问题如…

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…