模拟退火(simulated annealing)算法详解
模拟退火(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)算法详解相关推荐
- python模拟退火(Simulated Annealing)参数寻优实战
python模拟退火(Simulated Annealing)参数寻优实战 目录 python模拟退火(Simulated Annealing)参数寻优实战 模拟退火 模拟退火算法流程
- 神经网络算法详解 04:反馈神经网络(Hopfield、BAM、BM、RBM)
本文介绍了反馈神经网络,包括Hopfield网络,离散Hopfield网络(DHNN),连续Hopfield网络(CHNN),双向联想记忆网络(BAM),玻尔兹曼机(BM),受限玻尔兹曼机(RBM). ...
- YOLOv4算法详解
YOLOv4: Optimal Speed and Accuracy of Object Detection-论文链接-代码链接 目录 1.需求解读 2.YOLOv4算法简介 3.YOLOv4算法详解 ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- C++中的STL算法详解
1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...
- 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码
粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...
- 基础排序算法详解与优化
文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...
- 目标检测 RCNN算法详解
原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...
最新文章
- 如何快速打造高性能对话式AI?这个NLP公开课带你从入门到进阶,快来报名
- 多目标跟踪2021总结
- Error 200 fault:SOAP-ENV:Client [no subcode]
- MVC中跳转到其他页面,并传参数
- 关于MUI框架中,“侧滑导航“之“div模式下拉菜单“的a标签(超链接)的失效问题?
- xml转excel(Office XML转excel)
- Linux下opengl性能更高,OpenGL超级宝典学习笔记——性能比较
- pert计算公式期望值_PERT方法:用于计算各工序和工时的方法
- 用于黑客渗透测试的 21 个最佳 Kali Linux 工具
- 个人朋友圈时代过去了,企业微信朋友圈开辟营销新思路
- 小说精品屋web+安卓ap+微信小程序动漫小说源码
- 计算机高级筛选在哪找,excel表格数据高级筛选在哪里-EXCEL高级筛选
- Docker基础30--6.4 Docker三剑客之Swarm
- 奇安信VS启明星辰 欲上市“新人”与上市“老手”的全面对比
- 朴素贝叶斯(演示结果与SVM进行对比)
- MODBUS-RS485布线的8条准则
- conda安装新环境
- 双连通图强连通图概念解释以及tarjan算法求解该类问题总结
- 线状图斑的平均宽计算
- 混响效果的主要参数及工作原理