あいさか たいがblogAisaka_Taiga的博客
//https://img2018.cnblogs.com/blog/1646268/201908/1646268-20190806114008215-138720377.jpg

模拟退火

Toretto·2023-05-29 11:34·50 次阅读

模拟退火

模拟退火

模拟退火是一种随机化算法,当一个问题的方案数极大(甚至是无穷的)而且不是一个单峰函数的时候,我们可以考虑用模拟退火来解决,当然这只能给我们骗更多的分,想通过的话有一定的难度。

优点#

根据爬山算法的过程,我们发现,爬山算法只能看到当前的最优解,而如果后面又有更优的解,爬山算法是找不到这个解的,也就是说爬山算法只适用于成单峰函数的题目。

模拟退火是有一定的概率从当前的点跳到另一个点,这赋予了他能够有一定概率得到最优解。

退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。目的是降低硬度,改善切削加工性;消除残余应力,稳定尺寸,减少变形与裂纹倾向;细化晶粒,调整组织,消除组织缺陷。准确的说,退火是一种对材料的热处理工艺,包括金属材料、非金属材料。而且新材料的退火目的也与传统金属退火存在异同。

---------百度百科

于是我们可以去模拟这个过程,将目标函数作为能量函数。

过程#

如果新状态的解更优则修改答案,否则以一定概率接受新状态。

我们先定义当前温度为 T,新状态与已知状态(由已知状态通过随机的方式得到)之间的能量差为 ΔE (ΔE0),则发生状态转移(修改最优解)的概率为

P(ΔE)={1新状态更优eΔET新状态更劣

可以看到我们是有一定概率接受更劣的状态的。

注意:我们有时为了使得到的解更有质量,会在模拟退火结束后,以当前温度在得到的解附近多次随机状态,尝试得到更优的解。

如何退火?#

模拟退火时我们有三个参数:初始温度 T0,降温系数 d,终止温度 Tk。其中 T0 是一个比较大的数,d 是一个非常接近 1 但是小于 1 的数,Tk 是一个接近 0 的正数。

首先让温度 T=T0,然后按照上述步骤进行一次转移尝试,再让 T=d×T。当 T<Tk 时模拟退火过程结束,当前最优解即为最终的最优解。

注意为了使得解更为精确,我们通常不直接取当前解作为答案,而是在退火过程中维护遇到的所有解的最优值。

引用一张 Wiki - Simulated annealing 的图片(随着温度的降低,跳跃越来越不随机,最优解也越来越稳定)。

image

卡时#

有一个 clock() 函数,返回程序运行时间。

可以把主程序中的 simulat eAnneal(); 换成 while ((double)clock()/CLOCKS_PER_SEC < MAX_TIME) simulateAnneal();。这样子就会一直跑模拟退火,直到用时即将超过时间限制。

这里的 MAX_TIME 是一个自定义的略小于时限的数(单位:秒)。

posted @   北烛青澜  阅读(50)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
目录