模拟退火(simulated annealing)算法详解

模拟退火算法来源于固体退火原理,得益于材料统计力学的研究成果,并且该算法也是一种基于概率的算法。该算法主要用于求解最优解问题,如巡航问题、函数极值等。
在材料统计力学中,材料中的粒子的不同结构对应粒子的不同能量水平,高温条件下粒子能量高,可以自由运动和重新排列;低温条件下粒子能量低。如果从高温开始缓慢降温(即退火),粒子就可以在每个温度下达到热平衡。当系统完全被冷却时,最终形成低能状态晶体。

算法原理
设材料在状态i的能量为E(i),那么材料在温度T时从状态i进入状态j的规律如下:
(1)如果E(j)<=E(i):接受该状态j
(2)如果E(j)>E(i),则以以下概率被接受。其中K是玻尔兹曼常数,算法中我们通常让K=1。T是材料温度,算法中我们通常设初始温度T=1。

当温度降至很低时,我们认为材料以很大概率进入能量最小状态。

算法流程
(1)选任一状态s0作为初始解s(0)=s0,设初始温度为T0,T0可以是1;设终止温度e,可以让e=0.1^30;设降温速度alpha,可以是0.999,迭代次数M,迭代次数,次数足够就可以,初始时i=0。
(2)i=0时当前解s(0)=s0,T0=1。每次迭代后T(i)=alpha*T(i-1)。并且按照某一规定方式(例如随机产生数)产生当前解s(i)。
(3)取评价函数C

如果该式小于零,就接受s(i)作为新的解;如果大于零,就以概率:

接受s(i)作为新的解。
(4)令i=i+1,进行下一次迭代。如果i达到迭代次数M或温度T(i)已经小于最终温度e,则停止迭代。最终得到结果s(i)。

算法实现
本文以求解函数最小值为例。设函数为f(x)=x^2+2*x+1。我们求函数在区间(0,10)的极小值点和极小值。

class SAA:'''模拟退火算法'''def __init__(self,T=1,e=0.1**30,alpha=0.999,M=5000):self.T=T #初始温度,这里设为1self.e=e #终止温度,这里设为0.1*830self.alpha=alpha #alpha为降温速度self.M=M #M为迭代次数,这里是5000次def f1(self,x):'''所需要求的函数'''return x**2+2*x+1def main(self):resule_list=[] #存储每次迭代后的解x1=np.random.rand()*10 #在区间0到10随机选取初始值for k in range(self.M): #迭代x=np.random.rand()*10 #随机选取新的值dx=self.f1(x)-self.f1(x1) #公式里面的C(s(i))-C(s(i-1))if dx<0:x1=x #接受新解elif dx>0:if np.exp(-dx/self.T)>=np.random.rand():x1=x #以概率接受新的解self.T*=self.alpha #降温if self.T<self.e: #判断是否降到所设定的温度breakresule_list.append(x1)return resule_list #返回每次迭代后的结果
if __name__=="__main__":SAA=SAA()result_list=SAA.main()M=range(5000)plt.plot(M,result_list,color='red')plt.plot(M,SAA.f1(np.array(result_list)),color='green')plt.show()print(result_list)

结果如下图所示:

图中红色的是x值随迭代次数的变化,绿色是函数值随迭代次数的变化。我们发现迭代3000次之后结果趋于稳定。函数达到最小值,而红色的极小值点也趋近于1。如果我们把区间扩大,比如把-1包含进去,那么最小值就将趋近于0,极小值点趋近于-1。。

总结
模拟退火算法相对其它算法而言比较容易实现,理论上该算法具有概率的全局优化性能,可以趋于全局最优,并且在诸多领域得到广泛应用,如机器学习、神经网络、信号处理等。使用的时候需要学会灵活使用其中的参数。例如:温度下降过快,就不一定得到最优解,下降过慢又会增加运行时间,终止温度也不宜过高或过低,迭代次数适当等等。

模拟退火(simulated annealing)算法详解相关推荐

  1. python模拟退火(Simulated Annealing)参数寻优实战

    python模拟退火(Simulated Annealing)参数寻优实战 目录 python模拟退火(Simulated Annealing)参数寻优实战 模拟退火 模拟退火算法流程

  2. 神经网络算法详解 04:反馈神经网络(Hopfield、BAM、BM、RBM)

    本文介绍了反馈神经网络,包括Hopfield网络,离散Hopfield网络(DHNN),连续Hopfield网络(CHNN),双向联想记忆网络(BAM),玻尔兹曼机(BM),受限玻尔兹曼机(RBM). ...

  3. YOLOv4算法详解

    YOLOv4: Optimal Speed and Accuracy of Object Detection-论文链接-代码链接 目录 1.需求解读 2.YOLOv4算法简介 3.YOLOv4算法详解 ...

  4. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  5. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  6. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  7. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  8. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  9. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

最新文章

  1. 如何快速打造高性能对话式AI?这个NLP公开课带你从入门到进阶,快来报名
  2. 多目标跟踪2021总结
  3. Error 200 fault:SOAP-ENV:Client [no subcode]
  4. MVC中跳转到其他页面,并传参数
  5. 关于MUI框架中,“侧滑导航“之“div模式下拉菜单“的a标签(超链接)的失效问题?
  6. xml转excel(Office XML转excel)
  7. Linux下opengl性能更高,OpenGL超级宝典学习笔记——性能比较
  8. pert计算公式期望值_PERT方法:用于计算各工序和工时的方法
  9. 用于黑客渗透测试的 21 个最佳 Kali Linux 工具
  10. 个人朋友圈时代过去了,企业微信朋友圈开辟营销新思路
  11. 小说精品屋web+安卓ap+微信小程序动漫小说源码
  12. 计算机高级筛选在哪找,excel表格数据高级筛选在哪里-EXCEL高级筛选
  13. Docker基础30--6.4 Docker三剑客之Swarm
  14. 奇安信VS启明星辰 欲上市“新人”与上市“老手”的全面对比
  15. 朴素贝叶斯(演示结果与SVM进行对比)
  16. MODBUS-RS485布线的8条准则
  17. conda安装新环境
  18. 双连通图强连通图概念解释以及tarjan算法求解该类问题总结
  19. 线状图斑的平均宽计算
  20. 混响效果的主要参数及工作原理

热门文章

  1. 01-KNN(K最临近算法)中涉及到的一些小知识点
  2. Window中使用copy.exe合并多个iso镜像文件到一个iso文件
  3. Service简单介绍
  4. 有些事现在不做,一辈子都不会做了。
  5. eclipse中green UML 自动生成类图
  6. 如何在官网下载并安装STM32CubeMX
  7. 星秒雷达获得UL和TUV认证
  8. 韩顺平网页设计第二十九三十讲
  9. WordPress主题开发:主题初始化
  10. 同一个按钮点击多次不同效果_教大家如何用狸窝视频转换器一次性截取多次片段并保存起来...